[exodus] 01/03: Upstream 6.09

Alastair McKinstry mckinstry at moszumanska.debian.org
Wed Jul 15 11:38:51 UTC 2015


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

mckinstry pushed a commit to tag debian/dfsg.1/6.09
in repository exodus.

commit 691e5ab687b580f2ae1735112fd1907a627fbb97
Author: Alastair McKinstry <mckinstry at debian.org>
Date:   Mon May 4 08:15:56 2015 +0100

    Upstream 6.09
---
 ChangeLog                                          |  104 +
 README.NEMESIS                                     |   18 +
 exodus/CMakeLists.txt                              |   81 +
 exodus/COPYRIGHT                                   |   32 +
 exodus/DartConfig.cmake                            |   17 +
 exodus/Doxyfile                                    | 1685 +++++++
 exodus/Imakefile                                   |  101 +
 exodus/Makefile.standalone                         |  177 +
 exodus/README                                      |   84 +
 exodus/README.PYTHON                               |   19 +
 exodus/cbind/CMakeLists.txt                        |  309 ++
 exodus/cbind/include/Imakefile                     |    8 +
 exodus/cbind/include/doxygen.h                     |  286 ++
 exodus/cbind/include/exodusII.h                    | 2012 ++++++++
 exodus/cbind/include/exodusII_cfg.h                |   25 +
 exodus/cbind/include/exodusII_cfg.h.in             |   25 +
 exodus/cbind/include/exodusII_int.h                |  748 +++
 exodus/cbind/include/exodusII_par.h                |   84 +
 exodus/cbind/include/exodusII_test.h               |   54 +
 exodus/cbind/src/Imakefile                         |  330 ++
 exodus/cbind/src/Makefile.standalone               |  277 ++
 exodus/cbind/src/ex_add_attr.c                     |  251 +
 exodus/cbind/src/ex_close.c                        |  143 +
 exodus/cbind/src/ex_conv.c                         |  441 ++
 exodus/cbind/src/ex_copy.c                         |  852 ++++
 exodus/cbind/src/ex_create.c                       |  411 ++
 exodus/cbind/src/ex_create_group.c                 |   82 +
 exodus/cbind/src/ex_create_par.c                   |  410 ++
 exodus/cbind/src/ex_cvt_nodes_to_sides.c           | 1040 ++++
 exodus/cbind/src/ex_err.c                          |  141 +
 exodus/cbind/src/ex_get_all_times.c                |  115 +
 exodus/cbind/src/ex_get_attr.c                     |  163 +
 exodus/cbind/src/ex_get_attr_names.c               |  185 +
 exodus/cbind/src/ex_get_attr_param.c               |  150 +
 exodus/cbind/src/ex_get_block.c                    |  112 +
 exodus/cbind/src/ex_get_block_param.c              |  280 ++
 exodus/cbind/src/ex_get_block_params.c             |   61 +
 exodus/cbind/src/ex_get_cmap_params.c              |  426 ++
 exodus/cbind/src/ex_get_concat_node_sets.c         |  143 +
 exodus/cbind/src/ex_get_concat_sets.c              |  246 +
 .../cbind/src/ex_get_concat_side_set_node_count.c  |  642 +++
 exodus/cbind/src/ex_get_concat_side_sets.c         |   89 +
 exodus/cbind/src/ex_get_conn.c                     |  297 ++
 exodus/cbind/src/ex_get_coord.c                    |  259 +
 exodus/cbind/src/ex_get_coord_names.c              |  121 +
 exodus/cbind/src/ex_get_coordinate_frames.c        |  211 +
 exodus/cbind/src/ex_get_eb_info_global.c           |  126 +
 exodus/cbind/src/ex_get_elem_attr.c                |   73 +
 exodus/cbind/src/ex_get_elem_attr_names.c          |   61 +
 exodus/cbind/src/ex_get_elem_blk_ids.c             |   79 +
 exodus/cbind/src/ex_get_elem_block.c               |  105 +
 exodus/cbind/src/ex_get_elem_cmap.c                |  224 +
 exodus/cbind/src/ex_get_elem_conn.c                |   67 +
 exodus/cbind/src/ex_get_elem_map.c                 |   61 +
 exodus/cbind/src/ex_get_elem_num_map.c             |   89 +
 exodus/cbind/src/ex_get_elem_type.c                |  129 +
 exodus/cbind/src/ex_get_elem_var.c                 |  115 +
 exodus/cbind/src/ex_get_elem_var_tab.c             |  105 +
 exodus/cbind/src/ex_get_elem_var_time.c            |  139 +
 .../cbind/src/ex_get_entity_count_per_polyhedra.c  |  123 +
 exodus/cbind/src/ex_get_glob_var_time.c            |  151 +
 exodus/cbind/src/ex_get_glob_vars.c                |  148 +
 exodus/cbind/src/ex_get_group_id.c                 |   95 +
 exodus/cbind/src/ex_get_group_ids.c                |   71 +
 exodus/cbind/src/ex_get_id_map.c                   |  150 +
 exodus/cbind/src/ex_get_ids.c                      |  140 +
 exodus/cbind/src/ex_get_info.c                     |  136 +
 exodus/cbind/src/ex_get_init.c                     |  150 +
 exodus/cbind/src/ex_get_init_ext.c                 |  189 +
 exodus/cbind/src/ex_get_init_global.c              |  203 +
 exodus/cbind/src/ex_get_init_info.c                |  134 +
 exodus/cbind/src/ex_get_loadbal_param.c            |  564 +++
 exodus/cbind/src/ex_get_map.c                      |  138 +
 exodus/cbind/src/ex_get_map_param.c                |  103 +
 exodus/cbind/src/ex_get_n_attr.c                   |   61 +
 exodus/cbind/src/ex_get_n_conn.c                   |   53 +
 exodus/cbind/src/ex_get_n_coord.c                  |   86 +
 exodus/cbind/src/ex_get_n_elem_attr.c              |   72 +
 exodus/cbind/src/ex_get_n_elem_conn.c              |   73 +
 exodus/cbind/src/ex_get_n_elem_num_map.c           |   67 +
 exodus/cbind/src/ex_get_n_elem_var.c               |   56 +
 exodus/cbind/src/ex_get_n_nodal_var.c              |   51 +
 exodus/cbind/src/ex_get_n_node_num_map.c           |   66 +
 exodus/cbind/src/ex_get_n_node_set.c               |   69 +
 exodus/cbind/src/ex_get_n_node_set_df.c            |   51 +
 exodus/cbind/src/ex_get_n_one_attr.c               |   63 +
 exodus/cbind/src/ex_get_n_side_set.c               |   52 +
 exodus/cbind/src/ex_get_n_side_set_df.c            |   70 +
 exodus/cbind/src/ex_get_n_var.c                    |   72 +
 exodus/cbind/src/ex_get_name.c                     |  145 +
 exodus/cbind/src/ex_get_names.c                    |  154 +
 exodus/cbind/src/ex_get_nodal_var.c                |  167 +
 exodus/cbind/src/ex_get_nodal_var_time.c           |  187 +
 exodus/cbind/src/ex_get_node_cmap.c                |  194 +
 exodus/cbind/src/ex_get_node_map.c                 |   64 +
 exodus/cbind/src/ex_get_node_num_map.c             |   92 +
 exodus/cbind/src/ex_get_node_set.c                 |   66 +
 exodus/cbind/src/ex_get_node_set_dist_fact.c       |   70 +
 exodus/cbind/src/ex_get_node_set_ids.c             |   75 +
 exodus/cbind/src/ex_get_node_set_param.c           |   97 +
 exodus/cbind/src/ex_get_ns_param_global.c          |  161 +
 exodus/cbind/src/ex_get_nset_var.c                 |   76 +
 exodus/cbind/src/ex_get_nset_var_tab.c             |   64 +
 exodus/cbind/src/ex_get_num_map.c                  |  151 +
 exodus/cbind/src/ex_get_object_truth_vector.c      |  200 +
 exodus/cbind/src/ex_get_one_attr.c                 |  209 +
 exodus/cbind/src/ex_get_one_elem_attr.c            |   65 +
 exodus/cbind/src/ex_get_partial_attr.c             |  220 +
 exodus/cbind/src/ex_get_partial_conn.c             |  337 ++
 exodus/cbind/src/ex_get_partial_coord.c            |  261 +
 exodus/cbind/src/ex_get_partial_elem_attr.c        |  180 +
 exodus/cbind/src/ex_get_partial_elem_conn.c        |   73 +
 exodus/cbind/src/ex_get_partial_elem_map.c         |   51 +
 exodus/cbind/src/ex_get_partial_elem_num_map.c     |  165 +
 exodus/cbind/src/ex_get_partial_elem_var.c         |   81 +
 exodus/cbind/src/ex_get_partial_id_map.c           |  143 +
 exodus/cbind/src/ex_get_partial_nodal_var.c        |  139 +
 exodus/cbind/src/ex_get_partial_node_num_map.c     |  155 +
 exodus/cbind/src/ex_get_partial_node_set.c         |  178 +
 exodus/cbind/src/ex_get_partial_node_set_df.c      |  181 +
 exodus/cbind/src/ex_get_partial_num_map.c          |  195 +
 exodus/cbind/src/ex_get_partial_one_attr.c         |  234 +
 exodus/cbind/src/ex_get_partial_set_dist_fact.c    |  148 +
 exodus/cbind/src/ex_get_partial_side_set.c         |  206 +
 exodus/cbind/src/ex_get_partial_side_set_df.c      |  176 +
 exodus/cbind/src/ex_get_partial_var.c              |  143 +
 exodus/cbind/src/ex_get_processor_elem_maps.c      |  265 +
 exodus/cbind/src/ex_get_processor_node_maps.c      |  349 ++
 exodus/cbind/src/ex_get_prop.c                     |  233 +
 exodus/cbind/src/ex_get_prop_array.c               |  230 +
 exodus/cbind/src/ex_get_prop_names.c               |  207 +
 exodus/cbind/src/ex_get_qa.c                       |  147 +
 exodus/cbind/src/ex_get_set.c                      |  193 +
 exodus/cbind/src/ex_get_set_dist_fact.c            |  158 +
 exodus/cbind/src/ex_get_set_param.c                |  216 +
 exodus/cbind/src/ex_get_sets.c                     |   74 +
 exodus/cbind/src/ex_get_side_set.c                 |   67 +
 exodus/cbind/src/ex_get_side_set_dist_fact.c       |   65 +
 exodus/cbind/src/ex_get_side_set_ids.c             |   62 +
 exodus/cbind/src/ex_get_side_set_node_count.c      |  681 +++
 exodus/cbind/src/ex_get_side_set_node_list.c       | 1035 ++++
 exodus/cbind/src/ex_get_side_set_node_list_len.c   |  573 +++
 exodus/cbind/src/ex_get_side_set_param.c           |   74 +
 exodus/cbind/src/ex_get_ss_param_global.c          |  161 +
 exodus/cbind/src/ex_get_sset_var.c                 |   76 +
 exodus/cbind/src/ex_get_sset_var_tab.c             |   64 +
 exodus/cbind/src/ex_get_time.c                     |  116 +
 exodus/cbind/src/ex_get_truth_table.c              |  202 +
 exodus/cbind/src/ex_get_var.c                      |  150 +
 exodus/cbind/src/ex_get_var_name.c                 |   68 +
 exodus/cbind/src/ex_get_var_names.c                |   69 +
 exodus/cbind/src/ex_get_var_param.c                |   68 +
 exodus/cbind/src/ex_get_var_tab.c                  |   68 +
 exodus/cbind/src/ex_get_var_time.c                 |  296 ++
 exodus/cbind/src/ex_get_variable_name.c            |  135 +
 exodus/cbind/src/ex_get_variable_names.c           |  159 +
 exodus/cbind/src/ex_get_variable_param.c           |  178 +
 exodus/cbind/src/ex_inquire.c                      | 1138 +++++
 exodus/cbind/src/ex_ne_util.c                      |  407 ++
 exodus/cbind/src/ex_open.c                         |  329 ++
 exodus/cbind/src/ex_open_par.c                     |  308 ++
 exodus/cbind/src/ex_opts.c                         |   87 +
 exodus/cbind/src/ex_put_all_var_param.c            |  103 +
 exodus/cbind/src/ex_put_all_var_param_ext.c        |  566 +++
 exodus/cbind/src/ex_put_attr.c                     |  160 +
 exodus/cbind/src/ex_put_attr_names.c               |  207 +
 exodus/cbind/src/ex_put_attr_param.c               |  253 +
 exodus/cbind/src/ex_put_block.c                    |   96 +
 exodus/cbind/src/ex_put_block_param.c              |   49 +
 exodus/cbind/src/ex_put_block_params.c             |  585 +++
 exodus/cbind/src/ex_put_cmap_params.c              |  483 ++
 exodus/cbind/src/ex_put_cmap_params_cc.c           |  630 +++
 exodus/cbind/src/ex_put_concat_all_blocks.c        |  628 +++
 exodus/cbind/src/ex_put_concat_elem_block.c        |  446 ++
 exodus/cbind/src/ex_put_concat_node_sets.c         |  148 +
 exodus/cbind/src/ex_put_concat_sets.c              |  579 +++
 exodus/cbind/src/ex_put_concat_side_sets.c         |   99 +
 exodus/cbind/src/ex_put_concat_var_param.c         |   76 +
 exodus/cbind/src/ex_put_conn.c                     |  244 +
 exodus/cbind/src/ex_put_coord.c                    |  285 ++
 exodus/cbind/src/ex_put_coord_names.c              |  118 +
 exodus/cbind/src/ex_put_coordinate_frames.c        |  200 +
 exodus/cbind/src/ex_put_eb_info_global.c           |  124 +
 exodus/cbind/src/ex_put_elem_attr.c                |   77 +
 exodus/cbind/src/ex_put_elem_attr_names.c          |   67 +
 exodus/cbind/src/ex_put_elem_block.c               |  138 +
 exodus/cbind/src/ex_put_elem_cmap.c                |  239 +
 exodus/cbind/src/ex_put_elem_conn.c                |   70 +
 exodus/cbind/src/ex_put_elem_map.c                 |   68 +
 exodus/cbind/src/ex_put_elem_num_map.c             |   82 +
 exodus/cbind/src/ex_put_elem_var.c                 |  143 +
 exodus/cbind/src/ex_put_elem_var_slab.c            |  285 ++
 exodus/cbind/src/ex_put_elem_var_tab.c             |  126 +
 .../cbind/src/ex_put_entity_count_per_polyhedra.c  |  123 +
 exodus/cbind/src/ex_put_glob_vars.c                |  113 +
 exodus/cbind/src/ex_put_id_map.c                   |  195 +
 exodus/cbind/src/ex_put_info.c                     |  237 +
 exodus/cbind/src/ex_put_init.c                     |  111 +
 exodus/cbind/src/ex_put_init_ext.c                 |  603 +++
 exodus/cbind/src/ex_put_init_global.c              |  311 ++
 exodus/cbind/src/ex_put_init_info.c                |  180 +
 exodus/cbind/src/ex_put_loadbal_param.c            |  663 +++
 exodus/cbind/src/ex_put_loadbal_param_cc.c         |  922 ++++
 exodus/cbind/src/ex_put_map.c                      |  186 +
 exodus/cbind/src/ex_put_map_param.c                |  322 ++
 exodus/cbind/src/ex_put_n_attr.c                   |   74 +
 exodus/cbind/src/ex_put_n_coord.c                  |   78 +
 exodus/cbind/src/ex_put_n_elem_attr.c              |   71 +
 exodus/cbind/src/ex_put_n_elem_conn.c              |   70 +
 exodus/cbind/src/ex_put_n_elem_num_map.c           |   69 +
 exodus/cbind/src/ex_put_n_nodal_var.c              |   79 +
 exodus/cbind/src/ex_put_n_node_num_map.c           |   68 +
 exodus/cbind/src/ex_put_n_node_set.c               |   72 +
 exodus/cbind/src/ex_put_n_node_set_df.c            |   72 +
 exodus/cbind/src/ex_put_n_one_attr.c               |   76 +
 exodus/cbind/src/ex_put_n_side_set.c               |   74 +
 exodus/cbind/src/ex_put_n_side_set_df.c            |   71 +
 exodus/cbind/src/ex_put_n_var.c                    |   87 +
 exodus/cbind/src/ex_put_name.c                     |  158 +
 exodus/cbind/src/ex_put_names.c                    |  151 +
 exodus/cbind/src/ex_put_nodal_var.c                |  163 +
 exodus/cbind/src/ex_put_nodal_var_slab.c           |  144 +
 exodus/cbind/src/ex_put_node_cmap.c                |  217 +
 exodus/cbind/src/ex_put_node_map.c                 |   65 +
 exodus/cbind/src/ex_put_node_num_map.c             |   80 +
 exodus/cbind/src/ex_put_node_set.c                 |   69 +
 exodus/cbind/src/ex_put_node_set_dist_fact.c       |   73 +
 exodus/cbind/src/ex_put_node_set_param.c           |  102 +
 exodus/cbind/src/ex_put_ns_param_global.c          |  157 +
 exodus/cbind/src/ex_put_nset_var.c                 |   83 +
 exodus/cbind/src/ex_put_nset_var_tab.c             |   76 +
 exodus/cbind/src/ex_put_num_map.c                  |  290 ++
 exodus/cbind/src/ex_put_one_attr.c                 |  212 +
 exodus/cbind/src/ex_put_one_elem_attr.c            |   72 +
 exodus/cbind/src/ex_put_partial_attr.c             |  228 +
 exodus/cbind/src/ex_put_partial_coord.c            |  270 +
 exodus/cbind/src/ex_put_partial_elem_attr.c        |  190 +
 exodus/cbind/src/ex_put_partial_elem_conn.c        |  183 +
 exodus/cbind/src/ex_put_partial_elem_map.c         |   69 +
 exodus/cbind/src/ex_put_partial_elem_num_map.c     |   69 +
 exodus/cbind/src/ex_put_partial_id_map.c           |  221 +
 exodus/cbind/src/ex_put_partial_nodal_var.c        |  142 +
 exodus/cbind/src/ex_put_partial_node_num_map.c     |   68 +
 exodus/cbind/src/ex_put_partial_node_set.c         |  178 +
 exodus/cbind/src/ex_put_partial_node_set_df.c      |  195 +
 exodus/cbind/src/ex_put_partial_num_map.c          |  304 ++
 exodus/cbind/src/ex_put_partial_one_attr.c         |  229 +
 exodus/cbind/src/ex_put_partial_set.c              |  218 +
 exodus/cbind/src/ex_put_partial_set_dist_fact.c    |  179 +
 exodus/cbind/src/ex_put_partial_side_set.c         |  214 +
 exodus/cbind/src/ex_put_partial_side_set_df.c      |  197 +
 exodus/cbind/src/ex_put_partial_var.c              |  315 ++
 exodus/cbind/src/ex_put_processor_elem_maps.c      |  267 +
 exodus/cbind/src/ex_put_processor_node_maps.c      |  354 ++
 exodus/cbind/src/ex_put_prop.c                     |  416 ++
 exodus/cbind/src/ex_put_prop_array.c               |  326 ++
 exodus/cbind/src/ex_put_prop_names.c               |  290 ++
 exodus/cbind/src/ex_put_qa.c                       |  236 +
 exodus/cbind/src/ex_put_set.c                      |  207 +
 exodus/cbind/src/ex_put_set_dist_fact.c            |  167 +
 exodus/cbind/src/ex_put_set_param.c                |   84 +
 exodus/cbind/src/ex_put_sets.c                     |  398 ++
 exodus/cbind/src/ex_put_side_set.c                 |   71 +
 exodus/cbind/src/ex_put_side_set_dist_fact.c       |   68 +
 exodus/cbind/src/ex_put_side_set_param.c           |   74 +
 exodus/cbind/src/ex_put_ss_param_global.c          |  159 +
 exodus/cbind/src/ex_put_sset_var.c                 |   81 +
 exodus/cbind/src/ex_put_sset_var_tab.c             |   77 +
 exodus/cbind/src/ex_put_time.c                     |  116 +
 exodus/cbind/src/ex_put_truth_table.c              |  370 ++
 exodus/cbind/src/ex_put_var.c                      |  345 ++
 exodus/cbind/src/ex_put_var_name.c                 |   72 +
 exodus/cbind/src/ex_put_var_names.c                |   72 +
 exodus/cbind/src/ex_put_var_param.c                |   71 +
 exodus/cbind/src/ex_put_var_tab.c                  |   82 +
 exodus/cbind/src/ex_put_variable_name.c            |  131 +
 exodus/cbind/src/ex_put_variable_names.c           |  203 +
 exodus/cbind/src/ex_put_variable_param.c           |  405 ++
 exodus/cbind/src/ex_update.c                       |   74 +
 exodus/cbind/src/ex_utils.c                        | 1562 ++++++
 exodus/cbind/test/CMakeLists.txt                   |   85 +
 exodus/cbind/test/CreateEdgeFace.c                 |  655 +++
 exodus/cbind/test/Imakefile                        |  125 +
 exodus/cbind/test/MakeTestData.c                   |  963 ++++
 exodus/cbind/test/Makefile.standalone              |  184 +
 exodus/cbind/test/ReadEdgeFace.c                   |  464 ++
 exodus/cbind/test/create_mesh.c                    | 1032 ++++
 exodus/cbind/test/exodus_unit_tests.gold           |   41 +
 exodus/cbind/test/makedmp                          |  122 +
 exodus/cbind/test/oned.c                           |  426 ++
 exodus/cbind/test/rd_wt_mesh.c                     | 1280 +++++
 exodus/cbind/test/test.dmp                         | 1025 ++++
 exodus/cbind/test/test.exo_c                       |   40 +
 exodus/cbind/test/test1.dmp                        |  715 +++
 exodus/cbind/test/test2-1.dmp                      |  557 +++
 exodus/cbind/test/test2-2.dmp                      |  557 +++
 exodus/cbind/test/test2.dmp                        |  278 ++
 exodus/cbind/test/test_clb.dmp                     |  988 ++++
 exodus/cbind/test/test_nemesis.c                   |  948 ++++
 exodus/cbind/test/test_nemesis.dmp                 |   30 +
 exodus/cbind/test/testall.in                       |  236 +
 exodus/cbind/test/testall.in1                      |  233 +
 exodus/cbind/test/testall.standalone               |  238 +
 exodus/cbind/test/testcp.c                         |  119 +
 exodus/cbind/test/testcp_dd.dmp                    |  248 +
 exodus/cbind/test/testcp_ds.dmp                    |  248 +
 exodus/cbind/test/testcp_ln.c                      |  119 +
 exodus/cbind/test/testcp_ln.dmp                    |  334 ++
 exodus/cbind/test/testcp_nl.c                      |  119 +
 exodus/cbind/test/testcp_nl.dmp                    |  337 ++
 exodus/cbind/test/testcp_sd.dmp                    |  337 ++
 exodus/cbind/test/testcp_ss.dmp                    |  337 ++
 exodus/cbind/test/testcpd.c                        |  119 +
 exodus/cbind/test/testd.dmp                        |  557 +++
 exodus/cbind/test/testrd-groups.c                  | 1226 +++++
 exodus/cbind/test/testrd-long-name.c               | 1210 +++++
 exodus/cbind/test/testrd-long-name.dmp             | 1139 +++++
 exodus/cbind/test/testrd-nfaced.c                  |  354 ++
 exodus/cbind/test/testrd-nfaced.dmp                |  109 +
 exodus/cbind/test/testrd-nm32.dmp                  | 1137 +++++
 exodus/cbind/test/testrd-nsided.c                  | 1153 +++++
 exodus/cbind/test/testrd-nsided.dmp                |  852 ++++
 exodus/cbind/test/testrd.c                         | 1203 +++++
 exodus/cbind/test/testrd.dmp                       | 1137 +++++
 exodus/cbind/test/testrd1.c                        | 1050 ++++
 exodus/cbind/test/testrd1.dmp                      |  902 ++++
 exodus/cbind/test/testrd_nc.c                      |  897 ++++
 exodus/cbind/test/testrd_nc.dmp                    |  931 ++++
 exodus/cbind/test/testrd_par.c                     | 1210 +++++
 exodus/cbind/test/testrd_ss.c                      |  340 ++
 exodus/cbind/test/testrd_ss.dmp                    |  523 ++
 exodus/cbind/test/testrd_zeroe.dmp                 |  345 ++
 exodus/cbind/test/testrd_zeron.dmp                 |   86 +
 exodus/cbind/test/testrdd.c                        |  900 ++++
 exodus/cbind/test/testrdd.dmp                      |  775 +++
 exodus/cbind/test/testrdwt.c                       |  455 ++
 exodus/cbind/test/testwt-groups.c                  | 1247 +++++
 exodus/cbind/test/testwt-long-name.c               | 1216 +++++
 exodus/cbind/test/testwt-long-name.dmp             | 1025 ++++
 exodus/cbind/test/testwt-nface-nside.c             |  560 +++
 exodus/cbind/test/testwt-nfaced.c                  |  429 ++
 exodus/cbind/test/testwt-nfaced.dmp                |  104 +
 exodus/cbind/test/testwt-nsided.c                  |  974 ++++
 exodus/cbind/test/testwt-nsided.dmp                |  669 +++
 exodus/cbind/test/testwt-one-attrib.c              |  338 ++
 exodus/cbind/test/testwt-partial.c                 | 1218 +++++
 exodus/cbind/test/testwt-zeroe.c                   |  473 ++
 exodus/cbind/test/testwt-zeroe.dmp                 |  185 +
 exodus/cbind/test/testwt-zeron.c                   |  255 +
 exodus/cbind/test/testwt-zeron.dmp                 |   62 +
 exodus/cbind/test/testwt.c                         | 1210 +++++
 exodus/cbind/test/testwt1.c                        |  920 ++++
 exodus/cbind/test/testwt2.c                        | 1279 +++++
 exodus/cbind/test/testwt_clb.c                     |  999 ++++
 exodus/cbind/test/testwt_nc.c                      | 1236 +++++
 exodus/cbind/test/testwt_nossnsdf.c                |  889 ++++
 exodus/cbind/test/testwt_ss.c                      |  835 ++++
 exodus/cbind/test/testwt_ss.dmp                    |  295 ++
 exodus/cbind/test/testwtbig.c                      |  776 +++
 exodus/cbind/test/testwtd.c                        |  602 +++
 exodus/cbind/test/testwtm.c                        | 1405 ++++++
 exodus/cbind/test/twod.c                           |  378 ++
 exodus/cbind/test/update_all_tests                 |  232 +
 exodus/cmake-script                                |   36 +
 exodus/cmake/Dependencies.cmake                    |    8 +
 exodus/customdoxygen.css                           |  686 +++
 exodus/doc/doc.poly.txt                            |  216 +
 exodus/doc/exodus-face-edge.pdf                    |  Bin 0 -> 720533 bytes
 exodus/doc/exodus.pdf                              |  Bin 0 -> 3842894 bytes
 exodus/doc/nemesis.pdf                             |  Bin 0 -> 376501 bytes
 exodus/exodus.py.in                                | 3349 +++++++++++++
 exodus/exodusii.dsp                                |  497 ++
 exodus/forbind/CMakeLists.txt                      |   77 +
 exodus/forbind/include/Imakefile                   |    6 +
 exodus/forbind/include/exodusII.inc                |  193 +
 exodus/forbind/include/exodusII_int.inc            |  167 +
 exodus/forbind/src/Imakefile                       |   76 +
 exodus/forbind/src/Makefile.standalone             |   70 +
 exodus/forbind/src/addrwrap.F                      | 3832 ++++++++++++++
 exodus/forbind/src/exo_jack-windows.c              | 4166 ++++++++++++++++
 exodus/forbind/src/exo_jack.c                      | 4305 ++++++++++++++++
 exodus/forbind/src/exo_jack.src                    | 5251 ++++++++++++++++++++
 exodus/forbind/test/CMakeLists.txt                 |   40 +
 exodus/forbind/test/Imakefile                      |   78 +
 exodus/forbind/test/Makefile.standalone            |  111 +
 exodus/forbind/test/exodus_unit_tests.gold         |   20 +
 exodus/forbind/test/test-nsided.dmp                |   97 +
 exodus/forbind/test/test.dmp                       |  556 +++
 exodus/forbind/test/test1.dmp                      |  714 +++
 exodus/forbind/test/test2-1.dmp                    |  556 +++
 exodus/forbind/test/test2-2.dmp                    |  556 +++
 exodus/forbind/test/test_nem.dmp                   |   54 +
 exodus/forbind/test/test_nem.f                     |  928 ++++
 exodus/forbind/test/test_nem.inc                   |   66 +
 exodus/forbind/test/testall.in                     |  129 +
 exodus/forbind/test/testall.in1                    |  127 +
 exodus/forbind/test/testall.standalone             |  132 +
 exodus/forbind/test/testcp.f                       |   96 +
 exodus/forbind/test/testcp_dd.dmp                  |    0
 exodus/forbind/test/testcp_ds.dmp                  |  244 +
 exodus/forbind/test/testcp_sd.dmp                  |    0
 exodus/forbind/test/testcp_ss.dmp                  |  248 +
 exodus/forbind/test/testcpd.f                      |   96 +
 exodus/forbind/test/testcpln.dmp                   |  245 +
 exodus/forbind/test/testcpln.f                     |  101 +
 exodus/forbind/test/testcpnl.dmp                   |  248 +
 exodus/forbind/test/testcpnl.f                     |  101 +
 exodus/forbind/test/testd.dmp                      |  326 ++
 exodus/forbind/test/testrd.dmp                     |  798 +++
 exodus/forbind/test/testrd.f                       |  771 +++
 exodus/forbind/test/testrd1.dmp                    |  917 ++++
 exodus/forbind/test/testrd1.f                      |  857 ++++
 exodus/forbind/test/testrd_nsid.dmp                |  162 +
 exodus/forbind/test/testrd_nsid.f                  |  241 +
 exodus/forbind/test/testrdd.dmp                    |  409 ++
 exodus/forbind/test/testrdd.f                      |  722 +++
 exodus/forbind/test/testwt.f                       | 1183 +++++
 exodus/forbind/test/testwt1.f                      | 1029 ++++
 exodus/forbind/test/testwt2.f                      | 1465 ++++++
 exodus/forbind/test/testwt3.f                      |  627 +++
 exodus/forbind/test/testwt_nsid.f                  |  436 ++
 exodus/forbind/test/testwtd.f                      |  572 +++
 exodus/forbind/test/testwtm.f                      |  979 ++++
 nemesis/CMakeLists.txt                             |   87 +
 nemesis/COPYRIGHT                                  |   32 +
 nemesis/Imakefile                                  |  142 +
 nemesis/Makefile.standalone                        |  247 +
 nemesis/README                                     |   27 +
 nemesis/forbind/Imakefile                          |   73 +
 nemesis/forbind/Makefile.standalone                |   68 +
 nemesis/forbind/addrwrpn.F                         | 1211 +++++
 nemesis/forbind/ne_ftest.F                         |  928 ++++
 nemesis/forbind/ne_jack.c                          | 1438 ++++++
 nemesis/forbind/ne_test.inc                        |   66 +
 nemesis/ne_ctest_wrap.c                            | 1044 ++++
 nemesis/ne_nemesisI.h                              |  492 ++
 nemesis/ne_nemesisI_int.h                          |    3 +
 nemesis/nemesis_cfg.h.in                           |   25 +
 nemesis/nemesis_wrapper.c                          |  596 +++
 439 files changed, 155740 insertions(+)

diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..f4262d1
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,104 @@
+========================================================================	
+*** Permit 0 as valid entity (block, set, map) id
+
+* Version 5.09 -- Modifications to let zero be a valid entity (element
+	block, nodeset, sideset, map, other sets and blocks).  There is a
+	new define EX_INVALID_ID (-1) which now indicates that the id for
+	an entity has not yet been set.  All positive integers are now
+	valid id values.
+
+========================================================================	
+*** Long Name support.
+
+   Exodus from version 5.08 and later can support names of length up
+   to NC_MAXNAME which is currently 256.  The internals of the exodus
+database have changed with the addition of a new 'dimension' and a new
+database attribute.
+
+This has the following implications:
+*. The old library can read a new database if the new database does
+   not use names longer than 32 characters.
+
+*. If the new database uses longer names, the old library will crash.
+
+*. New library with old database will work fine.
+
+*. New library with new database, no code changes.  If the database
+   uses long names, they will be truncated (with message to stderr) at
+   32 characters.  An output database will limit names to 32
+   characters by default.
+
+The following code changes are used to work with long names:
+
+========================================
+Reading a database:
+
+* Query a database for the maximum length of a name stored on the
+  database.  This does not include the space for the trailing null.
+
+     int max_name_length = ex_inquire_int(exoid,
+		    EX_INQ_DB_MAX_USED_NAME_LENGTH);
+
+* Tell the exodus API the maximum name length that your client code
+  can handle.  This is the size of the character strings that are
+  passed to the ex_get_names() and similar calls.  Note that the
+  maximum_length does not include the trailing null.  That means that
+  if you tell the library to give you 32-character names, the memory
+  buffer you pass to the library must be 33 characters.
+
+    int status = ex_set_max_name_length(exoid, maximum_length);
+
+  If this size is less than the length of a name on the database, the
+  name will be truncated and a message printed to stderr.
+
+* Inquire the size set for the max_name_length. Will return 32 by
+  default, or if ex_set_max_name_length was called, it will return the
+  size set in that call.
+
+     int max_name_length = ex_inquire_int(exoid,
+		    EX_INQ_CUR_MAX_ALLOWED_NAME_LENGTH);
+    
+* Inquire the size that the database used at creation time for the
+  maximum name size.  This is the value used for
+  ex_set_max_name_length() when the database was created. This isn't
+  really needed unless you are appending to an existing database and
+  want to know how long of names it will support.
+
+========================================
+Writing a database:
+
+* After the ex_create() call and before the call to ex_put_init() or
+  ex_put_init_ext(), call ex_set_max_name_length(exoid, max_length); to
+  tell the database the maximum size names that you will be
+  outputting. If this isn't called, then it will default to 32
+  character names.
+
+* The code will keep track of the maximum length that was written and
+  will update an attribute on the database with that length.  This is
+  queryable via the following function:
+
+     int max_name_length = ex_inquire_int(exoid,
+		    EX_INQ_DB_MAX_USED_NAME_LENGTH);
+
+
+========================================
+Names that are included:
+
+* Entity names (element block, nodeset, sideset, faceblock, ...)
+* Attribute names
+* Map names
+* Results variable names
+
+Still 32 characters:
+* QA strings
+* element type in ex_get_block, ex_put_block calls.
+
+Still 80 characters:
+* info records
+* title.
+
+========================================
+Questions / Concerns / Problems:
+
+Greg Sjaardema.
+gdsjaar at sandia.gov or gsjaardema at gmail.com
diff --git a/README.NEMESIS b/README.NEMESIS
new file mode 100644
index 0000000..f2c8485
--- /dev/null
+++ b/README.NEMESIS
@@ -0,0 +1,18 @@
+NOTE: All nemesis api functions are now included in the exodus library.
+      For almost all functions, the "ne_" portion of the function name
+      is replaced by "ex_".  For example, "ne_put_init_info" in the nemesis
+      API is now "ex_put_init_info" in the exodus API.  
+
+      The exceptions are:
+      * "ne_put_version" is "ex_put_nemesis_version"
+      * "ne_get_node_map" is "ex_get_processor_node_maps"
+      * "ne_put_node_map" is "ex_put_processor_node_maps"
+      * "ne_get_elem_map" is "ex_get_processor_elem_maps"
+      * "ne_put_elem_map" is "ex_put_processor_elem_maps"
+
+      The nemesis library can still be used, but all functions are 
+      simply implemented as wrappers that call the corresponding  
+      exodus API function.
+
+      Unless you are building a legacy code that uses the nemesis API,
+      it is best to just use the exodus API and library.
diff --git a/exodus/CMakeLists.txt b/exodus/CMakeLists.txt
new file mode 100644
index 0000000..6ba7f3c
--- /dev/null
+++ b/exodus/CMakeLists.txt
@@ -0,0 +1,81 @@
+cmake_minimum_required(VERSION 2.6)
+PROJECT(ExodusII C CXX Fortran)
+
+SET(EXODUSII_VERSION_MAJOR "5")
+SET(EXODUSII_VERSION_MINOR "14")
+SET(EXODUSII_VERSION_PATCH "0")
+SET(EXODUSII_VERSION "${EXODUSII_VERSION_MAJOR}.${EXODUSII_VERSION_MINOR}")
+SET(EXODUSII_VERSION_FULL "${EXODUSII_VERSION}.${EXODUSII_VERSION_PATCH}")
+
+OPTION(BUILD_SHARED "Build the exodus libraries shared." OFF)
+
+IF(BUILD_SHARED)
+  SET(EXODUS_LIBRARY_TYPE SHARED)
+ELSE(BUILD_SHARED)
+  SET(EXODUS_LIBRARY_TYPE STATIC)
+ENDIF(BUILD_SHARED)
+
+SUBDIRS(cbind forbind)
+
+find_path( NETCDF_INCLUDE_DIR netcdf.h
+   $ENV{ACCESS}/inc
+   $ENV{NETCDF_DIR}/inc
+   $ENV{NETCDF_DIR}/include
+   $ENV{NETCDF_DIR}/libsrc
+)	
+
+find_library( NETCDF_LIBRARY
+   NAMES netcdf
+   PATHS "$ENV{ACCESS}/lib"
+         "$ENV{NETCDF_DIR}/lib"
+	 "$ENV{NETCDF_DIR}/libsrc/.libs"
+)
+
+find_program (NETCDF_NCDUMP ncdump
+   $ENV{ACCESS}/bin
+   $ENV{NETCDF_DIR}/bin
+   $ENV{NETCDF_DIR}/ncdump
+)
+
+# Hack for HDF5
+find_library( HDF5_LIBRARY hdf5
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  /usr/local/hdf5/lib
+  )
+find_library( HDF5HL_LIBRARY hdf5_hl
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  /usr/local/hdf5/lib
+  )
+
+# Check for ZLib, but only if using HDF5.
+FIND_PACKAGE(ZLIB)
+IF(NOT ZLIB_LIBRARY)
+   MESSAGE(FATAL_ERROR "HDF5 Support specified, cannot find ZLib.")
+ENDIF()
+SET(USE_ZLIB ON)
+INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIRS})
+
+# Check for curl. Only needed if using an installed netcdf built with curl.
+FIND_PACKAGE(CURL)
+IF(CURL_FOUND)
+   SET(CURL ${CURL_LIBRARY})
+ENDIF()
+
+
+find_program(PYTHON "python")
+
+if (PYTHON)
+  set(EXODUS_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/exodus.py.in")
+  set(EXODUS_PY "${CMAKE_CURRENT_BINARY_DIR}/exodus.py")
+
+  configure_file(${EXODUS_PY_IN} ${EXODUS_PY} @ONLY)
+
+  INSTALL(FILES ${EXODUS_PY} DESTINATION ${PYTHON_INSTALL})
+
+endif()
diff --git a/exodus/COPYRIGHT b/exodus/COPYRIGHT
new file mode 100644
index 0000000..f11b681
--- /dev/null
+++ b/exodus/COPYRIGHT
@@ -0,0 +1,32 @@
+Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+retains certain rights in this software.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.  
+
+    * Neither the name of Sandia Corporation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/exodus/DartConfig.cmake b/exodus/DartConfig.cmake
new file mode 100644
index 0000000..5264ed8
--- /dev/null
+++ b/exodus/DartConfig.cmake
@@ -0,0 +1,17 @@
+# Dashboard is opened for submissions for a 24 hour period starting at
+# the specified NIGHLY_START_TIME. Time is specified in 24 hour format.
+SET (NIGHTLY_START_TIME "21:00:00 EDT")
+
+# Dart server to submit results (used by client)
+SET (DROP_SITE "tigre.ca.sandia.gov")
+SET (DROP_LOCATION "Drop/")
+SET (DROP_SITE_USER "dart")
+SET (DROP_METHOD "scp")
+SET (TRIGGER_SITE "http://${DROP_SITE}/~dart/cgi-bin/Dart-vtkSNL.pl")
+
+# Project Home Page
+SET (PROJECT_URL "http://tigre.ca.sandia.gov/vtkSNL")
+SET (CVS_WEB_URL "http://${DROP_SITE}/vtk/")
+SET (CVS_WEB_CVSROOT "vtkSNL")
+SET (USE_DOXYGEN "On")
+SET (DOXYGEN_URL "http://tigre.ca.sandia.gov/vtkSNL/Documentation/Doxygen/" )
diff --git a/exodus/Doxyfile b/exodus/Doxyfile
new file mode 100644
index 0000000..3b0376e
--- /dev/null
+++ b/exodus/Doxyfile
@@ -0,0 +1,1685 @@
+# Doxyfile 1.7.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file 
+# that follow. The default is UTF-8 which is also the encoding used for all 
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
+# iconv built into libc) for the transcoding. See 
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = ExodusII
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 6.05
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = 
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is 
+# included in the documentation. The maximum height of the logo should not 
+# exceed 55 pixels and the maximum width should not exceed 200 pixels. 
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO           = 
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = 
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, 
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful if your file system 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 1
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = "func{1}=<b>\1</b>" \
+                         "fparam{1}=<em>\1</em>" \
+                         "file{1}=<tt>\1</tt>" \
+                         "comment{1}=...<em>\1</em>" \
+			 "undoc=\xrefitem undoc \"Undocumented\" \"Undocumented\"" 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Java. For instance, namespaces will be presented as packages, qualified 
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
+# sources only. Doxygen will then generate output that is more tailored for 
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
+# sources. Doxygen will then generate output that is tailored for 
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it 
+# parses. With this tag you can assign which parser to use for a given extension. 
+# Doxygen has a built-in mapping, but you can override or extend it using this 
+# tag. The format is ext=language, where ext is a file extension, and language 
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
+# to include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also makes the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
+# Doxygen will parse them like normal C++ but will assume all classes use public 
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter 
+# and setter methods for a property. Setting this option to YES (the default) 
+# will make doxygen replace the get and set methods by a property in the 
+# documentation. This will only work if the methods are indeed getting or 
+# setting a simple type. If this is not the case, or you want to show the 
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
+# is documented as struct, union, or enum with the name of the typedef. So 
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
+# with name TypeT. When disabled the typedef will appear as a member of a file, 
+# namespace, or class. And the struct will be named TypeS. This can typically 
+# be useful for C code in case the coding convention dictates that all compound 
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
+# determine which symbols to keep in memory and which to flush to disk. 
+# When the cache is full, less often used symbols will be written to disk. 
+# For small to medium size projects (<1000 input files) the default value is 
+# probably good enough. For larger projects a too small cache size can cause 
+# doxygen to be busy swapping symbols to and from disk most of the time 
+# causing a significant performance penalty. 
+# If the system has enough physical memory increasing the cache will improve the 
+# performance by keeping more symbols in memory. Note that the value works on 
+# a logarithmic scale so increasing the size by one will roughly double the 
+# memory usage. The cache size is given by this formula: 
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be 
+# extracted and appear in the documentation as a namespace called 
+# 'anonymous_namespace{file}', where file will be replaced with the base 
+# name of the file that contains the anonymous namespace. By default 
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
+# will list include files with double quotes in the documentation 
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
+# will sort the (brief and detailed) documentation of class members so that 
+# constructors and destructors are listed first. If set to NO (the default) 
+# the constructors will appear in the respective orders defined by 
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
+# hierarchy of group names into alphabetical order. If set to NO (the default) 
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a 
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen 
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or macro consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and macros in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
+# This will remove the Files entry from the Quick Index and from the 
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
+# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from 
+# the version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
+# by doxygen. The layout file controls the global structure of the generated 
+# output files in an output format independent way. The create the layout file 
+# that represents doxygen's defaults, run doxygen with the -l option. 
+# You can optionally specify a file name after the option, if omitted 
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = cbind/include \
+                         cbind/src \
+                         forbind/src
+
+# This tag can be used to specify the character encoding of the source files 
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
+# also the default input encoding. Doxygen uses libiconv (or the iconv built 
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py 
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          = *.c \
+                         *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix file system feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the 
+# output. The symbol name can be a fully qualified name, a word, or if the 
+# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty or if 
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) 
+# and it is also possible to disable source filtering for a specific pattern 
+# using *.ext= (so without naming a filter). This option only has effect when 
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS = 
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
+# link to the source code.  Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = ex_
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+#HTML_STYLESHEET        = customdoxygen.css
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
+# Doxygen will adjust the colors in the stylesheet and background images 
+# according to this color. Hue is specified as an angle on a colorwheel, 
+# see http://en.wikipedia.org/wiki/Hue for more information. 
+# For instance the value 0 represents red, 60 is yellow, 120 is green, 
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 224
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
+# the colors in the HTML output. For a value of 0 the output will use 
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 93
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
+# the luminance component of the colors in the HTML output. Values below 
+# 100 gradually make the output lighter, whereas values above 100 make 
+# the output darker. The value divided by 100 is the actual gamma applied, 
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
+# page will contain the date and time when the page was generated. Setting 
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files 
+# will be generated that can be used as input for Apple's Xcode 3 
+# integrated development environment, introduced with OSX 10.5 (Leopard). 
+# To create a documentation set, doxygen will generate a Makefile in the 
+# HTML output directory. Running make will produce the docset in that 
+# directory and running "make install" will install the docset in 
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
+# it at startup. 
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
+# feed. A documentation feed provides an umbrella under which multiple 
+# documentation sets from a single provider (such as a company or product suite) 
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
+# should uniquely identify the documentation set bundle. This should be a 
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
+# the documentation publisher. This should be a reverse domain-name style 
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
+# content.
+
+CHM_INDEX_ENCODING     = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
+# that can be used as input for Qt's qhelpgenerator to generate a 
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
+# be used to specify the file name of the resulting .qch file. 
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
+# Qt Help Project output. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
+# add. For more information please see 
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
+# custom filter to add. For more information please see 
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
+# project's 
+# filter section matches. 
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
+# be used to specify the location of Qt's qhelpgenerator. 
+# If non-empty doxygen will try to run qhelpgenerator on the generated 
+# .qhp file.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
+# will be generated, which together with the HTML files, form an Eclipse help 
+# plugin. To install this plugin and make it available under the help contents 
+# menu in Eclipse, the contents of the directory containing the HTML and XML 
+# files needs to be copied into the plugins directory of eclipse. The name of 
+# the directory within the plugins directory should be the same as 
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin 
+# the directory name containing the HTML and XML files should also have 
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [0,1..20]) 
+# that doxygen will group on one line in the generated HTML documentation. 
+# Note that a value of 0 will completely suppress the enum values from
+# appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
+# structure should be generated to display hierarchical information. 
+# If the tag value is set to YES, a side panel will be generated 
+# containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included 
+# as images in the HTML documentation. The default is 10. Note that 
+# when you change the font size after a successful doxygen run you need 
+# to manually remove any form_*.png images from the HTML output directory 
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
+# generated for formulas are transparent PNGs. Transparent PNGs are 
+# not supported properly for IE 6.0, but are supported on all modern browsers. 
+# Note that when changing this option you need to delete any form_*.png files 
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax 
+# (see http://www.mathjax.org) which uses client side Javascript for the 
+# rendering instead of using prerendered bitmaps. Use this if you do not 
+# have LaTeX installed or if you want to formulas look prettier in the HTML 
+# output. When enabled you also need to install MathJax separately and 
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you need to specify the location relative to the 
+# HTML output directory using the MATHJAX_RELPATH option. The destination 
+# directory should contain the MathJax.js script. For instance, if the mathjax 
+# directory is located at the same level as the HTML output directory, then 
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing 
+# MathJax, but it is strongly recommended to install a local copy of MathJax 
+# before deployment.
+
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
+# for the HTML output. The underlying search engine uses javascript 
+# and DHTML and should work on any modern browser. Note that when using 
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
+# (GENERATE_DOCSET) there is already a search function so this one should 
+# typically be disabled. For large projects the javascript based search engine 
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
+# implemented using a PHP enabled web server instead of at the web client 
+# using Javascript. Doxygen will generate the search PHP script and index 
+# file to put on the web server. The advantage of the server 
+# based approach is that it scales better to large projects and allows 
+# full text search. The disadvantages are that it is more difficult to setup 
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name. 
+# Note that when enabling USE_PDFLATEX this option is only used for 
+# generating bitmaps for formulas in the HTML output, but not in the 
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = letter
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
+# source code with syntax highlighting in the LaTeX output. 
+# Note that which sources are shown also depends on other settings 
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      = EXODUS_EXPORT
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all references to function-like macros 
+# that are alone on a line, have an all uppercase name, and do not end with a 
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links. 
+# Note that each tag file must have a unique name 
+# (where the name does NOT include the path) 
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option also works with HAVE_DOT disabled, but it is recommended to 
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see 
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
+# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
+# allowed to run in parallel. When set to 0 (the default) doxygen will 
+# base this on the number of processors available in the system. You can set it 
+# explicitly to a value larger than 0 to get control over the balance 
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called Helvetica to the output 
+# directory and reference it in all dot files that doxygen generates. 
+# When you want a differently looking font you can specify the font name 
+# using DOT_FONTNAME. You need to make sure dot is able to find the font, 
+# which can be done by putting it in a standard location or by setting the 
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory 
+# containing the font.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the 
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a 
+# different font using DOT_FONTNAME you can set the path where dot 
+# can find it using this tag.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = NO
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
+# doxygen will generate a call dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable call graphs 
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
+# doxygen will generate a caller dependency graph for every global function 
+# or class method. Note that enabling this option will significantly increase 
+# the time of a run. So in most cases it will be better to enable caller 
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include 
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, svg, gif or svg. 
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = gif
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = /opt/local/bin
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that 
+# contain msc files that are included in the documentation (see the 
+# \mscfile command).
+
+MSCFILE_DIRS           = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the 
+# number of direct children of the root node in a graph is already larger than 
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, because dot on Windows does not 
+# seem to support this out of the box. Warning: Depending on the platform used, 
+# enabling this option may lead to badly anti-aliased labels on the edges of 
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/exodus/Imakefile b/exodus/Imakefile
new file mode 100644
index 0000000..439c827
--- /dev/null
+++ b/exodus/Imakefile
@@ -0,0 +1,101 @@
+XCOMM Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+XCOMM DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+XCOMM retains certain rights in this software.
+XCOMM 
+XCOMM Redistribution and use in source and binary forms, with or without
+XCOMM modification, are permitted provided that the following conditions are
+XCOMM met:
+XCOMM 
+XCOMM     * Redistributions of source code must retain the above copyright
+XCOMM       notice, this list of conditions and the following disclaimer.
+XCOMM 
+XCOMM     * Redistributions in binary form must reproduce the above
+XCOMM       copyright notice, this list of conditions and the following
+XCOMM       disclaimer in the documentation and/or other materials provided
+XCOMM       with the distribution.  
+XCOMM 
+XCOMM     * Neither the name of Sandia Corporation nor the names of its
+XCOMM       contributors may be used to endorse or promote products derived
+XCOMM       from this software without specific prior written permission.
+XCOMM 
+XCOMM THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+XCOMM "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+XCOMM LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+XCOMM A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+XCOMM OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+XCOMM SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+XCOMM LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+XCOMM DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+XCOMM THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+XCOMM (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+XCOMM OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+XCOMM 
+
+XCOMM Imakefile for ExodusII libraries
+XCOMM Building ExodusII libraries for installation
+/* Building ExodusII libraries for installation
+ * % accmkmf
+ * % make Makefiles
+ * % make
+ *
+ * Building ExodusII libraries for debugging
+ * % accmkmf
+ * % make Makefiles
+ * % make DEBUG=-g
+ *
+ */
+
+#define IHaveSubdirs
+
+#define PassDebugFlags	"DEBUG=$(DEBUG)" \
+	                "CDEBUGFLAGS=$(CDEBUGFLAGS)" \
+	                "CXXDEBUGFLAGS=$(CXXDEBUGFLAGS)" \
+			"F90DEBUGFLAGS=$(F90DEBUGFLAGS)" \
+			"F77DEBUGFLAGS=$(F77DEBUGFLAGS)"
+
+#define ExtraOptions "CCOPTIONS=$(CCOPTIONS)"
+
+INCLIST1 = exodusII.h exodusII_int.h 
+INCLIST2 = exodusII_int.inc exodusII.inc
+
+SUBDIRS = cbind/include \
+	  cbind/src \
+	  forbind/include \
+	  forbind/src \
+	  cbind/test \
+	  forbind/test
+
+#if Build64BitAccess == YES
+AllTarget(libexodus.a libexoIIv2for.a libexoIIv2for32.a)
+#else
+AllTarget(libexodus.a libexoIIv2for.a)
+#endif
+
+InstallSubdirIncludeList(makeincludes,cbind/include,$(INCLIST1),$(INCDIR))
+
+InstallSubdirIncludeList(makeincludes,forbind/include,$(INCLIST2),$(INCDIR))
+
+/* Directory for exodusII c library */
+NamedTargetSubdirs(libexodus.a,cbind/src,"making exodus ",PassDebugFlags ExtraOptions,all)
+
+/* Directory for exodusII fortran wrappers */
+NamedTargetSubdirs(libexoIIv2for.a,forbind/src,"making exoIIv2for ",PassDebugFlags ExtraOptions,libexoIIv2for.a)
+
+#if Build64BitAccess == YES
+NamedTargetSubdirs(libexoIIv2for32.a,forbind/src,"making exoIIv2for32 ",PassDebugFlags ExtraOptions,libexoIIv2for32.a)
+#endif
+
+InstallLibrary(exodus,$(LIBDIR))
+InstallLibrary(exoIIv2for,$(LIBDIR))
+InstallLibraryAlias(exodus,exoIIv2c,$(LIBDIR))
+
+#if Build64BitAccess == YES
+InstallLibrary(exoIIv2for32,$(LIBDIR))
+#endif
+
+check: test
+test:: libexodus.a libexoIIv2for.a
+
+NamedMakeSubdirs(test,cbind/test)
+NamedMakeSubdirs(test,forbind/test)
+DependSubdirs($(SUBDIRS))
diff --git a/exodus/Makefile.standalone b/exodus/Makefile.standalone
new file mode 100644
index 0000000..299f72b
--- /dev/null
+++ b/exodus/Makefile.standalone
@@ -0,0 +1,177 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+#========================================================================
+# A platform must define:
+#
+# CC == the C compiler
+# FC == the Fortran compiler
+# CCOPTIONS == non-optimization related flags for C compiling on this platform
+# F77OPTIONS == non-optimization related flags for Fortran compiling on this platform
+# RANLIB == ranlib or 'true' if no ranlib
+# AR == command to build an archive library.
+#
+#========================================================================
+
+SYSTEM := $(shell uname)
+
+# Set this to yes if your netcdf is compiled with the netcdf4 extensions
+# which require linking with hdf5.  It is assumed that the netcdf and hdf5
+# library and include paths are the same.
+
+#========================================================================
+#       Netcdf
+#========================================================================
+USING_NETCDF4 = "YES"
+
+NETCDF = /Users/gdsjaar/src/SEACAS
+NETCDF_INC = -I$(NETCDF)/include
+NETCDF_LIB = -L$(NETCDF)/lib -lnetcdf
+NCDUMP = ${NETCDF}/bin/ncdump
+
+ifeq ($(USING_NETCDF4), "YES")
+LDFLAGS = -L$(NETCDF)/lib -lnetcdf -lhdf5_hl -lhdf5 -lm -lz
+else
+NETCDF_YES_NO = -DNOT_NETCDF4
+LDFLAGS = -L$(NETCDF)/lib -lnetcdf
+endif
+
+#========================================================================
+#       Darwin (Apple OSX)
+#========================================================================
+ifeq ($(SYSTEM),Darwin)
+RANLIB = ranlib
+
+AR        = ar -crsv
+CC        = /opt/local/bin/gcc-mp-4.8
+FC        = /opt/local/bin/gfortran-mp-4.8
+CCOPTIONS  = -DADDC_
+F77OPTIONS =
+F77PREC    = -fdefault-real-8 -fdefault-integer-8 
+endif
+#========================================================================
+
+#========================================================================
+#       Linux
+#========================================================================
+ifeq ($(SYSTEM),Linux)
+
+# Default Compiler:
+COMPILER = GNU
+
+RANLIB = ranlib
+
+AR        = ar -rcv
+
+ifeq ($(COMPILER),Portland)
+CC       = pgcc
+FC       = pgf77
+CCOPTIONS  = -Mframe -DADDC_
+F77OPTIONS = -fast
+F77PREC    = -r8 -i8
+endif
+
+ifeq ($(COMPILER),Intel)
+CC       = icc
+FC       = ifort
+CCOPTIONS  = -Xc -DADDC_
+F77PREC    = -r8 -i8
+endif
+
+ifeq ($(COMPILER),GNU)
+CC	= gcc
+FC      = gfortran
+CCOPTIONS  = -O2 -Wall -DADDC_
+F77OPTIONS = -O2
+F77PREC    = -fdefault-real-8 -fdefault-integer-8 
+endif
+
+endif
+
+
+OPTIMIZE_FLAG = -O2
+STD_DEFINES = -DVERBOSE
+
+
+CFLAGS = $(OPTIMIZE_FLAG) $(CCOPTIONS) $(STD_DEFINES) $(LOC_EXOII_INC) $(NETCDF_INC) $(NETCDF_YES_NO)
+FFLAGS = $(OPTIMIZE_FLAG) $(F77OPTIONS) $(LOC_EXOII_INC)
+
+# Use include files locates in exodusii/cbind/include
+LOC_EXOII_INC = -I../../cbind/include -I../../forbind/include
+
+
+
+SUBDIRS = cbind/src forbind/src cbind/test forbind/test
+
+all:: libexodus.a libexoIIv2for.a libexoIIv2for32.a
+
+libexodus.a::
+	echo "making exodus in cbind/src"
+	(cd cbind/src &&  $(MAKE) $(MFLAGS) -f Makefile.standalone "AR=$(AR)" "CC=$(CC)" "CFLAGS=$(CFLAGS)" "RANLIB=$(RANLIB)" libexodus.a)
+	cp cbind/src/libexodus.a .
+	$(RANLIB) libexodus.a
+
+libexoIIv2for.a::
+	echo "making exoIIv2for in forbind/src"
+	(cd forbind/src &&  $(MAKE) $(MFLAGS) -f Makefile.standalone "AR=$(AR)"  "CC=$(CC)" "CFLAGS=$(CFLAGS)" "FC=$(FC)" "FFLAGS=$(FFLAGS)" "RANLIB=$(RANLIB)" "SYSTEM=$(SYSTEM)" libexoIIv2for.a)
+	cp forbind/src/libexoIIv2for.a .
+	$(RANLIB) libexoIIv2for.a
+
+libexoIIv2for32.a::
+	echo "making exoIIv2for32 in forbind/src"
+	(cd forbind/src &&  $(MAKE) $(MFLAGS) -f Makefile.standalone "AR=$(AR)"  "CC=$(CC)" "CFLAGS=$(CFLAGS)" "FC=$(FC)" "FFLAGS=$(FFLAGS)" "RANLIB=$(RANLIB)" "SYSTEM=$(SYSTEM)" libexoIIv2for32.a)
+	cp forbind/src/libexoIIv2for32.a .
+	$(RANLIB) libexoIIv2for32.a
+
+check: test
+test:: libexodus.a libexoIIv2for.a 
+
+test::
+	echo "making test in cbind/test"
+	(cd cbind/test &&  $(MAKE) $(MFLAGS) -f Makefile.standalone "AR=$(AR)" "CC=$(CC)" "CFLAGS=$(CFLAGS)" "LDFLAGS=$(LDFLAGS)" "RANLIB=$(RANLIB)" "NCDUMP=$(NCDUMP)" all)
+
+test::
+	echo "making test in forbind/test"
+	(cd forbind/test &&  $(MAKE) $(MFLAGS) -f Makefile.standalone "AR=$(AR)"  "CC=$(CC)" "CFLAGS=$(CFLAGS)" "FC=$(FC)" "FFLAGS=$(FFLAGS)" "LDFLAGS=$(LDFLAGS)" "RANLIB=$(RANLIB)" "NCDUMP=$(NCDUMP)" all)
+
+clean::
+	@for flag in $(MAKEFLAGS) ''; do \
+	case "$$flag" in *=*) ;; *[ik]*) set +e;; esac; done; \
+	for i in $(SUBDIRS) ;\
+	do \
+	if test -d $$i; then \
+	echo "cleaning" "in $(CURRENT_DIR)/$$i..."; \
+	(cd $$i &&  $(MAKE) -f Makefile.standalone $(MFLAGS) 	 clean); \
+	fi; \
+	done
+
diff --git a/exodus/README b/exodus/README
new file mode 100644
index 0000000..5390bd2
--- /dev/null
+++ b/exodus/README
@@ -0,0 +1,84 @@
+========================================================================
+CONTACT:
+
+Greg Sjaardema,
+Sandia National Laboratories,
+gdsjaar at sandia.gov
+
+========================================================================
+LICENSE:
+The Exodus library is licensed under the terms of the BSD License. 
+
+Legal stuff (copyright, licensing restrictions, etc.) can be found in
+the file COPYRIGHT which contains:
+
+1. The Sandia Corporation Copyright Notice.
+2. The BSD License.
+
+We appreciate feedback from users of this package.  Please send
+comments, suggestions, and bug reports to Greg Sjaardema
+<gdsjaar at sandia.gov>.
+
+Please identify the version of the package.
+
+========================================================================
+BUILDING
+
+There are 4 methods for building exodus.
+
+1. CMAKE: Edit the cmake-script file to update library and install paths.
+   The type 'sh cmake-script' to generate the Makefiles
+   followed by 'make' and then 'make install'
+
+2. SEAMS/SEACAS Build system which is based on imake.  If you have a
+   SEAMS or SEACAS installation, you can use its build system.  In the
+   top-level exodus directory, do 'accmkmf' followed by 'make
+   Makefiles' and then 'make'
+
+3. Makefile.standalone.  Edit the top-level Makefile.standalone file
+   and specify the compiler and other options as detailed in the
+   file. Then, do "make -f Makefile.standalone".
+
+4. Building in the Trilinos system as part of the seacas package. 
+   See the Trilinos documentation for more details.
+
+Once you have built the library, you can test it by typing "make
+check"
+
+
+========================================================================
+NETCDF
+
+The exodus library uses the netcdf library for low-level data
+storage.
+
+Exodus requires NetCDF version 4.2.1.1 or later.
+
+The netcdf library must be modified slightly in order to handle the
+exodus datamodel. The specific changes are:
+
+1. include/netcdf.h -- Modify the following defines:
+
+#define NC_MAX_DIMS	65536	 /* max dimensions per file */
+#define NC_MAX_VARS	524288	 /* max variables per file */
+#define NC_MAX_VAR_DIMS	8        /* max per variable dimensions */
+
+If these changes are not made, the exodus library will still function
+for "normal" size models, but it will fail for "large" models. The
+error message from exodus/netcdf should be somewhat clear when this
+happens... 
+
+2. I typically configure netcdf as follows:
+
+./configure --enable-netcdf-4 --disable-fsync --disable-dap --disable-cdmremote 
+
+Replace "--enable-netcdf-4" with "--disable-netcdf-4" to not use the
+netcdf4 extensions. They are not necessarily needed for exodus, but
+will provide compression, larger model sizes, and may be faster in
+some cases.
+
+3. When running the netcdf tests, you may have to do "unlimit
+stacksize" (csh/tcsh) to avoid some failures due to the increased define sizes
+above.
+
+========================================================================
diff --git a/exodus/README.PYTHON b/exodus/README.PYTHON
new file mode 100644
index 0000000..5fef5ff
--- /dev/null
+++ b/exodus/README.PYTHON
@@ -0,0 +1,19 @@
+The exodus.py.in file is a python interface or module for accessing
+exodus file data.  It is currently not integrated into any of the
+exodus build systems, but can be used after some simple editting.
+
+The changes needed are:
+0. Build exodus as a shareable library:
+   -- Make sure "-DBUILD_SHARED=ON" is set in cmake-script or given as
+      an option to the cmake process
+   -- Make sure NETCDF_SO_ROOT points to the location of the netcdf 
+      shareable library.
+   -- Set "PYTHON_INSTALL" to the path where the exodus.py module should be
+      installed.
+
+1. Configure and make the exodus libraries:
+      sh cmake-script
+      make
+      make install
+
+2. Documentation can be generated via "python -m pydoc -w exodus"
diff --git a/exodus/cbind/CMakeLists.txt b/exodus/cbind/CMakeLists.txt
new file mode 100644
index 0000000..9953ec9
--- /dev/null
+++ b/exodus/cbind/CMakeLists.txt
@@ -0,0 +1,309 @@
+
+CONFIGURE_FILE(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/exodusII_cfg.h.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/exodusII_cfg.h
+  @ONLY IMMEDIATE)
+
+INCLUDE_DIRECTORIES(
+  "${CMAKE_CURRENT_SOURCE_DIR}/include"
+  "${CMAKE_CURRENT_BINARY_DIR}/include"
+  "${NETCDF_INCLUDE_DIR}"
+)
+
+SET(cbind_SRCS
+	src/ex_close.c
+	src/ex_conv.c
+	src/ex_copy.c
+	src/ex_create.c
+	src/ex_cvt_nodes_to_sides.c
+	src/ex_err.c
+	src/ex_get_all_times.c
+	src/ex_get_attr.c
+	src/ex_get_attr_names.c
+	src/ex_get_attr_param.c
+	src/ex_get_block.c
+	src/ex_get_block_param.c
+	src/ex_get_cmap_params.c
+	src/ex_get_concat_node_sets.c
+	src/ex_get_concat_sets.c
+	src/ex_get_concat_side_set_node_count.c
+	src/ex_get_concat_side_sets.c
+	src/ex_get_conn.c
+	src/ex_get_coord.c
+	src/ex_get_coord_names.c
+	src/ex_get_coordinate_frames.c
+	src/ex_get_eb_info_global.c
+	src/ex_get_elem_attr.c
+	src/ex_get_elem_attr_names.c
+	src/ex_get_elem_blk_ids.c
+	src/ex_get_elem_block.c
+	src/ex_get_elem_cmap.c
+	src/ex_get_elem_conn.c
+	src/ex_get_elem_map.c
+	src/ex_get_elem_num_map.c
+	src/ex_get_elem_type.c
+	src/ex_get_elem_var.c
+	src/ex_get_elem_var_tab.c
+	src/ex_get_elem_var_time.c
+	src/ex_get_entity_count_per_polyhedra.c
+	src/ex_get_glob_var_time.c
+	src/ex_get_glob_vars.c
+	src/ex_get_id_map.c
+	src/ex_get_ids.c
+	src/ex_get_info.c
+	src/ex_get_init.c
+	src/ex_get_init_ext.c
+	src/ex_get_init_global.c
+	src/ex_get_init_info.c
+	src/ex_get_loadbal_param.c
+	src/ex_get_map.c
+	src/ex_get_map_param.c
+	src/ex_get_n_attr.c
+	src/ex_get_n_conn.c
+	src/ex_get_n_coord.c
+	src/ex_get_n_elem_attr.c
+	src/ex_get_n_elem_conn.c
+	src/ex_get_n_elem_num_map.c
+	src/ex_get_n_elem_var.c
+	src/ex_get_n_nodal_var.c
+	src/ex_get_n_node_num_map.c
+	src/ex_get_n_node_set.c
+	src/ex_get_n_node_set_df.c
+	src/ex_get_n_one_attr.c
+	src/ex_get_n_side_set.c
+	src/ex_get_n_side_set_df.c
+	src/ex_get_n_var.c
+	src/ex_get_name.c
+	src/ex_get_names.c
+	src/ex_get_nodal_var.c
+	src/ex_get_nodal_var_time.c
+	src/ex_get_node_cmap.c
+	src/ex_get_node_map.c
+	src/ex_get_node_num_map.c
+	src/ex_get_node_set.c
+	src/ex_get_node_set_dist_fact.c
+	src/ex_get_node_set_ids.c
+	src/ex_get_node_set_param.c
+	src/ex_get_ns_param_global.c
+	src/ex_get_nset_var.c
+	src/ex_get_nset_var_tab.c
+	src/ex_get_num_map.c
+	src/ex_get_object_truth_vector.c
+	src/ex_get_one_attr.c
+	src/ex_get_one_elem_attr.c
+	src/ex_get_partial_attr.c
+	src/ex_get_partial_conn.c
+	src/ex_get_partial_coord.c
+	src/ex_get_partial_elem_attr.c
+	src/ex_get_partial_elem_conn.c
+	src/ex_get_partial_elem_map.c
+	src/ex_get_partial_elem_num_map.c
+	src/ex_get_partial_elem_var.c
+	src/ex_get_partial_id_map.c
+	src/ex_get_partial_nodal_var.c
+	src/ex_get_partial_node_num_map.c
+	src/ex_get_partial_node_set.c
+	src/ex_get_partial_node_set_df.c
+	src/ex_get_partial_num_map.c
+	src/ex_get_partial_one_attr.c
+	src/ex_get_partial_set_dist_fact.c
+	src/ex_get_partial_side_set.c
+	src/ex_get_partial_side_set_df.c
+	src/ex_get_partial_var.c
+	src/ex_get_processor_elem_maps.c
+	src/ex_get_processor_node_maps.c
+	src/ex_get_prop.c
+	src/ex_get_prop_array.c
+	src/ex_get_prop_names.c
+	src/ex_get_qa.c
+	src/ex_get_set.c
+	src/ex_get_set_dist_fact.c
+	src/ex_get_set_param.c
+	src/ex_get_sets.c
+	src/ex_get_side_set.c
+	src/ex_get_side_set_dist_fact.c
+	src/ex_get_side_set_ids.c
+	src/ex_get_side_set_node_count.c
+	src/ex_get_side_set_node_list.c
+	src/ex_get_side_set_node_list_len.c
+	src/ex_get_side_set_param.c
+	src/ex_get_ss_param_global.c
+	src/ex_get_sset_var.c
+	src/ex_get_sset_var_tab.c
+	src/ex_get_time.c
+	src/ex_get_truth_table.c
+	src/ex_get_var.c
+	src/ex_get_var_name.c
+	src/ex_get_var_names.c
+	src/ex_get_var_param.c
+	src/ex_get_var_tab.c
+	src/ex_get_var_time.c
+	src/ex_get_variable_name.c
+	src/ex_get_variable_names.c
+	src/ex_get_variable_param.c
+	src/ex_inquire.c
+	src/ex_ne_util.c
+	src/ex_open.c
+	src/ex_opts.c
+	src/ex_put_all_var_param.c
+	src/ex_put_all_var_param_ext.c
+	src/ex_put_attr.c
+	src/ex_put_attr_names.c
+	src/ex_put_attr_param.c
+	src/ex_put_block.c
+	src/ex_put_block_param.c
+	src/ex_put_cmap_params.c
+	src/ex_put_cmap_params_cc.c
+	src/ex_put_concat_all_blocks.c
+	src/ex_put_concat_elem_block.c
+	src/ex_put_concat_node_sets.c
+	src/ex_put_concat_sets.c
+	src/ex_put_concat_side_sets.c
+	src/ex_put_concat_var_param.c
+	src/ex_put_conn.c
+	src/ex_put_coord.c
+	src/ex_put_coord_names.c
+	src/ex_put_coordinate_frames.c
+	src/ex_put_eb_info_global.c
+	src/ex_put_elem_attr.c
+	src/ex_put_elem_attr_names.c
+	src/ex_put_elem_block.c
+	src/ex_put_elem_cmap.c
+	src/ex_put_elem_conn.c
+	src/ex_put_elem_map.c
+	src/ex_put_elem_num_map.c
+	src/ex_put_elem_var.c
+	src/ex_put_elem_var_slab.c
+	src/ex_put_elem_var_tab.c
+	src/ex_put_entity_count_per_polyhedra.c
+	src/ex_put_glob_vars.c
+	src/ex_put_id_map.c
+	src/ex_put_info.c
+	src/ex_put_init.c
+	src/ex_put_init_ext.c
+	src/ex_put_init_global.c
+	src/ex_put_init_info.c
+	src/ex_put_loadbal_param.c
+	src/ex_put_loadbal_param_cc.c
+	src/ex_put_map.c
+	src/ex_put_map_param.c
+	src/ex_put_n_attr.c
+	src/ex_put_n_coord.c
+	src/ex_put_n_elem_attr.c
+	src/ex_put_n_elem_conn.c
+	src/ex_put_n_elem_num_map.c
+	src/ex_put_n_nodal_var.c
+	src/ex_put_n_node_num_map.c
+	src/ex_put_n_node_set.c
+	src/ex_put_n_node_set_df.c
+	src/ex_put_n_one_attr.c
+	src/ex_put_n_side_set.c
+	src/ex_put_n_side_set_df.c
+	src/ex_put_n_var.c
+	src/ex_put_name.c
+	src/ex_put_names.c
+	src/ex_put_nodal_var.c
+	src/ex_put_nodal_var_slab.c
+	src/ex_put_node_cmap.c
+	src/ex_put_node_map.c
+	src/ex_put_node_num_map.c
+	src/ex_put_node_set.c
+	src/ex_put_node_set_dist_fact.c
+	src/ex_put_node_set_param.c
+	src/ex_put_ns_param_global.c
+	src/ex_put_nset_var.c
+	src/ex_put_nset_var_tab.c
+	src/ex_put_num_map.c
+	src/ex_put_one_attr.c
+	src/ex_put_one_elem_attr.c
+	src/ex_put_partial_attr.c
+	src/ex_put_partial_coord.c
+	src/ex_put_partial_elem_attr.c
+	src/ex_put_partial_elem_conn.c
+	src/ex_put_partial_elem_map.c
+	src/ex_put_partial_elem_num_map.c
+	src/ex_put_partial_id_map.c
+	src/ex_put_partial_nodal_var.c
+	src/ex_put_partial_node_num_map.c
+	src/ex_put_partial_node_set.c
+	src/ex_put_partial_node_set_df.c
+	src/ex_put_partial_num_map.c
+	src/ex_put_partial_one_attr.c
+	src/ex_put_partial_set.c
+	src/ex_put_partial_set_dist_fact.c
+	src/ex_put_partial_side_set.c
+	src/ex_put_partial_side_set_df.c
+	src/ex_put_partial_var.c
+	src/ex_put_processor_elem_maps.c
+	src/ex_put_processor_node_maps.c
+	src/ex_put_prop.c
+	src/ex_put_prop_array.c
+	src/ex_put_prop_names.c
+	src/ex_put_qa.c
+	src/ex_put_set.c
+	src/ex_put_set_dist_fact.c
+	src/ex_put_set_param.c
+	src/ex_put_sets.c
+	src/ex_put_side_set.c
+	src/ex_put_side_set_dist_fact.c
+	src/ex_put_side_set_param.c
+	src/ex_put_ss_param_global.c
+	src/ex_put_sset_var.c
+	src/ex_put_sset_var_tab.c
+	src/ex_put_time.c
+	src/ex_put_truth_table.c
+	src/ex_put_var.c
+	src/ex_put_var_name.c
+	src/ex_put_var_names.c
+	src/ex_put_var_param.c
+	src/ex_put_var_tab.c
+	src/ex_put_variable_name.c
+	src/ex_put_variable_names.c
+	src/ex_put_variable_param.c
+	src/ex_update.c
+	src/ex_utils.c
+	src/ex_get_block_params.c
+	src/ex_put_block_params.c
+	src/ex_add_attr.c
+)
+
+SET(cbind_HEADERS
+  include/exodusII.h
+  include/exodusII_int.h
+)
+
+IF(APPLE)
+  SET_SOURCE_FILES_PROPERTIES(
+    src/ex_utils.c
+    PROPERTIES
+    COMPILE_FLAGS -fno-common)
+ENDIF(APPLE)
+
+ADD_LIBRARY(exodus ${EXODUS_LIBRARY_TYPE} ${cbind_SRCS})
+
+TARGET_LINK_LIBRARIES(exodus ${NETCDF_LIBRARY} ${HDF5_LIBRARY} ${HDF5HL_LIBRARY} ${ZLIB_LIBRARY} ${CURL} m dl)
+
+IF(MSVC)
+  set_target_properties(exodus PROPERTIES COMPILE_DEFINITIONS _CRT_SECURE_NO_WARNINGS)
+ENDIF(MSVC)
+
+IF(EXODUS_LIBRARY_PROPERTIES)
+  SET_TARGET_PROPERTIES(exodus PROPERTIES ${EXODUS_LIBRARY_PROPERTIES})
+ENDIF(EXODUS_LIBRARY_PROPERTIES)
+
+IF(NOT EXODUS_INSTALL_NO_LIBRARIES)
+  INSTALL(TARGETS exodus
+    RUNTIME DESTINATION lib COMPONENT Runtime
+    LIBRARY DESTINATION lib COMPONENT Runtime
+    ARCHIVE DESTINATION lib COMPONENT Development)
+  INSTALL(FILES ${cbind_HEADERS} DESTINATION include COMPONENT Development)
+ENDIF(NOT EXODUS_INSTALL_NO_LIBRARIES)
+
+
+INCLUDE (${CMAKE_ROOT}/Modules/Dart.cmake)
+
+IF (BUILD_TESTING)
+  ENABLE_TESTING()
+  SUBDIRS(test)
+ENDIF (BUILD_TESTING)
+
diff --git a/exodus/cbind/include/Imakefile b/exodus/cbind/include/Imakefile
new file mode 100644
index 0000000..656d053
--- /dev/null
+++ b/exodus/cbind/include/Imakefile
@@ -0,0 +1,8 @@
+
+INCLIST=exodusII.h exodusII_int.h
+InstallIncludeList(install,$(INCLIST),$(INCDIR))
+
+#if defined(BuildParallelAwareExodus)
+INCLISTP=exodusII_par.h
+InstallIncludeList(install,$(INCLISTP),$(INCDIR))
+#endif
diff --git a/exodus/cbind/include/doxygen.h b/exodus/cbind/include/doxygen.h
new file mode 100644
index 0000000..0098837
--- /dev/null
+++ b/exodus/cbind/include/doxygen.h
@@ -0,0 +1,286 @@
+/*!  \mainpage ExodusII API Documentation
+
+\section intro Introduction
+
+EXODUS is the successor of the widely used finite element (FE) data file format EXODUS
+(henceforth referred to as EXODUS I) developed by Mills-Curran and Flanagan. It
+continues the concept of a common database for multiple application codes (mesh generators,
+analysis codes, visualization software, etc.) rather than code-specific utilities, affording
+flexibility and robustness for both the application code developer and application code user.
+By using the EXODUS data model, a user inherits the flexibility of using a large array of
+application codes (including vendor-supplied codes) which access this common data file
+directly or via translators.
+
+The uses of the EXODUS data model include the following:
+    - Problem definition -- mesh generation, specification of locations of boundary conditions and load application, specification of material types.
+    - Simulation -- model input and results output.
+    - Visualization -- model verification, results postprocessing, data interrogation, and analysis tracking.
+
+\section avail License and Availability
+The EXODUS library is licensed under the BSD open source license.
+
+Copyright (c) 2005 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000
+with Sandia Corporation, the U.S. Government retains certain rights in this software.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted
+provided that the following conditions are met:
+  - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+  - Redistributions in binary form must reproduce the above copyright notice, this list
+of conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution.
+  -Neither the name of Sandia Corporation nor the names of its contributors may be
+used to endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The ExodusII library source code is available on Sourceforge at
+http://sourceforge.net/projects/exodusii
+
+For bug reports, documentation errors, and enhancement suggestions, contact:
+- Gregory D. Sjaardema
+- PHONE: (505) 844-2701
+- EMAIL: gdsjaar at sandia.gov
+
+\section devel Development of EXODUS
+
+The evolution of the EXODUS data model has been steered by FE application code developers
+who desire the advantages of a common data format. The EXODUS model has been
+designed to overcome deficiencies in the EXODUS I file format and meet the following
+functional requirements as specified by these developers:
+   - Random read/write access.
+   - Application programming interface (API) -- provide routines callable from FORTRAN, C, and C++ application codes.
+   - Extensible -- allow new data objects to be added without modifying the application programs that use the file format.
+   - Machine independent -- data should be independent of the machine which generated it.
+   - Real-time access during analysis -- allow access to the data in a file while the file is
+being created.
+
+To address these requirements, the open source database library
+etCDF (http://www.unidata.ucar.edu/software/netcdf/) was selected to handle the low-level data storage. The EXODUS
+II library functions provide the mapping between FE data objects and
+netCDF dimensions, attributes, and variables. Thus, the code developer
+interacts with the data model using the vocabulary of an FE analyst
+(element connectivity, nodal coordinates, etc.) and is relieved of the
+details of the data access mechanism. 
+
+Because an EXODUS file is a netCDF file, an application program can
+access data via the EXODUS API or the netCDF API directly. Although
+accessing the data directly via the netCDF API requires more in-depth
+understanding of netCDF, this capability is a powerful feature that
+allows the development of auxiliary libraries of special purpose
+functions not offered in the standard EXODUS library. For example,
+if an application required access to the coordinates of a single node
+(the standard library function returns the coordinates for all of the
+nodes in the model), a simple function could be written that calls
+netCDF routines directly to read the data of interest.
+
+\section descrip Description of Data Objects
+
+The data in EXODUS files can be divided into three primary
+categories: initialization data, model, and results.
+
+Initialization data includes sizing parameters (number of nodes,
+number of elements, etc.), optional quality assurance information
+(names of codes that have operated on the data), and optional
+informational text.
+
+The model is described by data which are static (do not change through
+time). These data include nodal coordinates, element connectivity
+(node lists for each element), element attributes, and node sets and
+side sets (used to aid in applying loading conditions and boundary
+constraints).
+
+The results are optional and include five types of variables -- nodal,
+element, nodeset, sideset, and global -- each of which is stored
+through time. Nodal results are output (at each time step) for all the
+nodes in the model. An example of a nodal variable is displacement in
+the X direction. Element, nodeset, and sideset results are output (at
+each time step) for all entities (elements, nodes, sides) in one or
+more entity block. For example, stress may be an element
+variable. Another use of element variables is to record element status
+(a binary flag indicating whether each element is "alive" or "dead")
+through time. Global results are output (at each time step) for a
+single element or node, or for a single property. Linear momentum of a
+structure and the acceleration at a particular point are both examples
+of global variables.  Although these examples correspond to typical FE
+applications, the data format is flexible enough to accommodate a
+spectrum of uses.
+
+A few conventions and limitations must be cited:
+
+ - There are no restrictions on the frequency of results output except
+ that the time value associated with each successive time step must
+ increase monotonically.
+ - To output results at different frequencies (i.e., variable A at
+ every simulation time step, variable B at every other time step)
+ multiple EXODUS files must be used.
+ - There are no limits to the number of each type of results, but once
+ declared, the number cannot change.
+ - If the mesh geometry or topology changes in time (i.e., number of
+ nodes increases, connectivity changes), then the new geometrymust be
+ output to a new EXODUS file.
+
+\section int64 Integer Bulkdata Storage Details
+
+The EXODUS database can store integer bulk data, entity map data, and
+mesh entity (block/set) ids in either 32-bit or 64-bit integer format. The data
+considered "bulk data" are:
+
+ - element, face, and edge connectivity lists,
+ - element, face, edge, and node set entity lists,
+
+The entity map data is any data stored in one of the 'map' objects on
+the exodus file.  This includes:
+ - id maps
+ - number maps
+ - order maps
+ - processor node maps
+ - processor element maps.
+
+A mesh entity id is the id of any block (element block, edge block,
+...); set (node set, face set, ...), coordinate frame, and
+communication map.
+
+When an EXODUS file is created via the ex_create() function, the
+'mode' argument provides the mechanism for specifying how integer data
+will be passed as arguments to the API functions and also how the
+integer data will be stored on the database. The ex_open() function
+also provides a mechanism for specifying how integer data will be
+passed as arguments. 
+
+The method uses the 'mode' argument to the ex_open() and
+ex_create() functions.  The mode is a 32-bit integer in which certain
+bits are turned on by or'ing certain predefined constants.  
+
+exoid = ex_create( EX_TEST_FILENAME,
+		   EX_CLOBBER|EX_MAPS_INT64_DB|EX_MAPS_INT64_API,
+		   &appWordSize, &diskWordSize );
+
+The constants related to the integer size (32-bit or 64-bit)
+specification are:
+
+- EX_MAPS_INT64_DB   -- entity map data
+- EX_IDS_INT64_DB    -- mesh entity ids
+- EX_BULK_INT64_DB   -- bulk data
+- EX_ALL_INT64_DB    -- (the above 3 or'd together)
+- EX_MAPS_INT64_API  -- entity map data
+- EX_IDS_INT64_API   -- mesh entity ids
+- EX_BULK_INT64_API  -- bulk data
+- EX_ALL_INT64_API   -- (the above 3 or'd together)
+
+The constants that end with "_DB" specify that that particular integer
+data is stored on the database as 64-bit integers; the constants that
+end with "_API" specify that that particular integer data is passed
+to/from API functions as 64-bit integers.  
+
+If the range of the data being transmitted is larger than the
+permitted integer range (for example, if the data is stored on the
+database as 64-bit ints and the application specifies passing data as
+32-bit ints), the api function will return an error.
+
+The three types of integer data whose storage can be specified are
+- maps (EX_MAPS_INT64_),
+- "bulk data" including connectivity lists and entity lists (EX_BULK_INT64_), and 
+- entity ids which are the ids of element, face, edge, and node sets
+   and blocks; and map ids (EX_IDS_INT64_)
+
+The function ex_int64_status(exoid) is used to determine the integer
+storage types being used for the EXODUS database 'exoid'.  It returns
+an integer which can be and'ed with the above flags to determine
+either the storage type or function parameter type. 
+
+For example, if
+(EX_MAPS_INT64_DB \& ex_int64_status(exoid)) is true, then map data is
+being stored as 64-bit integers for that database.
+
+It is not possible to determine the integer data size on a database
+without opening the database via an ex_open() call. However, the
+integer size specification for API functions can be changed at any
+time via the ex_set_int64_status(exoid, mode) function. The mode is
+one or more of EX_MAPS_INT64_API, EX_IDS_INT64_API, or
+EX_BULK_INT64_API, or'd together.  Any exodus function calls after
+that point will use the specified integer size. Note that a call to
+ex_set_int64_status(exoid, mode) overrides any previous setting for
+the integer sizes used in the API.  The ex_create() function is the
+only way to specify the integer sizes specification for database
+integers.
+
+\subsection int64_fortran_api Fortran API
+The fortran api is uses the same mechanism as was described above for
+the C API. If using the "8-byte real and 8-byte int" fortran mode
+typically used by the SEACAS applications (the compiler automatically
+promotes all integers and reals to 8-byte quantities), then the
+fortran exodus library will automatically enable the *_API
+options; the client still needs to specify the *_DB options.
+
+\subsection int64_fortran_imp Fortran Implementation
+
+The new capability to pass 64-bit integer data through the fortran and
+C API functions simplifies the implementation of the "8-byte real
+8-byte int" usage of the exodus library. Previously, the wrapper
+routines in addrwrap.F were required to convert the 8-byte integer
+data on the client side to/from 4-byte integers on the library
+side. This required extra memory allocation and complications that are
+now handled at the lowest level in the netcdf library.  The
+map-related functions in the fortran api have all been converted to
+pass 64-bit integers down to the C API which has removed some code and
+simplified those functions.
+
+
+\section Database Options (Compression, Name Length, File Type)
+
+The ex_set_option() function call is used to set various options on the
+database.  Valid values for 'option' are:
+
+|   Option Name          | Option Values
+-------------------------|---------------
+| EX_OPT_MAX_NAME_LENGTH | Maximum length of names that will be returned/passed via api call.
+| EX_OPT_COMPRESSION_TYPE | Not currently used; default is gzip
+| EX_OPT_COMPRESSION_LEVEL | In the range [0..9]. A value of 0 indicates no compression
+| EX_OPT_COMPRESSION_SHUFFLE | 1 if enabled, 0 if disabled
+| EX_OPT_INTEGER_SIZE_API | 4 or 8 indicating byte size of integers used in api functions.
+| EX_OPT_INTEGER_SIZE_DB  | Query only, returns 4 or 8 indicating byte size of integers stored on database.
+
+The compression-related options are only available on netcdf-4 files
+since the underlying hdf5 compression functionality is used for the
+implementation. The compression level indicates how much effort should
+be expended in the compression and the computational expense increases
+with higher levels; in many cases, a compression level of 1 is
+sufficient. 
+
+\defgroup ResultsData Results Data
+@{
+ This section describes data file utility functions for creating /
+ opening a file, initializing a file with global parameters, reading /
+ writing information text, inquiring on parameters stored in the data
+ file, and error reporting.
+@}
+
+\defgroup Utilities Data File Utilities
+  @{
+This section describes data file utility functions for creating /
+opening a file, initializing a file with global parameters, reading /
+writing information text, inquiring on parameters stored in the data
+file, and error reporting.
+  @}
+
+\defgroup ModelDescription Model Description
+  @{
+The routines in this section read and write information which 
+describe an exodus finite element model. This includes nodal 
+coordinates, element order map, element connectivity arrays, 
+element attributes, node sets, side sets, and object properties.
+  @}
+
+
+*/
diff --git a/exodus/cbind/include/exodusII.h b/exodus/cbind/include/exodusII.h
new file mode 100644
index 0000000..1f07898
--- /dev/null
+++ b/exodus/cbind/include/exodusII.h
@@ -0,0 +1,2012 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+ *
+ * exodusII.h - Exodus II API include file
+ *
+ *****************************************************************************/
+
+#ifndef EXODUS_II_HDR
+#define EXODUS_II_HDR
+
+#include "netcdf.h"
+
+#if defined(PARALLEL_AWARE_EXODUS)
+#include "netcdf_par.h"
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdint.h>
+
+#ifndef NC_INT64
+#error "NetCDF version 4.1.2 or later is required."
+#endif
+
+/* EXODUS II version number */
+#define EX_API_VERS 6.09f
+#define EX_API_VERS_NODOT 609
+#define EX_VERS EX_API_VERS
+#define NEMESIS_API_VERSION		EX_API_VERS
+#define NEMESIS_API_VERSION_NODOT	EX_API_VERS_NODOT
+#define NEMESIS_FILE_VERSION		2.6 
+
+/*
+ * need following extern if this include file is used in a C++
+ * program, to keep the C++ compiler from mangling the function names.
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  /*
+   * The following are miscellaneous constants used in the EXODUS II
+   * API. They should already be defined, but are left over from the
+   * old days...
+   */
+#ifndef EX_TRUE
+#define EX_TRUE -1
+#endif
+
+#ifndef EX_FALSE
+#define EX_FALSE 0 
+#endif
+
+  /**
+   * \defgroup FileVars Variables controlling the file creation mode.
+   *@{
+   */
+  /* Modes for ex_open */
+#define EX_WRITE                0x0001 /**< ex_open(): open existing file for appending. */
+#define EX_READ                 0x0002 /**< ex_open(): open file for reading (default) */
+
+#define EX_NOCLOBBER            0x0004 /**< Don't overwrite existing database, default */
+#define EX_CLOBBER              0x0008 /**< Overwrite existing database if it exists */
+#define EX_NORMAL_MODEL         0x0010 /**< disable mods that permit storage of larger models */
+#define EX_LARGE_MODEL          0x0020 /**< enable mods that permit storage of larger models */
+#define EX_NETCDF4              0x0040 /**< use the hdf5-based netcdf4 output */
+#define EX_NOSHARE              0x0080  /**< Do not open netcdf file in "share" mode */
+#define EX_SHARE                0x0100 /**< Do open netcdf file in "share" mode */
+#define EX_NOCLASSIC            0x0200 /**< Do not force netcdf to classic mode in netcdf4 mode */
+
+  /* Need to distinguish between storage on database (DB in name) and
+     passed through the API functions (API in name).
+  */
+#define EX_MAPS_INT64_DB        0x0400 /**< All maps (id, order, ...) store int64_t values */
+#define EX_IDS_INT64_DB         0x0800 /**< All entity ids (sets, blocks, maps) are int64_t values */
+#define EX_BULK_INT64_DB        0x1000 /**< All integer bulk data (local indices, counts, maps); not ids */
+#define EX_ALL_INT64_DB         (EX_MAPS_INT64_DB|EX_IDS_INT64_DB|EX_BULK_INT64_DB) /**< All of the above... */
+
+#define EX_MAPS_INT64_API       0x2000 /**< All maps (id, order, ...) store int64_t values */
+#define EX_IDS_INT64_API        0x4000 /**< All entity ids (sets, blocks, maps) are int64_t values */
+#define EX_BULK_INT64_API       0x8000 /**< All integer bulk data (local indices, counts, maps); not ids */
+#define EX_INQ_INT64_API       0x10000 /**< Integers passed to/from ex_inquire are int64_t */
+#define EX_ALL_INT64_API        (EX_MAPS_INT64_API|EX_IDS_INT64_API|EX_BULK_INT64_API|EX_INQ_INT64_API) /**< All of the above... */
+
+  /* Parallel IO mode flags... */
+#define EX_MPIIO               0x20000
+#define EX_MPIPOSIX            0x40000
+#define EX_PNETCDF             0x80000
+  
+  /*@}*/
+  
+  /*! \sa ex_inquire() */
+  enum ex_inquiry {
+    EX_INQ_FILE_TYPE       =  1,     /**< inquire EXODUS II file type*/
+    EX_INQ_API_VERS        =  2,     /**< inquire API version number */
+    EX_INQ_DB_VERS         =  3,     /**< inquire database version number */
+    EX_INQ_TITLE           =  4,     /**< inquire database title     */
+    EX_INQ_DIM             =  5,     /**< inquire number of dimensions */
+    EX_INQ_NODES           =  6,     /**< inquire number of nodes    */
+    EX_INQ_ELEM            =  7,     /**< inquire number of elements */
+    EX_INQ_ELEM_BLK        =  8,     /**< inquire number of element blocks */
+    EX_INQ_NODE_SETS       =  9,     /**< inquire number of node sets*/
+    EX_INQ_NS_NODE_LEN     = 10,     /**< inquire length of node set node list */
+    EX_INQ_SIDE_SETS       = 11,     /**< inquire number of side sets*/
+    EX_INQ_SS_NODE_LEN     = 12,     /**< inquire length of side set node list */
+    EX_INQ_SS_ELEM_LEN     = 13,     /**< inquire length of side set element list */
+    EX_INQ_QA              = 14,     /**< inquire number of QA records */
+    EX_INQ_INFO            = 15,     /**< inquire number of info records */
+    EX_INQ_TIME            = 16,     /**< inquire number of time steps in the database */
+    EX_INQ_EB_PROP         = 17,     /**< inquire number of element block properties */
+    EX_INQ_NS_PROP         = 18,     /**< inquire number of node set properties */
+    EX_INQ_SS_PROP         = 19,     /**< inquire number of side set properties */
+    EX_INQ_NS_DF_LEN       = 20,     /**< inquire length of node set distribution factor list*/
+    EX_INQ_SS_DF_LEN       = 21,     /**< inquire length of side set distribution factor list*/
+    EX_INQ_LIB_VERS        = 22,     /**< inquire API Lib vers number*/
+    EX_INQ_EM_PROP         = 23,     /**< inquire number of element map properties */
+    EX_INQ_NM_PROP         = 24,     /**< inquire number of node map properties */
+    EX_INQ_ELEM_MAP        = 25,     /**< inquire number of element maps */
+    EX_INQ_NODE_MAP        = 26,     /**< inquire number of node maps*/
+    EX_INQ_EDGE            = 27,     /**< inquire number of edges    */
+    EX_INQ_EDGE_BLK        = 28,     /**< inquire number of edge blocks */
+    EX_INQ_EDGE_SETS       = 29,     /**< inquire number of edge sets   */
+    EX_INQ_ES_LEN          = 30,     /**< inquire length of concat edge set edge list       */
+    EX_INQ_ES_DF_LEN       = 31,     /**< inquire length of concat edge set dist factor list*/
+    EX_INQ_EDGE_PROP       = 32,     /**< inquire number of properties stored per edge block    */
+    EX_INQ_ES_PROP         = 33,     /**< inquire number of properties stored per edge set      */
+    EX_INQ_FACE            = 34,     /**< inquire number of faces */
+    EX_INQ_FACE_BLK        = 35,     /**< inquire number of face blocks */
+    EX_INQ_FACE_SETS       = 36,     /**< inquire number of face sets */
+    EX_INQ_FS_LEN          = 37,     /**< inquire length of concat face set face list */
+    EX_INQ_FS_DF_LEN       = 38,     /**< inquire length of concat face set dist factor list*/
+    EX_INQ_FACE_PROP       = 39,     /**< inquire number of properties stored per face block */
+    EX_INQ_FS_PROP         = 40,     /**< inquire number of properties stored per face set */
+    EX_INQ_ELEM_SETS       = 41,     /**< inquire number of element sets */
+    EX_INQ_ELS_LEN         = 42,     /**< inquire length of concat element set element list       */
+    EX_INQ_ELS_DF_LEN      = 43,     /**< inquire length of concat element set dist factor list*/
+    EX_INQ_ELS_PROP        = 44,     /**< inquire number of properties stored per elem set      */
+    EX_INQ_EDGE_MAP        = 45,     /**< inquire number of edge maps                     */
+    EX_INQ_FACE_MAP        = 46,     /**< inquire number of face maps                     */
+    EX_INQ_COORD_FRAMES    = 47,     /**< inquire number of coordinate frames */
+    EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH  = 48,     /**< inquire size of MAX_NAME_LENGTH dimension on database */
+    EX_INQ_DB_MAX_USED_NAME_LENGTH  = 49,     /**< inquire size of MAX_NAME_LENGTH dimension on database */
+    EX_INQ_MAX_READ_NAME_LENGTH = 50,     /**< inquire client-specified max size of returned names */
+
+    EX_INQ_DB_FLOAT_SIZE = 51,      /**< inquire size of floating-point values stored on database */
+    EX_INQ_NUM_CHILD_GROUPS= 52,     /**< inquire number of groups contained in this (exoid) group */
+    EX_INQ_GROUP_PARENT    = 53,     /**< inquire id of parent of this (exoid) group; returns exoid if at root */
+    EX_INQ_GROUP_ROOT      = 54,     /**< inquire id of root group "/" of this (exoid) group; returns exoid if at root */
+    EX_INQ_GROUP_NAME_LEN  = 55,     /**< inquire length of name of group exoid */
+    EX_INQ_GROUP_NAME      = 56,     /**< inquire name of group exoid. "/" returned for root group */
+    EX_INQ_FULL_GROUP_NAME_LEN = 57, /**< inquire length of full path name of this (exoid) group */
+    EX_INQ_FULL_GROUP_NAME = 58,     /**< inquire full "/"-separated path name of this (exoid) group */
+    EX_INQ_INVALID         = -1};
+
+  typedef enum ex_inquiry ex_inquiry;
+  
+  /* Options */
+  /**
+   * \defgroup FileOptions Variables controlling the compression, name size, and integer size.
+   *@{
+   */
+  /* Modes for ex_open */
+  /*! \sa ex_set_option() */
+  enum ex_option_type {
+    EX_OPT_MAX_NAME_LENGTH = 1,
+    EX_OPT_COMPRESSION_TYPE,     /* Currently not used. GZip by default */
+    EX_OPT_COMPRESSION_LEVEL,    /* 0 (disabled/fastest) ... 9 (best/slowest) */
+    EX_OPT_COMPRESSION_SHUFFLE,  /* 0 (disabled); 1 (enabled) */
+    EX_OPT_INTEGER_SIZE_API,     /* See *_INT64_* values above */
+    EX_OPT_INTEGER_SIZE_DB /* (query only) */
+  };
+  typedef enum ex_option_type ex_option_type;
+  /*@}*/
+  
+  enum ex_entity_type {
+    EX_NODAL       = 14,          /**< nodal "block" for variables*/
+    EX_NODE_BLOCK  = 14,          /**< alias for EX_NODAL         */
+    EX_NODE_SET    =  2,          /**< node set property code     */
+    EX_EDGE_BLOCK  =  6,          /**< edge block property code   */
+    EX_EDGE_SET    =  7,          /**< edge set property code     */
+    EX_FACE_BLOCK  =  8,          /**< face block property code   */
+    EX_FACE_SET    =  9,          /**< face set property code     */
+    EX_ELEM_BLOCK  =  1,          /**< element block property code*/
+    EX_ELEM_SET    = 10,          /**< face set property code     */
+    
+    EX_SIDE_SET    =  3,          /**< side set property code     */
+    
+    EX_ELEM_MAP    =  4,          /**< element map property code  */
+    EX_NODE_MAP    =  5,          /**< node map property code     */
+    EX_EDGE_MAP    = 11,          /**< edge map property code     */
+    EX_FACE_MAP    = 12,          /**< face map property code     */
+    
+    EX_GLOBAL      = 13,          /**< global "block" for variables*/
+    EX_COORDINATE  = 15,          /**< kluge so some internal wrapper functions work */
+    EX_INVALID     = -1};             
+  typedef enum ex_entity_type ex_entity_type;
+  
+  /**
+   * ex_opts() function codes - codes are OR'ed into exopts
+   */
+  enum ex_options {
+    EX_DEFAULT  = 0,
+    EX_VERBOSE  = 1,  /**< verbose mode message flag   */
+    EX_DEBUG    = 2,  /**< debug mode def             */
+    EX_ABORT    = 4,   /**< abort mode flag def        */
+    EX_NULLVERBOSE = 8 /**< verbose mode for null entity detection warning */
+  };
+  typedef enum ex_options ex_options;
+  
+  /** The value used to indicate that an entity (block, nset, sset)
+      has not had its id set to a valid value
+  */
+#define EX_INVALID_ID -1
+
+  /**
+   * \defgroup StringLengths maximum string lengths;
+   * constants that are used as netcdf dimensions must be of type long
+   * @{ 
+   */
+  /** Maximum length of QA record, element type name */
+#define MAX_STR_LENGTH          32L 
+  /** Maximum length of an entity name, attribute name, variable name */
+#define MAX_NAME_LENGTH         MAX_STR_LENGTH
+  
+  /** Maximum length of the database title or an information record */
+#define MAX_LINE_LENGTH         80L
+  /** Maximum length of an error message passed to ex_err() function. Typically, internal use only */
+#define MAX_ERR_LENGTH          256
+  /* @} */
+
+  /** Specifies that this argument is the id of an entity: element block, nodeset, sideset, ... */
+  typedef int64_t ex_entity_id;
+  
+  /** The mechanism for passing double/float and int/int64_t both use a
+     void*; to avoid some confusion as to whether a function takes an
+     integer or a float/double, the following typedef is used for the
+     integer argument
+  */
+  typedef void void_int;
+  
+  /**
+   * \defgroup APIStructs Structures used by external API functions.
+   * @{
+   */
+  typedef struct ex_init_params {
+    char title[MAX_LINE_LENGTH + 1];
+    int64_t num_dim;
+    int64_t num_nodes;
+    int64_t num_edge;
+    int64_t num_edge_blk;
+    int64_t num_face;
+    int64_t num_face_blk;
+    int64_t num_elem;
+    int64_t num_elem_blk;
+    int64_t num_node_sets;
+    int64_t num_edge_sets;
+    int64_t num_face_sets;
+    int64_t num_side_sets;
+    int64_t num_elem_sets;
+    int64_t num_node_maps;
+    int64_t num_edge_maps;
+    int64_t num_face_maps;
+    int64_t num_elem_maps;
+  } ex_init_params;
+
+  typedef struct ex_block {
+    int64_t id;
+    ex_entity_type type;
+    char   topology[MAX_STR_LENGTH+1];
+    int64_t num_entry;
+    int64_t num_nodes_per_entry;
+    int64_t num_edges_per_entry;
+    int64_t num_faces_per_entry;
+    int64_t num_attribute;
+  } ex_block;
+
+  typedef struct ex_set {
+    int64_t id;
+    ex_entity_type type;
+    int64_t num_entry;
+    int64_t num_distribution_factor;
+    void_int* entry_list;
+    void_int* extra_list;
+    void*     distribution_factor_list;
+  } ex_set;
+
+  typedef struct ex_block_params {
+    void_int*  edge_blk_id;
+    char** edge_type;
+    int*   num_edge_this_blk;
+    int*   num_nodes_per_edge;
+    int*   num_attr_edge;
+    void_int*   face_blk_id;
+    char** face_type;
+    int*   num_face_this_blk;
+    int*   num_nodes_per_face;
+    int*   num_attr_face;
+    void_int*   elem_blk_id;
+    char** elem_type;
+    int*   num_elem_this_blk;
+    int*   num_nodes_per_elem;
+    int*   num_edges_per_elem;
+    int*   num_faces_per_elem;
+    int*   num_attr_elem;
+    int    define_maps;
+  } ex_block_params;
+
+  typedef struct ex_set_specs {
+    void_int* sets_ids;
+    void_int* num_entries_per_set;
+    void_int* num_dist_per_set;
+    void_int* sets_entry_index;
+    void_int* sets_dist_index;
+    void_int* sets_entry_list;
+    void_int* sets_extra_list;
+    void* sets_dist_fact;
+  } ex_set_specs;
+
+  typedef struct ex_var_params {
+    int  num_glob;
+    int  num_node;
+    int  num_edge;
+    int  num_face;
+    int  num_elem;
+    int  num_nset;
+    int  num_eset;
+    int  num_fset;
+    int  num_sset;
+    int  num_elset;
+    int* edge_var_tab;
+    int* face_var_tab;
+    int* elem_var_tab;
+    int* nset_var_tab;
+    int* eset_var_tab;
+    int* fset_var_tab;
+    int* sset_var_tab;
+    int* elset_var_tab;
+  } ex_var_params;
+  /* @} */
+
+#ifndef EXODUS_EXPORT
+#define EXODUS_EXPORT extern
+#endif /* EXODUS_EXPORT */
+
+  /* routines for file initialization i/o */
+  EXODUS_EXPORT int ex_close (int exoid);
+
+  EXODUS_EXPORT int ex_copy (int in_exoid, int out_exoid);
+
+#define ex_create(path, mode, comp_ws, io_ws) ex_create_int(path, mode, comp_ws, io_ws, EX_API_VERS_NODOT)  
+
+  EXODUS_EXPORT int ex_create_int (const char *path, int cmode, int *comp_ws, int *io_ws, int my_version);
+
+  EXODUS_EXPORT int ex_create_group (int parent_id, const char *group_name);
+
+  EXODUS_EXPORT int ex_get_group_id(int exoid, const char *group_name, int *group_id);
+
+  EXODUS_EXPORT int ex_get_group_ids(int exoid, int *num_children, int *child_ids);
+  
+  EXODUS_EXPORT int ex_get_all_times (int   exoid,
+				      void *time_values);
+
+  EXODUS_EXPORT int ex_get_coord_names (int    exoid,
+					char **coord_names);
+
+  EXODUS_EXPORT int ex_get_coord (int exoid,
+				  void *x_coor,
+				  void *y_coor,
+				  void *z_coor);
+
+  EXODUS_EXPORT int ex_get_n_coord (int exoid,
+				    int64_t start_node_num,
+				    int64_t  num_nodes,
+				    void *x_coor,
+				    void *y_coor,
+				    void *z_coor);
+
+  EXODUS_EXPORT int ex_get_partial_coord (int exoid,
+				    int64_t start_node_num,
+				    int64_t  num_nodes,
+				    void *x_coor,
+				    void *y_coor,
+				    void *z_coor);
+
+  EXODUS_EXPORT int ex_get_ids (int  exoid,
+				ex_entity_type  obj_type,
+				void_int   *ids);
+
+  EXODUS_EXPORT int ex_get_coordinate_frames(int exoid,
+					     int *nframes,
+					     void_int *cf_ids,
+					     void* pt_coordinates,
+					     char* tags);
+
+  EXODUS_EXPORT int ex_get_glob_vars (int   exoid,
+				      int   time_step,
+				      int   num_glob_vars,
+				      void *glob_var_vals);
+
+  EXODUS_EXPORT int ex_get_glob_var_time (int   exoid,
+					  int   glob_var_index,
+					  int   beg_time_step,
+					  int   end_time_step,
+					  void *glob_var_vals);
+
+  EXODUS_EXPORT int ex_get_info (int exoid, char **info);
+
+  EXODUS_EXPORT int ex_put_init_ext (int exoid,  const ex_init_params *param);
+
+  EXODUS_EXPORT int ex_get_init_ext (int exoid, ex_init_params *param);
+
+  EXODUS_EXPORT int ex_get_init (int   exoid,
+				 char *title,
+				 void_int  *num_dim,
+				 void_int  *num_nodes,
+				 void_int  *num_elem, 
+				 void_int  *num_elem_blk,
+				 void_int  *num_node_sets,
+				 void_int  *num_side_sets);
+
+  EXODUS_EXPORT int ex_put_init (int   exoid,
+				 const char *title,
+				 int64_t   num_dim,
+				 int64_t   num_nodes,
+				 int64_t   num_elem,
+				 int64_t   num_elem_blk,
+				 int64_t   num_node_sets,
+				 int64_t   num_side_sets);
+
+  EXODUS_EXPORT int ex_get_map_param (int   exoid,
+				      int  *num_node_maps,
+				      int  *num_elem_maps);
+
+  EXODUS_EXPORT int ex_get_name (int   exoid,
+				 ex_entity_type   obj_type,
+				 ex_entity_id     entity_id, 
+				 char *name);
+
+  EXODUS_EXPORT int ex_get_names (int exoid,
+				  ex_entity_type obj_type,
+				  char **names);
+
+  EXODUS_EXPORT int ex_get_nset_var_tab (int  exoid,
+					 int  num_nodesets,
+					 int  num_nset_var,
+					 int *nset_var_tab);
+
+  EXODUS_EXPORT int ex_get_n_nodal_var (int   exoid,
+					int   time_step,
+					int   nodal_var_index,
+					int64_t start_node, 
+					int64_t num_nodes, 
+					void *nodal_var_vals);
+
+  EXODUS_EXPORT int ex_get_partial_nodal_var (int   exoid,
+					int   time_step,
+					int   nodal_var_index,
+					int64_t start_node, 
+					int64_t num_nodes, 
+					void *nodal_var_vals);
+
+
+  EXODUS_EXPORT int ex_get_prop_array (int   exoid,
+				       ex_entity_type obj_type,
+				       const char *prop_name,
+				       void_int  *values);
+
+  EXODUS_EXPORT int ex_get_prop (int   exoid,
+				 ex_entity_type obj_type,
+				 ex_entity_id   obj_id,
+				 const char *prop_name,
+				 void_int  *value);
+
+  EXODUS_EXPORT int ex_get_partial_num_map (int   exoid,
+					    ex_entity_type map_type,
+					    ex_entity_id   map_id,
+					    int64_t ent_start,
+					    int64_t ent_count, 
+					    void_int  *elem_map);
+  
+  EXODUS_EXPORT int ex_get_prop_names (int    exoid,
+				       ex_entity_type obj_type,
+				       char **prop_names);
+
+  EXODUS_EXPORT int ex_get_qa (int exoid,
+			       char *qa_record[][4]);
+
+  EXODUS_EXPORT int ex_get_time (int   exoid,
+				 int   time_step,
+				 void *time_value);
+
+  EXODUS_EXPORT int ex_get_variable_names (int   exoid,
+					   ex_entity_type obj_type,
+					   int   num_vars,
+					   char *var_names[]);
+  EXODUS_EXPORT int ex_get_variable_name (int   exoid,
+					  ex_entity_type obj_type,
+					  int   var_num,
+					  char *var_name);
+
+  EXODUS_EXPORT int ex_get_variable_param (int   exoid,
+					   ex_entity_type obj_type,
+					   int  *num_vars);
+
+  EXODUS_EXPORT int ex_get_object_truth_vector (int  exoid,
+						ex_entity_type var_type,
+						ex_entity_id   object_id,
+						int  num_var,
+						int *var_vector);
+
+  EXODUS_EXPORT int ex_get_truth_table (int  exoid,
+					ex_entity_type obj_type,
+					int  num_blk,
+					int  num_var,
+					int *var_tab);
+  
+#define ex_open(path, mode, comp_ws, io_ws, version) ex_open_int(path, mode, comp_ws, io_ws, version, EX_API_VERS_NODOT)  
+
+  EXODUS_EXPORT int ex_open_int (const char  *path,
+				 int    mode,
+				 int   *comp_ws,
+				 int   *io_ws,
+				 float *version, int my_version);
+  
+  EXODUS_EXPORT int ex_add_attr(int exoid,
+				ex_entity_type obj_type,
+				ex_entity_id   obj_id,
+				int64_t     num_attr_per_entry);
+  
+  EXODUS_EXPORT int ex_put_attr_param (int   exoid,
+				       ex_entity_type obj_type,
+				       ex_entity_id   obj_id,
+				       int   num_attrs);
+
+  EXODUS_EXPORT int ex_get_attr_param (int   exoid,
+				       ex_entity_type obj_type,
+				       ex_entity_id   obj_id,
+				       int   *num_attrs);
+
+  EXODUS_EXPORT int ex_put_all_var_param (int exoid,
+					  int num_g, int num_n,
+					  int num_e, int *elem_var_tab,
+					  int num_m, int *nset_var_tab,
+					  int num_s, int *sset_var_tab);
+
+  EXODUS_EXPORT int ex_put_concat_elem_block (int    exoid,
+					      const void_int*   elem_blk_id,
+					      char *elem_type[],
+					      const void_int*   num_elem_this_blk,
+					      const void_int*   num_nodes_per_elem,
+					      const void_int*   num_attr,
+					      int    define_maps);
+
+  EXODUS_EXPORT int ex_put_coord_names (int   exoid,
+					char *coord_names[]);
+
+  EXODUS_EXPORT int ex_put_coord (int   exoid,
+				  const void *x_coor,
+				  const void *y_coor,
+				  const void *z_coor);
+
+  EXODUS_EXPORT int ex_put_n_coord (int   exoid,
+				    int64_t   start_node_num,
+				    int64_t   num_nodes,
+				    const void *x_coor,
+				    const void *y_coor,
+				    const void *z_coor);
+
+  EXODUS_EXPORT int ex_put_partial_coord (int   exoid,
+				    int64_t   start_node_num,
+				    int64_t   num_nodes,
+				    const void *x_coor,
+				    const void *y_coor,
+				    const void *z_coor);
+
+  EXODUS_EXPORT int ex_put_id_map(int exoid,
+				  ex_entity_type obj_type,
+				  const void_int *map);
+  
+  EXODUS_EXPORT int ex_put_partial_id_map(int exoid,
+					  ex_entity_type obj_type,
+					  int64_t   start_entity_num, 
+					  int64_t   num_entities, 
+					  const void_int *map);
+  
+  EXODUS_EXPORT int ex_put_n_elem_num_map (int  exoid,
+					   int64_t  start_ent,
+					   int64_t  num_ents,
+					   const void_int *map);
+
+  EXODUS_EXPORT int ex_put_n_node_num_map (int  exoid,
+					   int64_t  start_ent,
+					   int64_t  num_ents,
+					   const void_int *map);
+
+  EXODUS_EXPORT int ex_put_partial_elem_num_map (int  exoid,
+					   int64_t  start_ent,
+					   int64_t  num_ents,
+					   const void_int *map);
+
+  EXODUS_EXPORT int ex_put_partial_node_num_map (int  exoid,
+					   int64_t  start_ent,
+					   int64_t  num_ents,
+					   const void_int *map);
+
+  EXODUS_EXPORT int ex_get_id_map(int exoid,
+				  ex_entity_type obj_type,
+				  void_int *map);
+  
+  EXODUS_EXPORT int ex_get_partial_id_map (int   exoid,
+					   ex_entity_type map_type,
+					   int64_t   start_entity_num,
+					   int64_t   num_entities,
+					   void_int*  map);
+
+  EXODUS_EXPORT int ex_put_coordinate_frames(int exoid,
+					     int nframes,
+					     const void_int *cf_ids, 
+					     void* pt_coordinates,
+					     const char* tags);
+
+  EXODUS_EXPORT int ex_put_info (int   exoid, 
+				 int   num_info,
+				 char *info[]);
+
+  EXODUS_EXPORT int ex_put_map_param (int   exoid,
+				      int   num_node_maps,
+				      int   num_elem_maps);
+
+  EXODUS_EXPORT int ex_put_name (int   exoid,
+				 ex_entity_type obj_type,
+				 ex_entity_id   entity_id,
+				 const char *name);
+
+  EXODUS_EXPORT int ex_put_names (int   exoid,
+				  ex_entity_type obj_type,
+				  char *names[]);
+
+  EXODUS_EXPORT int ex_put_n_one_attr( int   exoid,
+				       ex_entity_type obj_type,
+				       ex_entity_id   obj_id,
+				       int64_t   start_num,
+				       int64_t   num_ent,
+				       int   attrib_index,
+				       const void *attrib );
+
+  EXODUS_EXPORT int ex_put_partial_one_attr( int   exoid,
+				       ex_entity_type obj_type,
+				       ex_entity_id   obj_id,
+				       int64_t   start_num,
+				       int64_t   num_ent,
+				       int   attrib_index,
+				       const void *attrib );
+
+  EXODUS_EXPORT int ex_put_prop (int   exoid,
+				 ex_entity_type obj_type,
+				 ex_entity_id   obj_id,
+				 const char *prop_name,
+				 ex_entity_id   value);
+
+  EXODUS_EXPORT int ex_put_prop_array (int   exoid,
+				       ex_entity_type obj_type,
+				       const char *prop_name,
+				       const void_int  *values);
+
+  EXODUS_EXPORT int ex_put_prop_names (int   exoid,
+				       ex_entity_type obj_type,
+				       int   num_props,
+				       char **prop_names);
+
+  EXODUS_EXPORT int ex_put_qa (int   exoid,
+			       int   num_qa_records,
+			       char* qa_record[][4]);
+
+  EXODUS_EXPORT int ex_put_time (int   exoid,
+				 int   time_step,
+				 const void *time_value);
+
+  EXODUS_EXPORT int ex_put_variable_name (int   exoid,
+					  ex_entity_type obj_type,
+					  int   var_num,
+					  const char *var_name);
+
+  EXODUS_EXPORT int ex_put_variable_names (int   exoid,
+					   ex_entity_type obj_type,
+					   int   num_vars,
+					   char* var_names[]);
+
+  EXODUS_EXPORT int ex_put_variable_param (int exoid,
+					   ex_entity_type obj_type,
+					   int num_vars);
+
+  EXODUS_EXPORT int ex_put_truth_table (int  exoid,
+					ex_entity_type obj_type,
+					int  num_blk,
+					int  num_var,
+					int *var_tab);
+
+  EXODUS_EXPORT int ex_update (int exoid);
+  EXODUS_EXPORT int ex_get_num_props (int exoid, ex_entity_type obj_type);
+  EXODUS_EXPORT int ex_large_model(int exoid);
+  EXODUS_EXPORT size_t ex_header_size(int exoid);
+
+  EXODUS_EXPORT void ex_err(const char *module_name, const char *message, int err_num);
+  EXODUS_EXPORT void ex_get_err(const char** msg, const char** func, int* errcode);
+  EXODUS_EXPORT int ex_opts(int options);
+  EXODUS_EXPORT int ex_inquire(int exoid, int inquiry, void_int*, float*, char*);
+  EXODUS_EXPORT int64_t ex_inquire_int(int exoid, int inquiry);
+  EXODUS_EXPORT int ex_int64_status(int exoid);
+  EXODUS_EXPORT int ex_set_int64_status(int exoid, int mode);
+
+  /** Note that the max name length setting is global at this time; not specific
+   * to a particular database; however, the exoid option is passed to give
+   * flexibility in the future to implement this on a database-by-database basis.
+   */
+  EXODUS_EXPORT int ex_set_max_name_length(int exoid, int length);
+
+  EXODUS_EXPORT int ex_set_option(int exoid, ex_option_type option, int option_value);
+
+  /*  Write Node Edge Face or Element Number Map */
+  EXODUS_EXPORT int ex_put_num_map(int exoid,
+				   ex_entity_type map_type,
+				   ex_entity_id map_id,
+				   const void_int *map);
+
+  /*  Read Number Map */
+  EXODUS_EXPORT int ex_get_num_map(int exoid,
+				   ex_entity_type map_type,
+				   ex_entity_id map_id,
+				   void_int *map);
+
+  /*  Write Edge Face or Element Block Parameters */
+  EXODUS_EXPORT int ex_put_block(int exoid,
+				 ex_entity_type blk_type,
+				 ex_entity_id   blk_id,
+				 const char *entry_descrip,
+				 int64_t num_entries_this_blk,
+				 int64_t num_nodes_per_entry,
+				 int64_t num_edges_per_entry,
+				 int64_t num_faces_per_entry,
+				 int64_t num_attr_per_entry);
+
+
+  /*! \deprecated Use ex_get_block_param() */
+  EXODUS_EXPORT int ex_get_block(int exoid,
+				 ex_entity_type blk_type,
+				 ex_entity_id   blk_id,
+				 char *elem_type,
+				 void_int *num_entries_this_blk,
+				 void_int *num_nodes_per_entry,
+				 void_int *num_edges_per_entry,
+				 void_int *num_faces_per_entry,
+				 void_int *num_attr_per_entry);
+
+  /*  Read Edge Face or Element Block Parameters */
+  EXODUS_EXPORT int ex_get_block_param(int exoid,
+				       ex_block *block);
+
+  EXODUS_EXPORT int ex_put_block_param(int exoid,
+				       const ex_block block);
+
+  EXODUS_EXPORT int ex_get_block_params(int exoid,
+					size_t block_count,
+					struct ex_block **blocks);
+
+  EXODUS_EXPORT int ex_put_block_params(int exoid,
+					size_t block_count,
+					const struct ex_block *blocks);
+
+  /*  Write All Edge Face and Element Block Parameters */
+  EXODUS_EXPORT int ex_put_concat_all_blocks(int exoid,
+					     const ex_block_params *param);
+
+  EXODUS_EXPORT int ex_put_entity_count_per_polyhedra(int exoid,
+						      ex_entity_type blk_type,
+						      ex_entity_id   blk_id,
+						      const int *entity_counts);
+
+  EXODUS_EXPORT int ex_get_entity_count_per_polyhedra(int exoid,
+						      ex_entity_type blk_type,
+						      ex_entity_id   blk_id,
+						      int *entity_counts);
+
+  /*  Write Edge Face or Element Block Connectivity */
+  EXODUS_EXPORT int ex_put_conn(int exoid,
+				ex_entity_type blk_type,
+				ex_entity_id   blk_id,
+				const void_int *node_conn,
+				const void_int *elem_edge_conn,
+				const void_int *elem_face_conn);
+
+  /*  Read Edge Face or Element Block Connectivity */
+  EXODUS_EXPORT int ex_get_conn(int exoid,
+				ex_entity_type blk_type,
+				ex_entity_id   blk_id,
+				void_int *nodeconn,
+				void_int *edgeconn,
+				void_int *faceconn);
+
+  /*  Read Partial Edge Face or Element Block Connectivity */
+  EXODUS_EXPORT int ex_get_n_conn(int exoid,
+				  ex_entity_type blk_type,
+				  ex_entity_id   blk_id,
+				  int64_t start_num,
+				  int64_t num_ent,
+				  void_int *nodeconn,
+				  void_int *edgeconn,
+				  void_int *faceconn);
+
+  EXODUS_EXPORT int ex_get_partial_conn(int exoid,
+				  ex_entity_type blk_type,
+				  ex_entity_id   blk_id,
+				  int64_t start_num,
+				  int64_t num_ent,
+				  void_int *nodeconn,
+				  void_int *edgeconn,
+				  void_int *faceconn);
+
+  /*  Write Edge Face or Element Block Attributes */
+  EXODUS_EXPORT int ex_put_attr(int exoid,
+				ex_entity_type blk_type,
+				ex_entity_id   blk_id,
+				const void *attrib);
+
+  EXODUS_EXPORT int ex_put_partial_attr (int   exoid,
+					 ex_entity_type blk_type,
+					 ex_entity_id   blk_id,
+					 int64_t   start_entity,
+					 int64_t   num_entity,
+					 const void *attrib);
+
+  /*  Read Edge Face or Element Block Attributes */
+  EXODUS_EXPORT int ex_get_attr(int exoid,
+				ex_entity_type obj_type,
+				ex_entity_id   obj_id,
+				void *attrib);
+
+  EXODUS_EXPORT int ex_get_n_attr(int exoid,
+				  ex_entity_type obj_type,
+				  ex_entity_id   obj_id,
+				  int64_t start_num,
+				  int64_t num_ent,
+				  void *attrib);
+
+  EXODUS_EXPORT int ex_get_partial_attr(int exoid,
+				  ex_entity_type obj_type,
+				  ex_entity_id   obj_id,
+				  int64_t start_num,
+				  int64_t num_ent,
+				  void *attrib);
+
+  /*  Write One Edge Face or Element Block Attribute */
+  EXODUS_EXPORT int ex_put_one_attr(int exoid,
+				    ex_entity_type obj_type,
+				    ex_entity_id   obj_id,
+				    int attrib_index,
+				    const void *attrib);
+
+  /*  Read One Edge Face or Element Block Attribute */
+  EXODUS_EXPORT int ex_get_one_attr(int exoid,
+				    ex_entity_type obj_type,
+				    ex_entity_id   obj_id,
+				    int attrib_index,
+				    void *attrib);
+
+  /*  Read One Edge Face or Element Block Attribute */
+  EXODUS_EXPORT int ex_get_n_one_attr(int exoid,
+				      ex_entity_type obj_type,
+				      ex_entity_id   obj_id,
+				      int64_t start_num,
+				      int64_t num_ent,
+				      int attrib_index,
+				      void *attrib);
+
+  EXODUS_EXPORT int ex_get_partial_one_attr(int exoid,
+				      ex_entity_type obj_type,
+				      ex_entity_id   obj_id,
+				      int64_t start_num,
+				      int64_t num_ent,
+				      int attrib_index,
+				      void *attrib);
+
+  /*  Write Edge Face or Element Block Attribute Names */
+  EXODUS_EXPORT int ex_put_attr_names(int exoid,
+				      ex_entity_type blk_type,
+				      ex_entity_id   blk_id,
+				      char **names);
+
+  /*  Read Edge Face or Element Block Attribute Names */
+  EXODUS_EXPORT int ex_get_attr_names(int exoid,
+				      ex_entity_type obj_type,
+				      ex_entity_id   obj_id,
+				      char **names);
+
+  /*  Write Node Edge Face or Side Set Parameters */
+  EXODUS_EXPORT int ex_put_set_param(int exoid,
+				     ex_entity_type set_type,
+				     ex_entity_id   set_id,
+				     int64_t num_entries_in_set,
+				     int64_t num_dist_fact_in_set);
+
+  /*  Read Node Edge Face or Side Set Parameters */
+  EXODUS_EXPORT int ex_get_set_param(int exoid,
+				     ex_entity_type set_type,
+				     ex_entity_id   set_id,
+				     void_int *num_entry_in_set,
+				     void_int *num_dist_fact_in_set);
+
+  /*  Write a Node Edge Face or Side Set */
+  EXODUS_EXPORT int ex_put_set(int exoid,
+			       ex_entity_type set_type,
+			       ex_entity_id   set_id,
+			       const void_int *set_entry_list,
+			       const void_int *set_extra_list);
+
+  EXODUS_EXPORT int ex_put_partial_set(int exoid,
+				       ex_entity_type set_type,
+				       ex_entity_id   set_id,
+				       int64_t offset,
+				       int64_t count,
+				       const void_int *set_entry_list,
+				       const void_int *set_extra_list);
+
+  /*  Read a Node Edge Face or Side Set */
+  EXODUS_EXPORT int ex_get_set(int exoid,
+			       ex_entity_type set_type,
+			       ex_entity_id   set_id,
+			       void_int *set_entry_list,
+			       void_int *set_extra_list);
+
+  /*  Write Node Edge Face or Side Set Distribution Factors */
+  EXODUS_EXPORT int ex_put_set_dist_fact(int exoid,
+					 ex_entity_type set_type,
+					 ex_entity_id   set_id,
+					 const void *set_dist_fact);
+
+  /*  Read Node Edge Face or Side Set Distribution Factors */
+  EXODUS_EXPORT int ex_get_set_dist_fact(int exoid,
+					 ex_entity_type set_type,
+					 ex_entity_id   set_id,
+					 void *set_dist_fact);
+
+  EXODUS_EXPORT int ex_get_partial_set_dist_fact (int   exoid,
+						  ex_entity_type set_type,
+						  ex_entity_id   set_id,
+						  int64_t   offset,
+						  int64_t   num_to_put,
+						  void *set_dist_fact);
+
+  /*  Write Concatenated Node Edge Face or Side Sets */
+  EXODUS_EXPORT int ex_put_concat_sets(int exoid,
+				       ex_entity_type set_type,
+				       const struct ex_set_specs *set_specs);
+
+  /*  Read Concatenated Node Edge Face or Side Sets */
+  EXODUS_EXPORT int ex_get_concat_sets(int exoid,
+				       ex_entity_type set_type,
+				       struct ex_set_specs *set_specs);
+
+  /*  Write Concatenated Node Edge Face or Side Sets */
+  EXODUS_EXPORT int ex_put_sets(int exoid,
+				size_t set_count,
+				const struct ex_set *sets);
+
+  /*  Read Concatenated Node Edge Face or Side Sets */
+  EXODUS_EXPORT int ex_get_sets(int exoid,
+				size_t set_count,
+				struct ex_set *sets);
+
+  /*  (MODIFIED) Write All Results Variables Parameters */
+  EXODUS_EXPORT int ex_put_all_var_param_ext(int exoid,
+					     const ex_var_params *vp);
+
+  /*  Write Edge Face or Element Variable Values on Blocks or Sets at a Time Step */
+  EXODUS_EXPORT int ex_put_var(int exoid,
+			       int time_step,
+			       ex_entity_type var_type,
+			       int var_index,
+			       ex_entity_id   obj_id,
+			       int64_t num_entries_this_obj,
+			       const void *var_vals);
+
+  /*  Write Partial Edge Face or Element Variable Values on Blocks or Sets at a Time Step */
+  EXODUS_EXPORT int ex_put_n_var(int exoid,
+				 int time_step,
+				 ex_entity_type var_type,
+				 int var_index,
+				 ex_entity_id   obj_id,
+				 int64_t start_index,
+				 int64_t num_entities,
+				 const void *var_vals);
+
+  EXODUS_EXPORT int ex_put_partial_var(int exoid,
+				 int time_step,
+				 ex_entity_type var_type,
+				 int var_index,
+				 ex_entity_id   obj_id,
+				 int64_t start_index,
+				 int64_t num_entities,
+				 const void *var_vals);
+
+  /*  Read Edge Face or Element Variable Values Defined On Blocks or Sets at a Time Step */
+  EXODUS_EXPORT int ex_get_var(int exoid,
+			       int time_step,
+			       ex_entity_type var_type,
+			       int var_index,
+			       ex_entity_id obj_id,
+			       int64_t num_entry_this_obj,
+			       void *var_vals);
+
+  /*  Read Partial Edge Face or Element Variable Values on Blocks or Sets at a Time Step */
+  EXODUS_EXPORT int ex_get_n_var(int exoid,
+				 int time_step,
+				 ex_entity_type var_type,
+				 int var_index,
+				 ex_entity_id   obj_id,
+				 int64_t start_index,
+				 int64_t num_entities,
+				 void *var_vals);
+
+  EXODUS_EXPORT int ex_get_n_elem_var (int   exoid,
+				       int   time_step,
+				       int   elem_var_index,
+				       ex_entity_id elem_blk_id,
+				       int64_t num_elem_this_blk,
+				       int64_t start_elem_num,
+				       int64_t num_elem,
+				       void *elem_var_vals);
+
+  EXODUS_EXPORT int ex_get_partial_var(int exoid,
+				 int time_step,
+				 ex_entity_type var_type,
+				 int var_index,
+				 ex_entity_id   obj_id,
+				 int64_t start_index,
+				 int64_t num_entities,
+				 void *var_vals);
+
+  EXODUS_EXPORT int ex_get_partial_elem_var (int   exoid,
+				       int   time_step,
+				       int   elem_var_index,
+				       ex_entity_id elem_blk_id,
+				       int64_t num_elem_this_blk,
+				       int64_t start_elem_num,
+				       int64_t num_elem,
+				       void *elem_var_vals);
+
+  /*  Read Edge Face or Element Variable Values Defined On Blocks or Sets Through Time */
+  EXODUS_EXPORT int ex_get_var_time(int exoid,
+				    ex_entity_type var_type,
+				    int var_index,
+				    int64_t id,
+				    int beg_time_step,
+				    int end_time_step,
+				    void *var_vals);
+
+  EXODUS_EXPORT int ex_cvt_nodes_to_sides(int exoid,
+					  void_int *num_elem_per_set,
+					  void_int *num_nodes_per_set,
+					  void_int *side_sets_elem_index,
+					  void_int *side_sets_node_index,
+					  void_int *side_sets_elem_list,
+					  void_int *side_sets_node_list,
+					  void_int *side_sets_side_list);
+
+  /* Can be replaced by ex_put_var ... */
+  EXODUS_EXPORT int ex_put_nodal_var (int   exoid,
+				      int   time_step,
+				      int   nodal_var_index,
+				      int64_t   num_nodes, 
+				      const void *nodal_var_vals);
+
+  EXODUS_EXPORT int ex_put_n_nodal_var (int   exoid,
+					int   time_step,
+					int   nodal_var_index,
+					int64_t   start_node, 
+					int64_t   num_nodes, 
+					const void *nodal_var_vals);
+
+  EXODUS_EXPORT int ex_put_partial_nodal_var (int   exoid,
+					int   time_step,
+					int   nodal_var_index,
+					int64_t   start_node, 
+					int64_t   num_nodes, 
+					const void *nodal_var_vals);
+
+  EXODUS_EXPORT int ex_get_partial_elem_map (int   exoid,
+					     ex_entity_id   map_id,
+					     int64_t ent_start,
+					     int64_t ent_count, 
+					     void_int  *elem_map);
+
+  EXODUS_EXPORT int ex_put_partial_elem_map (int   exoid,
+					     ex_entity_id   map_id,
+					     int64_t ent_start,
+					     int64_t ent_count, 
+					     const void_int  *elem_map);
+
+  EXODUS_EXPORT int ex_put_partial_num_map (int   exoid,
+					    ex_entity_type map_type,
+					    ex_entity_id   map_id,
+					    int64_t ent_start,
+					    int64_t ent_count, 
+					    const void_int  *map);
+
+  EXODUS_EXPORT int ex_put_partial_set_dist_fact (int   exoid,
+						  ex_entity_type set_type,
+						  ex_entity_id   set_id,
+						  int64_t   offset,
+						  int64_t   num_to_put,
+						  const void *set_dist_fact);
+
+  /* TODO */
+  EXODUS_EXPORT int ex_get_concat_side_set_node_count(int exoid,
+						      int *side_set_node_cnt_list);
+
+  /* TODO */
+  EXODUS_EXPORT int ex_get_side_set_node_list_len(int exoid,
+						  ex_entity_id side_set_id,
+						  void_int *side_set_node_list_len);
+
+  /* TODO */
+  EXODUS_EXPORT int ex_get_side_set_node_count(int exoid,
+					       ex_entity_id side_set_id,
+					       int *side_set_node_cnt_list);
+
+  /* TODO */
+  EXODUS_EXPORT int ex_get_side_set_node_list(int exoid,
+					      ex_entity_id side_set_id,
+					      void_int *side_set_node_cnt_list,
+					      void_int *side_set_node_list);
+
+  /* ========================================================================
+     Functions pulled from nemesis library and incorporated into exodus...
+  */
+/*=============================================================================
+ *     Initial Information Routines
+ *===========================================================================*/
+EXODUS_EXPORT int
+ex_get_init_info(int   exoid,		/* NemesisI file ID */
+                 int  *num_proc,	/* Number of processors */
+                 int  *num_proc_in_f,	/* Number of procs in this file */
+                 char *ftype
+                 );
+
+EXODUS_EXPORT int
+ex_put_init_info(int   exoid,		/* NemesisI file ID */
+                 int   num_proc,	/* Number of processors */
+                 int   num_proc_in_f,	/* Number of procs in this file */
+                 char *ftype
+                 );
+
+EXODUS_EXPORT int
+ex_get_init_global(int   exoid, 		  /* NemesisI file ID */
+                   void_int  *num_nodes_g,	  /* Number of global FEM nodes */
+                   void_int  *num_elems_g,	  /* Number of global FEM elements */
+                   void_int  *num_elem_blks_g, /* Number of global elem blocks */
+                   void_int  *num_node_sets_g, /* Number of global node sets */
+                   void_int  *num_side_sets_g  /* Number of global side sets */
+                   );
+EXODUS_EXPORT int
+ex_put_init_global(int exoid, 		/* NemesisI file ID */
+                   int64_t num_nodes_g,	/* Number of global FEM nodes */
+                   int64_t num_elems_g,	/* Number of global FEM elements */
+                   int64_t num_elem_blks_g,	/* Number of global elem blocks */
+                   int64_t num_node_sets_g,	/* Number of global node sets */
+                   int64_t num_side_sets_g	/* Number of global side sets */
+                   );
+
+/*=============================================================================
+ *     Loadbalance Parameter Routines
+ *===========================================================================*/
+EXODUS_EXPORT int
+ex_get_loadbal_param(int   exoid, 	/* NetCDF/Exodus file ID */
+                     void_int  *num_int_nodes,  /* Number of internal FEM nodes */
+                     void_int  *num_bor_nodes,  /* Number of border FEM nodes */
+                     void_int  *num_ext_nodes,  /* Number of external FEM nodes */
+                     void_int  *num_int_elems,  /* Number of internal FEM elems */
+                     void_int  *num_bor_elems,  /* Number of border FEM elems */
+                     void_int  *num_node_cmaps, /* Number of nodal comm maps */
+                     void_int  *num_elem_cmaps, /* Number of elemental comm maps */
+                     int   processor         /* Processor ID */
+                     );
+
+EXODUS_EXPORT int
+ex_put_loadbal_param(int   exoid, 	  /* NemesisI file ID  */
+                     int64_t   num_int_nodes, /* Number of internal FEM nodes */
+                     int64_t   num_bor_nodes, /* Number of border FEM nodes */
+                     int64_t   num_ext_nodes, /* Number of external FEM nodes */
+                     int64_t   num_int_elems, /* Number of internal FEM elems */
+                     int64_t   num_bor_elems, /* Number of border FEM elems */
+                     int64_t   num_node_cmaps,/* Number of nodal comm maps */
+                     int64_t   num_elem_cmaps,/* Number of elemental comm maps */
+                     int       processor	  /* Processor ID */
+                     );
+
+EXODUS_EXPORT int
+ex_put_loadbal_param_cc(int   exoid,		/* NetCDF/Exodus file ID */
+                        void_int  *num_int_nodes,  /* Number of internal node IDs */
+                        void_int  *num_bor_nodes,  /* Number of border node IDs */
+                        void_int  *num_ext_nodes,  /* Number of external node IDs */
+                        void_int  *num_int_elems,  /* Number of internal elem IDs */
+                        void_int  *num_bor_elems,  /* Number of border elem IDs */
+                        void_int  *num_node_cmaps, /* Number of nodal comm maps */
+                        void_int  *num_elem_cmaps  /* Number of elem comm maps */
+                        );
+
+/*=============================================================================
+ *     NS, SS & EB Global Parameter Routines
+ *===========================================================================*/
+EXODUS_EXPORT int
+ex_get_ns_param_global(int exoid,	         /* NetCDF/Exodus file ID */
+                       void_int *ns_ids_glob,    /* Global IDs of node sets */
+                       void_int *ns_n_cnt_glob,  /* Count of nodes in node sets */
+                       void_int *ns_df_cnt_glob  /* Count of dist. factors in ns */
+                       );
+
+EXODUS_EXPORT int
+ex_put_ns_param_global(int exoid, 	         /* NemesisI file ID */
+                       void_int *global_ids,	 /* Vector of global node-set IDs */
+                       void_int *global_n_cnts,  /* Vector of node counts in node-sets */
+                       void_int *global_df_cnts  /* Vector of dist factor counts in node-sets */
+                       );
+
+EXODUS_EXPORT int
+ex_get_ss_param_global(int exoid,	    /* NetCDF/Exodus file ID */
+                       void_int *ss_ids_glob,    /* Global side-set IDs */
+                       void_int *ss_s_cnt_glob,  /* Global side count */
+                       void_int *ss_df_cnt_glob  /* Global dist. factor count */
+                       );
+
+EXODUS_EXPORT int
+ex_put_ss_param_global(int exoid, 	    /* NemesisI file ID */
+                       void_int *global_ids,	    /* Vector of global side-set IDs */
+                       void_int *global_el_cnts, /* Vector of element/side */
+					    /* counts in each side set */
+                       void_int *global_df_cnts  /* Vector of dist. factor */
+					    /* counts in each side set */
+                       );
+
+EXODUS_EXPORT int
+ex_get_eb_info_global(int exoid,		/* NemesisI file ID                 */
+                      void_int *el_blk_ids,	/* Vector of global element IDs     */
+                      void_int *el_blk_cnts	/* Vector of global element counts  */
+                      );
+
+EXODUS_EXPORT int
+ex_put_eb_info_global(int exoid,		/* NemesisI file ID */
+                      void_int *el_blk_ids,	/* Vector of global element IDs     */
+                      void_int *el_blk_cnts	/* Vector of global element counts  */
+                      );
+
+/*=============================================================================
+ *     NS, SS & EB Subset Routines
+ *===========================================================================*/
+EXODUS_EXPORT int
+ex_get_n_side_set(int  exoid,		    /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,	    /* Side-set ID to read */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,	    /* Number of sides to read */
+                  void_int *side_set_elem_list,  /* List of element IDs */
+                  void_int *side_set_side_list   /* List of side IDs */
+                  );
+
+EXODUS_EXPORT int
+ex_put_n_side_set(int  exoid,                /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,         /* Side-set ID to write */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,           /* Number of sides to write */
+                  const void_int *side_set_elem_list,  /* List of element IDs */
+                  const void_int *side_set_side_list   /* List of side IDs */
+                  );
+
+EXODUS_EXPORT int
+ex_get_n_side_set_df(int   exoid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,		/* Side-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *side_set_df 		/* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_put_n_side_set_df(int   exoid,                /* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,         /* Side-set ID */
+                     int64_t   start_num,           /* Starting df number */
+                     int64_t   num_df_to_get,       /* Number of df's to write */
+                     void *side_set_df          /* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_get_n_node_set(int  exoid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start reading at */
+                  int64_t  num_node,	   /* Number of nodes to read */
+                  void_int *node_set_node_list  /* List of nodes in node set */
+                  );
+
+EXODUS_EXPORT int
+ex_put_n_node_set(int  exoid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start writing at */
+                  int64_t  num_node,	   /* Number of nodes to write */
+                  const void_int *node_set_node_list  /* List of nodes in node set */
+                  );
+
+EXODUS_EXPORT int
+ex_get_n_node_set_df(int   exoid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *node_set_df 		/* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_put_n_node_set_df(int   exoid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to write */
+                     void *node_set_df 		/* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_get_n_elem_conn (int   exoid,		  /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	  /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to read from */
+                    int64_t   num_elems,	  /* Number of elements to read */
+                    void_int  *connect	  /* Connectivity vector */
+                    );
+
+EXODUS_EXPORT int
+ex_put_n_elem_conn (int   exoid,           /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,    /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to write to */
+                    int64_t   num_elems,      /* Number of elements to write */
+                    const void_int  *connect         /* Connectivity vector */
+);
+
+EXODUS_EXPORT int
+ex_get_n_elem_attr (int   exoid,		   /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	   /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to read from */
+                    int64_t   num_elems,	   /* Number of elements to read */
+                    void *attrib	   /* Attribute */
+                    );
+
+EXODUS_EXPORT int
+ex_put_n_elem_attr (int   exoid,            /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,     /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to write to */
+                    int64_t   num_elems,       /* Number of elements to write */
+                    void *attrib           /* Attribute */
+                    );
+EXODUS_EXPORT int
+ex_get_partial_side_set(int  exoid,		    /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,	    /* Side-set ID to read */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,	    /* Number of sides to read */
+                  void_int *side_set_elem_list,  /* List of element IDs */
+                  void_int *side_set_side_list   /* List of side IDs */
+                  );
+
+EXODUS_EXPORT int
+ex_put_partial_side_set(int  exoid,                /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,         /* Side-set ID to write */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,           /* Number of sides to write */
+                  const void_int *side_set_elem_list,  /* List of element IDs */
+                  const void_int *side_set_side_list   /* List of side IDs */
+                  );
+
+EXODUS_EXPORT int
+ex_get_partial_side_set_df(int   exoid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,		/* Side-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *side_set_df 		/* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_put_partial_side_set_df(int   exoid,                /* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,         /* Side-set ID */
+                     int64_t   start_num,           /* Starting df number */
+                     int64_t   num_df_to_get,       /* Number of df's to write */
+                     void *side_set_df          /* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_get_partial_node_set(int  exoid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start reading at */
+                  int64_t  num_node,	   /* Number of nodes to read */
+                  void_int *node_set_node_list  /* List of nodes in node set */
+                  );
+
+EXODUS_EXPORT int
+ex_put_partial_node_set(int  exoid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start writing at */
+                  int64_t  num_node,	   /* Number of nodes to write */
+                  const void_int *node_set_node_list  /* List of nodes in node set */
+                  );
+
+EXODUS_EXPORT int
+ex_get_partial_node_set_df(int   exoid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *node_set_df 		/* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_put_partial_node_set_df(int   exoid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to write */
+                     void *node_set_df 		/* Distribution factors */
+                     );
+
+EXODUS_EXPORT int
+ex_get_partial_elem_conn (int   exoid,		  /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	  /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to read from */
+                    int64_t   num_elems,	  /* Number of elements to read */
+                    void_int  *connect	  /* Connectivity vector */
+                    );
+
+EXODUS_EXPORT int
+ex_put_partial_elem_conn (int   exoid,           /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,    /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to write to */
+                    int64_t   num_elems,      /* Number of elements to write */
+                    const void_int  *connect         /* Connectivity vector */
+);
+
+EXODUS_EXPORT int
+ex_get_partial_elem_attr (int   exoid,		   /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	   /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to read from */
+                    int64_t   num_elems,	   /* Number of elements to read */
+                    void *attrib	   /* Attribute */
+                    );
+
+EXODUS_EXPORT int
+ex_put_partial_elem_attr (int   exoid,            /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,     /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to write to */
+                    int64_t   num_elems,       /* Number of elements to write */
+                    void *attrib           /* Attribute */
+                    );
+
+EXODUS_EXPORT int
+ex_get_elem_type(int   exoid,            /* NetCDF/Exodus file ID */
+                 ex_entity_id   elem_blk_id,     /* Element block ID */
+                 char *elem_type        /* The name of the element type */
+                 );
+
+/*=============================================================================
+ *     Variable Routines
+ *===========================================================================*/
+EXODUS_EXPORT int
+ex_put_elem_var_slab (int   exoid,           /* NetCDF/Exodus file ID */
+                      int   time_step,      /* time index */
+                      int   elem_var_index, /* elemental variable index */
+                      ex_entity_id   elem_blk_id,    /* elemental block id */
+                      int64_t   start_pos,      /* Starting position to write to */
+                      int64_t   num_vals,       /* Number of elements to write */
+                      void *elem_var_vals   /* variable values */
+                      );
+
+EXODUS_EXPORT int
+ex_put_nodal_var_slab(int   exoid,            /* NetCDF/Exodus file ID */
+                      int   time_step,       /* The time step index */
+                      int   nodal_var_index, /* Nodal variable index */
+                      int64_t   start_pos,       /* Start position for write */
+                      int64_t   num_vals,        /* Number of nodal variables */
+                      void *nodal_var_vals   /* Nodal variable values */
+                      );
+
+/*=============================================================================
+ *     Number Map Routines
+ *===========================================================================*/
+EXODUS_EXPORT int
+ex_get_n_elem_num_map (int  exoid,           /* NetCDF/Exodus file ID */
+                       int64_t  start_ent,      /* Starting position to read from */
+                       int64_t  num_ents,       /* Number of elements to read */
+                       void_int *elem_map        /* element map numbers */
+                       );
+
+EXODUS_EXPORT int
+ex_get_n_node_num_map(int   exoid,	     /* NetCDF/Exodus file ID */
+                      int64_t   start_ent,       /* starting node number */
+                      int64_t   num_ents,        /* number of nodes to read */
+                      void_int  *node_map         /* vector for node map */
+                      );
+
+EXODUS_EXPORT int
+ex_get_partial_elem_num_map (int  exoid,           /* NetCDF/Exodus file ID */
+                       int64_t  start_ent,      /* Starting position to read from */
+                       int64_t  num_ents,       /* Number of elements to read */
+                       void_int *elem_map        /* element map numbers */
+                       );
+
+EXODUS_EXPORT int
+ex_get_partial_node_num_map(int   exoid,	     /* NetCDF/Exodus file ID */
+                      int64_t   start_ent,       /* starting node number */
+                      int64_t   num_ents,        /* number of nodes to read */
+                      void_int  *node_map         /* vector for node map */
+                      );
+
+EXODUS_EXPORT int
+ex_get_processor_node_maps(int   exoid,		/* NetCDF/Exodus file ID */
+			   void_int  *node_mapi,	/* Internal FEM node IDs */
+			   void_int  *node_mapb,	/* Border FEM node IDs */
+			   void_int  *node_mape,	/* External FEM node IDs */
+			   int   processor		/* Processor IDs */
+			   );
+
+EXODUS_EXPORT int
+ex_put_processor_node_maps(int   exoid,		/* NetCDF/Exodus file ID */
+			   void_int  *node_mapi,	/* Internal FEM node IDs */
+			   void_int  *node_mapb,	/* Border FEM node IDs */
+			   void_int  *node_mape,	/* External FEM node IDs */
+			   int   processor		/* This processor ID */
+			   );
+
+EXODUS_EXPORT int
+ex_get_processor_elem_maps(int   exoid,		/* NetCDF/Exodus file ID */
+			   void_int  *elem_mapi,	/* Internal element IDs */
+			   void_int  *elem_mapb,	/* Border element IDs */
+			   int   processor		/* Processor ID */
+			   );
+
+EXODUS_EXPORT int
+ex_put_processor_elem_maps(int   exoid,		/* NetCDF/Exodus file ID */
+			   void_int  *elem_mapi,	/* Internal FEM element IDs */
+			   void_int  *elem_mapb,	/* Border FEM element IDs */
+			   int   processor		/* This processor ID */
+			   );
+
+
+/*=============================================================================
+ *     Communications Maps Routines
+ *===========================================================================*/
+
+EXODUS_EXPORT int
+ex_get_cmap_params(int exoid,                  /* NetCDF/Exodus file ID */
+                   void_int *node_cmap_ids,        /* Nodal comm. map IDs */
+                   void_int *node_cmap_node_cnts,  /* Number of nodes in each map */
+                   void_int *elem_cmap_ids,        /* Elemental comm. map IDs */
+                   void_int *elem_cmap_elem_cnts,  /* Number of elems in each map */
+                   int  processor             /* This processor ID */
+                   );
+
+EXODUS_EXPORT int
+ex_put_cmap_params(int  exoid,			/* NetCDF/Exodus file ID */
+                   void_int *node_map_ids,	/* Node map IDs */
+                   void_int *node_map_node_cnts,/* Nodes in nodal comm */
+                   void_int *elem_map_ids,	/* Elem map IDs */
+                   void_int *elem_map_elem_cnts,/* Elems in elemental comm */
+                   int64_t   processor		/* This processor ID */
+                   );
+
+EXODUS_EXPORT int
+ex_put_cmap_params_cc(int  exoid,		/* NetCDF/Exodus file ID */
+                      void_int *node_map_ids,	/* Node map IDs */
+                      void_int *node_map_node_cnts,	/* Nodes in nodal comm */
+                      void_int *node_proc_ptrs,      /* Pointer into array for */
+						/* node maps		  */
+                      void_int *elem_map_ids,	/* Elem map IDs */
+                      void_int *elem_map_elem_cnts,	/* Elems in elemental comm */
+                      void_int *elem_proc_ptrs	/* Pointer into array for */
+						/* elem maps		  */
+                      );
+
+EXODUS_EXPORT int
+ex_get_node_cmap(int  exoid,             /* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,           /* Map ID */
+                 void_int *node_ids,         /* FEM node IDs */
+                 void_int *proc_ids,         /* Processor IDs */
+                 int  processor         /* This processor ID */
+                 );
+
+EXODUS_EXPORT int
+ex_put_node_cmap(int  exoid,	/* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,	/* Nodal comm map ID */
+                 void_int *node_ids,	/* FEM node IDs */
+                 void_int *proc_ids, /* Processor IDs */
+                 int  processor	/* This processor ID */
+                 );
+
+EXODUS_EXPORT int
+ex_get_elem_cmap(int  exoid,     /* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,   /* Elemental comm map ID */
+                 void_int *elem_ids, /* Element IDs */
+                 void_int *side_ids, /* Element side IDs */
+                 void_int *proc_ids, /* Processor IDs */
+                 int  processor /* This processor ID */
+                 );
+
+EXODUS_EXPORT int
+ex_put_elem_cmap(int  exoid,	/* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,	/* Elemental comm map ID */
+                 void_int *elem_ids,	/* Vector of element IDs */
+                 void_int *side_ids, /* Vector of side IDs */
+                 void_int *proc_ids, /* Vector of processor IDs */
+                 int  processor	/* This processor ID */
+                 );
+  
+  /* ========================================================================
+   * Deprecated functiona
+   */
+
+  EXODUS_EXPORT int ex_get_nodal_var (int   exoid,
+				      int   time_step,
+				      int   nodal_var_index,
+				      int64_t   num_nodes, 
+				      void *nodal_var_vals);
+
+  EXODUS_EXPORT int ex_get_nodal_var_time (int   exoid,
+					   int   nodal_var_index,
+					   int64_t   node_number,
+					   int   beg_time_step, 
+					   int   end_time_step,
+					   void *nodal_var_vals);
+
+  /* Use ex_get_concat_sets() */
+  EXODUS_EXPORT int ex_get_concat_node_sets (int   exoid,
+					     void_int  *node_set_ids,
+					     void_int  *num_nodes_per_set, 
+					     void_int  *num_df_per_set, 
+					     void_int  *node_sets_node_index,
+					     void_int  *node_sets_df_index,
+					     void_int  *node_sets_node_list, 
+					     void *node_sets_dist_fact);
+
+     
+  EXODUS_EXPORT int ex_get_concat_side_sets (int   exoid,
+					     void_int  *side_set_ids,
+					     void_int  *num_elem_per_set,
+					     void_int  *num_dist_per_set,
+					     void_int  *side_sets_elem_index,
+					     void_int  *side_sets_dist_index,
+					     void_int  *side_sets_elem_list,
+					     void_int  *side_sets_side_list,
+					     void *side_sets_dist_fact);
+
+  EXODUS_EXPORT int ex_get_elem_attr (int   exoid,
+				      ex_entity_id   elem_blk_id,
+				      void *attrib);
+
+  EXODUS_EXPORT int ex_get_elem_attr_names (int   exoid,
+					    ex_entity_id elem_blk_id,
+					    char **names);
+
+  EXODUS_EXPORT int ex_get_elem_blk_ids (int  exoid,
+					 void_int *ids);
+
+  EXODUS_EXPORT int ex_get_elem_block (int   exoid,
+				       ex_entity_id  elem_blk_id,
+				       char *elem_type,
+				       void_int  *num_elem_this_blk, 
+				       void_int  *num_nodes_per_elem,
+				       void_int  *num_attr);
+
+  EXODUS_EXPORT int ex_get_elem_conn (int   exoid,
+				      ex_entity_id   elem_blk_id,
+				      void_int  *connect);
+
+  EXODUS_EXPORT int ex_get_elem_map (int   exoid,
+				     ex_entity_id   map_id,
+				     void_int  *elem_map);
+
+  EXODUS_EXPORT int ex_get_elem_num_map (int  exoid,
+					 void_int *elem_map);
+
+  EXODUS_EXPORT int ex_get_elem_var (int   exoid,
+				     int   time_step,
+				     int   elem_var_index,
+				     ex_entity_id   elem_blk_id, 
+				     int64_t   num_elem_this_blk,
+				     void *elem_var_vals);
+
+  EXODUS_EXPORT int ex_get_elem_var_tab (int  exoid,
+					 int  num_elem_blk,
+					 int  num_elem_var,
+					 int *elem_var_tab);
+
+  EXODUS_EXPORT int ex_get_elem_var_time (int   exoid,
+					  int   elem_var_index,
+					  int64_t   elem_number,
+					  int   beg_time_step, 
+					  int   end_time_step,
+					  void *elem_var_vals);
+
+  EXODUS_EXPORT int ex_get_map (int  exoid, void_int *elem_map);
+
+  EXODUS_EXPORT int ex_get_node_map (int   exoid,
+				     ex_entity_id   map_id,
+				     void_int  *node_map);
+
+  EXODUS_EXPORT int ex_get_node_num_map (int  exoid,
+					 void_int *node_map);
+
+  EXODUS_EXPORT int ex_get_node_set_param (int  exoid,
+					   ex_entity_id  node_set_id,
+					   void_int *num_nodes_in_set,
+					   void_int *num_df_in_set);
+
+  EXODUS_EXPORT int ex_get_node_set (int   exoid,
+				     ex_entity_id   node_set_id,
+				     void_int  *node_set_node_list);
+
+  EXODUS_EXPORT int ex_get_node_set_dist_fact  (int   exoid,
+						ex_entity_id   node_set_id,
+						void *node_set_dist_fact);
+
+  EXODUS_EXPORT int ex_get_node_set_ids (int  exoid,
+					 void_int *ids);
+
+  EXODUS_EXPORT int ex_get_nset_var_tab (int  exoid,
+					 int  num_nodesets,
+					 int  num_nset_var,
+					 int *nset_var_tab);
+
+  EXODUS_EXPORT int ex_get_nset_var (int   exoid,
+				     int   time_step,
+				     int   nset_var_index,
+				     ex_entity_id   nset_id, 
+				     int64_t   num_node_this_nset,
+				     void *nset_var_vals);
+
+  EXODUS_EXPORT int ex_get_one_elem_attr (int   exoid,
+					  ex_entity_id   elem_blk_id,
+					  int   attrib_index,
+					  void *attrib);
+
+  EXODUS_EXPORT int ex_get_side_set (int   exoid,
+				     ex_entity_id   side_set_id,
+				     void_int  *side_set_elem_list, 
+				     void_int  *side_set_side_list);
+
+  EXODUS_EXPORT int ex_get_side_set_dist_fact (int   exoid,
+					       ex_entity_id   side_set_id,
+					       void *side_set_dist_fact);
+
+  EXODUS_EXPORT int ex_get_side_set_ids (int  exoid,
+					 void_int *ids);
+
+  EXODUS_EXPORT int ex_get_side_set_param (int  exoid,
+					   ex_entity_id  side_set_id,
+					   void_int *num_side_in_set, 
+					   void_int *num_dist_fact_in_set);
+
+  EXODUS_EXPORT int ex_get_sset_var (int   exoid,
+				     int   time_step,
+				     int   sset_var_index,
+				     ex_entity_id   sset_id, 
+				     int64_t   num_side_this_sset,
+				     void *sset_var_vals);
+
+  EXODUS_EXPORT int ex_get_sset_var_tab (int  exoid,
+					 int  num_sidesets,
+					 int  num_sset_var,
+					 int *sset_var_tab);
+
+  EXODUS_EXPORT int ex_get_var_names (int   exoid,
+				      const char *var_type,
+				      int   num_vars,
+				      char *var_names[]);
+
+  EXODUS_EXPORT int ex_get_var_name (int   exoid,
+				     const char *var_type,
+				     int   var_num,
+				     char *var_name);
+
+  EXODUS_EXPORT int ex_get_var_param (int   exoid,
+				      const char *var_type,
+				      int  *num_vars);
+
+  EXODUS_EXPORT int ex_get_var_tab (int  exoid,
+				    const char *var_type,
+				    int  num_blk,
+				    int  num_var,
+				    int *var_tab);
+
+  EXODUS_EXPORT int ex_put_concat_node_sets (int   exoid,
+					     void_int  *node_set_ids,
+					     void_int  *num_nodes_per_set,
+					     void_int  *num_dist_per_set,
+					     void_int  *node_sets_node_index,
+					     void_int  *node_sets_df_index,
+					     void_int  *node_sets_node_list,
+					     void *node_sets_dist_fact);
+
+  EXODUS_EXPORT int ex_put_concat_side_sets (int   exoid,
+					     void_int  *side_set_ids,
+					     void_int  *num_elem_per_set,
+					     void_int  *num_dist_per_set,
+					     void_int  *side_sets_elem_index,
+					     void_int  *side_sets_dist_index,
+					     void_int  *side_sets_elem_list,
+					     void_int  *side_sets_side_list,
+					     void *side_sets_dist_fact);
+
+  EXODUS_EXPORT int ex_put_concat_var_param (int exoid, int num_g, int num_n,
+					     int num_e, int num_elem_blk, int  *elem_var_tab);
+  
+  EXODUS_EXPORT int ex_put_elem_attr_names(int   exoid,
+					   ex_entity_id   elem_blk_id,
+					   char *names[]);
+  EXODUS_EXPORT int ex_put_elem_attr (int   exoid,
+				      ex_entity_id   elem_blk_id,
+				      const void *attrib);
+
+  EXODUS_EXPORT int ex_put_elem_block (int   exoid,
+				       ex_entity_id   elem_blk_id,
+				       const char *elem_type,
+				       int64_t   num_elem_this_blk,
+				       int64_t   num_nodes_per_elem,
+				       int64_t   num_attr);
+
+  EXODUS_EXPORT int ex_put_elem_conn (int   exoid,
+				      ex_entity_id   elem_blk_id,
+				      const void_int  *connect);
+
+  EXODUS_EXPORT int ex_put_elem_map (int exoid,
+				     ex_entity_id map_id,
+				     const void_int *elem_map);
+
+  EXODUS_EXPORT int ex_put_elem_num_map (int  exoid,
+					 const void_int *elem_map);
+
+  EXODUS_EXPORT int ex_put_elem_var (int   exoid,
+				     int   time_step,
+				     int   elem_var_index,
+				     ex_entity_id   elem_blk_id,
+				     int64_t num_elem_this_blk,
+				     const void *elem_var_vals);
+
+  EXODUS_EXPORT int ex_put_elem_var_tab (int  exoid,
+					 int  num_elem_blk,
+					 int  num_elem_var,
+					 int *elem_var_tab);
+
+  EXODUS_EXPORT int ex_put_glob_vars (int   exoid,
+				      int   time_step,
+				      int   num_glob_vars,
+				      const void *glob_var_vals);
+
+  EXODUS_EXPORT int ex_put_map (int  exoid,
+				const void_int *elem_map);
+
+  EXODUS_EXPORT int ex_put_node_map (int exoid,
+				     ex_entity_id map_id,
+				     const void_int *node_map);
+
+  EXODUS_EXPORT int ex_put_node_num_map (int  exoid,
+					 const void_int *node_map);
+
+  EXODUS_EXPORT int ex_put_node_set (int   exoid,
+				     ex_entity_id   node_set_id,
+				     const void_int  *node_set_node_list);
+
+  EXODUS_EXPORT int ex_put_node_set_dist_fact  (int   exoid,
+						ex_entity_id   node_set_id,
+						const void *node_set_dist_fact);
+
+  EXODUS_EXPORT int ex_put_node_set_param (int exoid,
+					   ex_entity_id node_set_id,
+					   int64_t num_nodes_in_set,
+					   int64_t num_dist_in_set);
+
+  EXODUS_EXPORT int ex_put_nset_var (int   exoid,
+				     int   time_step,
+				     int   nset_var_index,
+				     ex_entity_id   nset_id,
+				     int64_t num_nodes_this_nset,
+				     const void *nset_var_vals);
+
+  EXODUS_EXPORT int ex_put_nset_var_tab (int  exoid,
+					 int  num_nset,
+					 int  num_nset_var,
+					 int *nset_var_tab);
+
+  EXODUS_EXPORT int ex_put_one_elem_attr (int   exoid,
+					  ex_entity_id   elem_blk_id,
+					  int   attrib_index,
+					  const void *attrib);
+
+  EXODUS_EXPORT int ex_put_side_set (int   exoid,
+				     ex_entity_id   side_set_id,
+				     const void_int  *side_set_elem_list,
+				     const void_int  *side_set_side_list);
+
+  EXODUS_EXPORT int ex_put_side_set_dist_fact (int   exoid,
+					       ex_entity_id   side_set_id,
+					       const void *side_set_dist_fact);
+
+  EXODUS_EXPORT int ex_put_side_set_param (int exoid,
+					   ex_entity_id side_set_id,
+					   int64_t num_side_in_set,
+					   int64_t num_dist_fact_in_set);
+
+  EXODUS_EXPORT int ex_put_sset_var (int   exoid,
+				     int   time_step,
+				     int   sset_var_index,
+				     ex_entity_id   sset_id,
+				     int64_t  num_faces_this_sset,
+				     const void *sset_var_vals);
+
+  EXODUS_EXPORT int ex_put_sset_var_tab (int  exoid,
+					 int  num_sset,
+					 int  num_sset_var,
+					 int *sset_var_tab);
+
+  EXODUS_EXPORT int ex_put_var_name (int   exoid,
+				     const char *var_type,
+				     int   var_num,
+				     const char *var_name);
+
+  EXODUS_EXPORT int ex_put_var_names (int   exoid,
+				      const char *var_type,
+				      int   num_vars,
+				      char *var_names[]);
+
+  EXODUS_EXPORT int ex_put_var_param (int   exoid,
+				      const char *var_type,
+				      int   num_vars);
+
+  EXODUS_EXPORT int ex_put_var_tab (int  exoid,
+				    const char *var_type,
+				    int  num_blk,
+				    int  num_var,
+				    int *var_tab);
+  
+   /* End of Deprecated functions and their replacements
+    * ======================================================================== */
+
+  /* ERROR CODE DEFINITIONS AND STORAGE                                       */
+  extern int exerrval;     /**< shared error return value                */
+  extern int exoptval;     /**< error reporting flag (default is quiet)  */
+
+  char* ex_name_of_object(ex_entity_type obj_type);
+  ex_entity_type ex_var_type_to_ex_entity_type(char var_type);
+
+  /* Should be internal use only, but was in external include file for
+     nemesis and some codes are using the function
+  */
+  int ex_get_idx(int      neid,	 /* NetCDF/Exodus file ID */
+		 const char *ne_var_name, /* Nemesis index variable name */
+		 int64_t *index,	 /* array of length 2 to hold results */
+		 int      pos		 /* position of this proc/cmap in index */
+		 );
+
+
+#ifdef __cplusplus
+}                               /* close brackets on extern "C" declaration */
+#endif
+
+/**
+ * \defgroup ErrorReturnCodes Exodus error return codes - exerrval return values
+ * @{
+ */
+#define EX_MEMFAIL       1000   /**< memory allocation failure flag def       */
+#define EX_BADFILEMODE   1001   /**< bad file mode def                        */
+#define EX_BADFILEID     1002   /**< bad file id def                          */
+#define EX_WRONGFILETYPE 1003   /**< wrong file type for function             */
+#define EX_LOOKUPFAIL    1004   /**< id table lookup failed                   */
+#define EX_BADPARAM      1005   /**< bad parameter passed                     */
+#define EX_MSG          -1000   /**< message print code - no error implied    */
+#define EX_PRTLASTMSG   -1001   /**< print last error message msg code        */
+#define EX_NOTROOTID    -1002   /**< file id is not the root id; it is a subgroup id */
+#define EX_NULLENTITY   -1006   /**< null entity found                        */
+/* @} */
+
+#endif
+
diff --git a/exodus/cbind/include/exodusII_cfg.h b/exodus/cbind/include/exodusII_cfg.h
new file mode 100755
index 0000000..7a209e7
--- /dev/null
+++ b/exodus/cbind/include/exodusII_cfg.h
@@ -0,0 +1,25 @@
+#ifndef __exodusII_cfg_h
+#define __exodusII_cfg_h
+
+#define EXODUSII_VERSION_MAJOR 5
+#define EXODUSII_VERSION_MINOR 14
+#define EXODUSII_VERSION_PATCH 0
+#define EXODUSII_VERSION "5.14.0"
+
+#if defined(_WIN32) && !defined(WIN32)
+# define WIN32
+#endif
+
+/* #undef EXODUSII_BUILD_SHARED_LIBS */
+#if defined(WIN32) && defined(EXODUSII_BUILD_SHARED_LIBS)
+#  if defined(exoIIc_EXPORTS)
+#    define EXODUS_EXPORT __declspec( dllexport ) extern
+#  else
+#    define EXODUS_EXPORT __declspec( dllimport ) extern
+#  endif
+#else
+#  define EXODUS_EXPORT extern
+#endif
+
+#endif
+
diff --git a/exodus/cbind/include/exodusII_cfg.h.in b/exodus/cbind/include/exodusII_cfg.h.in
new file mode 100755
index 0000000..8b9d0f4
--- /dev/null
+++ b/exodus/cbind/include/exodusII_cfg.h.in
@@ -0,0 +1,25 @@
+#ifndef __exodusII_cfg_h
+#define __exodusII_cfg_h
+
+#define EXODUSII_VERSION_MAJOR @EXODUSII_VERSION_MAJOR@
+#define EXODUSII_VERSION_MINOR @EXODUSII_VERSION_MINOR@
+#define EXODUSII_VERSION_PATCH @EXODUSII_VERSION_PATCH@
+#define EXODUSII_VERSION "@EXODUSII_VERSION_MAJOR at .@EXODUSII_VERSION_MINOR at .@EXODUSII_VERSION_PATCH@"
+
+#if defined(_WIN32) && !defined(WIN32)
+# define WIN32
+#endif
+
+#cmakedefine EXODUSII_BUILD_SHARED_LIBS
+#if defined(WIN32) && defined(EXODUSII_BUILD_SHARED_LIBS)
+#  if defined(exoIIc_EXPORTS)
+#    define EXODUS_EXPORT __declspec( dllexport ) extern
+#  else
+#    define EXODUS_EXPORT __declspec( dllimport ) extern
+#  endif
+#else
+#  define EXODUS_EXPORT extern
+#endif
+
+#endif
+
diff --git a/exodus/cbind/include/exodusII_int.h b/exodus/cbind/include/exodusII_int.h
new file mode 100644
index 0000000..5d1e594
--- /dev/null
+++ b/exodus/cbind/include/exodusII_int.h
@@ -0,0 +1,748 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exodusII_int.h - ExodusII header file for internal Exodus call use only
+*
+*/
+
+#ifndef EXODUS_II_INT_HDR
+#define EXODUS_II_INT_HDR
+
+#include "netcdf.h"
+
+#ifdef _WIN32
+#define PRId64 "I64d"
+#else
+#include <inttypes.h>
+#endif
+
+#ifndef __APPLE__
+#if defined __STDC__ || defined __cplusplus
+#include <stdlib.h>
+#endif
+#endif
+
+#ifdef _MSC_VER
+#  pragma warning ( disable : 4127 )
+#  pragma warning ( disable : 4706 )
+#  pragma warning ( disable : 4701 )
+#endif
+
+#if defined(__BORLANDC__)
+#pragma warn -8004 /* "assigned a value that is never used" */
+#endif
+
+
+#include <stdio.h>
+
+/* A format string for outputting size_t ... */
+#if defined(__STDC_VERSION__)
+#  if (__STDC_VERSION__ >= 199901L)
+#    define ST_ZU   "zu"
+#  else
+#    define ST_ZU   "lu"
+#  endif
+#else
+#  define ST_ZU   "lu"
+#endif
+
+#define MAX_VAR_NAME_LENGTH     32   /**< Internal use only */
+
+/* this should be defined in ANSI C and C++, but just in case ... */
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* Default "filesize" for newly created files.
+ * Set to 0 for normal filesize setting.
+ * Set to 1 for EXODUS_LARGE_MODEL setting to be the default
+ */
+#define EXODUS_DEFAULT_SIZE 1
+
+/* Exodus error return codes - function return values:                      */
+#define EX_FATAL        -1      /* fatal error flag def                     */
+#define EX_NOERR         0      /* no error flag def                        */
+#define EX_WARN          1      /* warning flag def                         */
+
+/* Used to map between root (file id) and group ids when using groups */
+#define EX_FILE_ID_MASK (0xffff0000) /* Must match FILE_ID_MASK in netcdf nc4internal.h */
+#define EX_GRP_ID_MASK  (0x0000ffff) /* Must match GRP_ID_MASK in netcdf nc4internal.h */
+
+/*
+ * This file contains defined constants that are used internally in the
+ * EXODUS II API.
+ *
+ * The first group of constants refer to netCDF variables, attributes, or 
+ * dimensions in which the EXODUS II data are stored.  Using the defined 
+ * constants will allow the names of the netCDF entities to be changed easily 
+ * in the future if needed.  The first three letters of the constant identify 
+ * the netCDF entity as a variable (VAR), dimension (DIM), or attribute (ATT).
+ *
+ * NOTE: The entity name should not have any blanks in it.  Blanks are
+ *       technically legal but some netcdf utilities (ncgen in particular)
+ *       fail when they encounter a blank in a name.
+ *
+ *      DEFINED CONSTANT        ENTITY NAME     DATA STORED IN ENTITY
+ */
+#define ATT_FILE_TYPE           "type"          /* obsolete                  */
+#define ATT_TITLE               "title"         /* the database title        */
+#define ATT_API_VERSION         "api_version"   /* the EXODUS II api vers #   */
+#define ATT_API_VERSION_BLANK   "api version"   /* the EXODUS II api vers #   */
+                                                /*  used for db version 2.01 */
+                                                /*  and earlier              */
+#define ATT_VERSION             "version"       /* the EXODUS II file vers # */
+#define ATT_FILESIZE            "file_size"     /* 1=large, 0=normal */
+#define ATT_FLT_WORDSIZE        "floating_point_word_size"
+                                                /* word size of floating     */
+                                                /* point numbers in file     */
+#define ATT_FLT_WORDSIZE_BLANK  "floating point word size"
+                                                /* word size of floating     */
+                                                /* point numbers in file     */
+                                                /* used for db version 2.01  */
+                                                /* and earlier               */
+#define ATT_MAX_NAME_LENGTH     "maximum_name_length"
+#define ATT_INT64_STATUS        "int64_status"
+
+#define DIM_NUM_NODES           "num_nodes"     /* # of nodes                */
+#define DIM_NUM_DIM             "num_dim"       /* # of dimensions; 2- or 3-d*/
+#define DIM_NUM_EDGE            "num_edge"      /* # of edges (over all blks)*/
+#define DIM_NUM_FACE            "num_face"      /* # of faces (over all blks)*/
+#define DIM_NUM_ELEM            "num_elem"      /* # of elements             */
+#define DIM_NUM_EL_BLK          "num_el_blk"    /* # of element blocks       */
+#define DIM_NUM_ED_BLK          "num_ed_blk"    /* # of edge blocks          */
+#define DIM_NUM_FA_BLK          "num_fa_blk"    /* # of face blocks          */
+#define VAR_COORD               "coord"         /* nodal coordinates         */
+#define VAR_COORD_X             "coordx"        /* X-dimension coordinate    */
+#define VAR_COORD_Y             "coordy"        /* Y-dimension coordinate    */
+#define VAR_COORD_Z             "coordz"        /* Z-dimension coordinate    */
+#define VAR_NAME_COOR           "coor_names"    /* names of coordinates      */
+#define VAR_NAME_EL_BLK         "eb_names"      /* names of element blocks   */
+#define VAR_NAME_NS             "ns_names"      /* names of node sets        */
+#define VAR_NAME_SS             "ss_names"      /* names of side sets        */
+#define VAR_NAME_EM             "emap_names"    /* names of element maps     */
+#define VAR_NAME_EDM            "edmap_names"   /* names of edge    maps     */
+#define VAR_NAME_FAM            "famap_names"   /* names of face    maps     */
+#define VAR_NAME_NM             "nmap_names"    /* names of node    maps     */
+#define VAR_NAME_ED_BLK         "ed_names"      /* names of edge    blocks   */
+#define VAR_NAME_FA_BLK         "fa_names"      /* names of face    blocks   */
+#define VAR_NAME_ES             "es_names"      /* names of edge    sets     */
+#define VAR_NAME_FS             "fs_names"      /* names of face    sets     */
+#define VAR_NAME_ELS            "els_names"     /* names of element sets     */
+#define VAR_STAT_EL_BLK         "eb_status"     /* element block status      */
+#define VAR_STAT_ECONN          "econn_status"  /* element block edge status */
+#define VAR_STAT_FCONN          "fconn_status"  /* element block face status */
+#define VAR_STAT_ED_BLK         "ed_status"     /* edge    block status      */
+#define VAR_STAT_FA_BLK         "fa_status"     /* face    block status      */
+#define VAR_ID_EL_BLK           "eb_prop1"      /* element block ids props   */
+#define VAR_ID_ED_BLK           "ed_prop1"      /* edge    block ids props   */
+#define VAR_ID_FA_BLK           "fa_prop1"      /* face    block ids props   */
+#define ATT_NAME_ELB            "elem_type"     /* element type names for    */
+                                                /*   each element block      */
+#define DIM_NUM_EL_IN_BLK(num)  ex_catstr("num_el_in_blk",num)
+                                                /* # of elements in element  */
+                                                /*   block num               */
+#define DIM_NUM_NOD_PER_EL(num) ex_catstr("num_nod_per_el",num)
+                                                /* # of nodes per element in */
+                                                /*   element block num       */
+#define DIM_NUM_ATT_IN_BLK(num) ex_catstr("num_att_in_blk",num)
+                                                /* # of attributes in element*/
+                                                /*   block num               */
+#define DIM_NUM_ED_IN_EBLK(num) ex_catstr("num_ed_in_blk",num)
+                                                /* # of edges in edge        */
+                                                /*   block num               */
+#define DIM_NUM_NOD_PER_ED(num)  ex_catstr("num_nod_per_ed",num)
+                                                /* # of nodes per edge in    */
+                                                /*   edge block num          */
+#define DIM_NUM_EDG_PER_EL(num)  ex_catstr("num_edg_per_el",num)
+                                                /* # of edges per element in */
+                                                /*   element block num       */
+#define DIM_NUM_ATT_IN_EBLK(num) ex_catstr("num_att_in_eblk",num)
+                                                /* # of attributes in edge   */
+                                                /*   block num               */
+#define DIM_NUM_FA_IN_FBLK(num)  ex_catstr("num_fa_in_blk",num)
+                                                /* # of faces in face        */
+                                                /*   block num               */
+#define DIM_NUM_NOD_PER_FA(num)  ex_catstr("num_nod_per_fa",num)
+                                                /* # of nodes per face in    */
+                                                /*   face block num          */
+#define DIM_NUM_FAC_PER_EL(num)  ex_catstr("num_fac_per_el",num)
+                                                /* # of faces per element in */
+                                                /*   element block num       */
+#define DIM_NUM_ATT_IN_FBLK(num) ex_catstr("num_att_in_fblk",num)
+                                                /* # of attributes in face   */
+                                                /*   block num               */
+#define VAR_CONN(num)            ex_catstr("connect",num)
+                                                /* element connectivity for  */
+                                                /*   element block num       */
+#define VAR_EBEPEC(num)          ex_catstr("ebepecnt",num)
+                                                /* array containing number of entity per */
+						/*  entity for n-sided face/element blocks */
+#define VAR_ATTRIB(num)         ex_catstr("attrib",num)
+                                                /* list of attributes for    */
+                                                /*   element block num       */
+#define VAR_NAME_ATTRIB(num)    ex_catstr("attrib_name",num)
+                                                /* list of attribute names   */
+                                                /* for element block num     */
+#define VAR_EB_PROP(num)        ex_catstr("eb_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all element blocks  */
+#define VAR_ECONN(num)            ex_catstr("edgconn",num)
+                                                /* edge connectivity for     */
+                                                /*   element block num       */
+#define VAR_EBCONN(num)           ex_catstr("ebconn",num)
+                                                /* edge connectivity for     */
+                                                /*   edge block num          */
+#define VAR_EATTRIB(num)          ex_catstr("eattrb",num)
+                                                /* list of attributes for    */
+                                                /*   edge block num          */
+#define VAR_NAME_EATTRIB(num)    ex_catstr("eattrib_name",num)
+                                                /* list of attribute names   */
+                                                /* for edge block num        */
+#define VAR_NATTRIB              "nattrb"
+#define VAR_NAME_NATTRIB         "nattrib_name"
+#define DIM_NUM_ATT_IN_NBLK      "num_att_in_nblk"
+
+#define VAR_NSATTRIB(num)        ex_catstr("nsattrb",num)
+#define VAR_NAME_NSATTRIB(num)   ex_catstr("nsattrib_name",num)
+#define DIM_NUM_ATT_IN_NS(num)   ex_catstr("num_att_in_ns",num)
+
+#define VAR_SSATTRIB(num)        ex_catstr("ssattrb",num)
+#define VAR_NAME_SSATTRIB(num)   ex_catstr("ssattrib_name",num)
+#define DIM_NUM_ATT_IN_SS(num)   ex_catstr("num_att_in_ss",num)
+
+#define VAR_ESATTRIB(num)        ex_catstr("esattrb",num)
+#define VAR_NAME_ESATTRIB(num)   ex_catstr("esattrib_name",num)
+#define DIM_NUM_ATT_IN_ES(num)   ex_catstr("num_att_in_es",num)
+
+#define VAR_FSATTRIB(num)        ex_catstr("fsattrb",num)
+#define VAR_NAME_FSATTRIB(num)   ex_catstr("fsattrib_name",num)
+#define DIM_NUM_ATT_IN_FS(num)   ex_catstr("num_att_in_fs",num)
+
+#define VAR_ELSATTRIB(num)       ex_catstr("elsattrb",num)
+#define VAR_NAME_ELSATTRIB(num)  ex_catstr("elsattrib_name",num)
+#define DIM_NUM_ATT_IN_ELS(num)  ex_catstr("num_att_in_els",num)
+
+#define VAR_ED_PROP(num)         ex_catstr("ed_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all edge blocks     */
+#define VAR_FCONN(num)            ex_catstr("facconn",num)
+                                                /* face connectivity for     */
+                                                /*   element block num       */
+#define VAR_FBCONN(num)           ex_catstr("fbconn",num)
+                                                /* face connectivity for     */
+                                                /*   face block num          */
+#define VAR_FBEPEC(num)           ex_catstr("fbepecnt",num)
+                                                /* array containing number of entity per */
+						/*  entity for n-sided face/element blocks */
+#define VAR_FATTRIB(num)          ex_catstr("fattrb",num)
+                                                /* list of attributes for    */
+                                                /*   face block num          */
+#define VAR_NAME_FATTRIB(num)    ex_catstr("fattrib_name",num)
+                                                /* list of attribute names   */
+                                                /* for face block num        */
+#define VAR_FA_PROP(num)         ex_catstr("fa_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all face blocks     */
+#define ATT_PROP_NAME           "name"          /* name attached to element  */
+                                                /*   block, node set, side   */
+                                                /*   set, element map, or    */
+                                                /*   map properties          */
+#define VAR_MAP                 "elem_map"      /* element order map         */
+                                                /* obsolete, replaced by     */
+                                                /* VAR_ELEM_MAP(num)         */
+#define DIM_NUM_SS              "num_side_sets" /* # of side sets            */
+#define VAR_SS_STAT             "ss_status"     /* side set status           */
+#define VAR_SS_IDS              "ss_prop1"      /* side set id properties    */
+#define DIM_NUM_SIDE_SS(num)    ex_catstr("num_side_ss",num)
+                                                /* # of sides in side set num*/
+#define DIM_NUM_DF_SS(num)      ex_catstr("num_df_ss",num)
+                                               /* # of distribution factors */
+                                               /* in side set num           */
+/*#define DIM_NUM_NOD_SS(num)   ex_catstr("num_nod_ss",num) *** obsolete *** */
+                                                /* # of nodes in side set num*/
+#define VAR_FACT_SS(num)        ex_catstr("dist_fact_ss",num)
+                                                /* the distribution factors  */
+                                                /*   for each node in side   */
+                                                /*   set num                 */
+#define VAR_ELEM_SS(num)        ex_catstr("elem_ss",num)
+                                                /* list of elements in side  */
+                                                /*   set num                 */
+#define VAR_SIDE_SS(num)        ex_catstr("side_ss",num)
+                                                /* list of sides in side set */
+#define VAR_SS_PROP(num)        ex_catstr("ss_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all side sets       */
+#define DIM_NUM_ES               "num_edge_sets"/* # of edge sets            */
+#define VAR_ES_STAT              "es_status"    /* edge set status           */
+#define VAR_ES_IDS               "es_prop1"     /* edge set id properties    */
+#define DIM_NUM_EDGE_ES(num)     ex_catstr("num_edge_es",num)
+                                                /* # of edges in edge set num*/
+#define DIM_NUM_DF_ES(num)       ex_catstr("num_df_es",num)
+                                                /* # of distribution factors */
+                                                /* in edge set num           */
+/*#define DIM_NUM_NOD_ES(num)    ex_catstr("num_nod_es",num) *** obsolete *** */
+                                                /* # of nodes in edge set num*/
+#define VAR_FACT_ES(num)         ex_catstr("dist_fact_es",num)
+                                                /* the distribution factors  */
+                                                /*   for each node in edge   */
+                                                /*   set num                 */
+#define VAR_EDGE_ES(num)         ex_catstr("edge_es",num)
+                                                /* list of edges in edge     */
+                                                /*   set num                 */
+#define VAR_ORNT_ES(num)         ex_catstr("ornt_es",num)
+                                                /* list of orientations in   */
+                                                /*  the edge set.            */
+#define VAR_ES_PROP(num)         ex_catstr("es_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all edge sets       */
+#define DIM_NUM_FS               "num_face_sets"/* # of face sets            */
+#define VAR_FS_STAT              "fs_status"    /* face set status           */
+#define VAR_FS_IDS               "fs_prop1"     /* face set id properties    */
+#define DIM_NUM_FACE_FS(num)     ex_catstr("num_face_fs",num)
+                                                /* # of faces in side set num*/
+#define DIM_NUM_DF_FS(num)       ex_catstr("num_df_fs",num)
+                                                /* # of distribution factors */
+                                                /* in face set num           */
+/*#define DIM_NUM_NOD_FS(num)    ex_catstr("num_nod_ss",num) *** obsolete *** */
+                                                /* # of nodes in face set num*/
+#define VAR_FACT_FS(num)         ex_catstr("dist_fact_fs",num)
+                                                /* the distribution factors  */
+                                                /*   for each node in face   */
+                                                /*   set num                 */
+#define VAR_FACE_FS(num)         ex_catstr("face_fs",num)
+                                                /* list of elements in face  */
+                                                /*   set num                 */
+#define VAR_ORNT_FS(num)         ex_catstr("ornt_fs",num)
+                                                /* list of sides in side set */
+#define VAR_FS_PROP(num)         ex_catstr("fs_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all face sets       */
+#define DIM_NUM_ELS              "num_elem_sets"/* # of elem sets            */
+#define DIM_NUM_ELE_ELS(num)     ex_catstr("num_ele_els",num)
+                                                /* # of elements in elem set */
+                                                /*   num                     */
+#define DIM_NUM_DF_ELS(num)     ex_catstr("num_df_els",num)
+                                               /* # of distribution factors */
+                                               /* in element set num        */
+#define VAR_ELS_STAT            "els_status"    /* elem set status           */
+#define VAR_ELS_IDS             "els_prop1"     /* elem set id properties    */
+#define VAR_ELEM_ELS(num)        ex_catstr("elem_els",num)
+                                                /* list of elements in elem  */
+                                                /*   set num                 */
+#define VAR_FACT_ELS(num)       ex_catstr("dist_fact_els",num)
+                                                /* list of distribution      */
+                                                /*   factors in elem set num */
+#define VAR_ELS_PROP(num)       ex_catstr("els_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all elem sets       */
+#define DIM_NUM_NS               "num_node_sets"/* # of node sets            */
+#define DIM_NUM_NOD_NS(num)      ex_catstr("num_nod_ns",num)
+                                                /* # of nodes in node set    */
+                                                /*   num                     */
+#define DIM_NUM_DF_NS(num)      ex_catstr("num_df_ns",num)
+                                               /* # of distribution factors */
+                                               /* in node set num           */
+#define VAR_NS_STAT             "ns_status"     /* node set status           */
+#define VAR_NS_IDS              "ns_prop1"      /* node set id properties    */
+#define VAR_NODE_NS(num)        ex_catstr("node_ns",num)
+                                                /* list of nodes in node set */
+                                                /*   num                     */
+#define VAR_FACT_NS(num)        ex_catstr("dist_fact_ns",num)
+                                                /* list of distribution      */
+                                                /*   factors in node set num */
+#define VAR_NS_PROP(num)        ex_catstr("ns_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all node sets       */
+#define DIM_NUM_QA              "num_qa_rec"    /* # of QA records           */
+#define VAR_QA_TITLE            "qa_records"    /* QA records                */
+#define DIM_NUM_INFO            "num_info"      /* # of information records  */
+#define VAR_INFO                "info_records"  /* information records       */
+#define VAR_HIS_TIME            "time_hist"     /* obsolete                  */
+#define VAR_WHOLE_TIME          "time_whole"    /* simulation times for whole*/
+                                                /*   time steps              */
+#define VAR_ELEM_TAB            "elem_var_tab"  /* element variable truth    */
+                                                /*   table                   */
+#define VAR_EBLK_TAB            "edge_var_tab"  /* edge variable truth table */
+#define VAR_FBLK_TAB            "face_var_tab"  /* face variable truth table */
+#define VAR_ELSET_TAB           "elset_var_tab" /* elemset variable truth    */
+                                                /*   table                   */
+#define VAR_SSET_TAB            "sset_var_tab"  /* sideset variable truth    */
+                                                /*   table                   */
+#define VAR_FSET_TAB            "fset_var_tab"  /* faceset variable truth    */
+                                                /*   table                   */
+#define VAR_ESET_TAB            "eset_var_tab"  /* edgeset variable truth    */
+                                                /*   table                   */
+#define VAR_NSET_TAB            "nset_var_tab"  /* nodeset variable truth    */
+                                                /*   table                   */
+#define DIM_NUM_GLO_VAR         "num_glo_var"   /* # of global variables     */
+#define VAR_NAME_GLO_VAR        "name_glo_var"  /* names of global variables */
+#define VAR_GLO_VAR             "vals_glo_var"  /* values of global variables*/
+#define DIM_NUM_NOD_VAR         "num_nod_var"   /* # of nodal variables      */
+#define VAR_NAME_NOD_VAR        "name_nod_var"  /* names of nodal variables  */
+#define VAR_NOD_VAR             "vals_nod_var"  /* values of nodal variables */
+#define VAR_NOD_VAR_NEW(num)    ex_catstr("vals_nod_var",num)
+                                                /* values of nodal variables */
+#define DIM_NUM_ELE_VAR         "num_elem_var"  /* # of element variables    */
+#define VAR_NAME_ELE_VAR        "name_elem_var" /* names of element variables*/
+#define VAR_ELEM_VAR(num1,num2) ex_catstr2("vals_elem_var",num1,"eb",num2)
+                                                /* values of element variable*/
+                                                /*   num1 in element block   */
+                                                /*   num2                    */
+#define DIM_NUM_EDG_VAR         "num_edge_var"  /* # of edge variables       */
+#define VAR_NAME_EDG_VAR        "name_edge_var" /* names of edge variables   */
+#define VAR_EDGE_VAR(num1,num2) ex_catstr2("vals_edge_var",num1,"eb",num2)
+                                                /* values of edge variable   */
+                                                /*   num1 in edge block num2 */
+#define DIM_NUM_FAC_VAR         "num_face_var"  /* # of face variables       */
+#define VAR_NAME_FAC_VAR        "name_face_var" /* names of face variables   */
+#define VAR_FACE_VAR(num1,num2) ex_catstr2("vals_face_var",num1,"fb",num2)
+                                                /* values of face variable   */
+                                                /*   num1 in face block num2 */
+
+#define DIM_NUM_NSET_VAR        "num_nset_var"  /* # of nodeset variables    */
+#define VAR_NAME_NSET_VAR       "name_nset_var" /* names of nodeset variables*/
+#define VAR_NS_VAR(num1,num2) ex_catstr2("vals_nset_var",num1,"ns",num2)
+                                                /* values of nodeset variable*/
+                                                /*   num1 in nodeset num2    */
+#define DIM_NUM_ESET_VAR        "num_eset_var"  /* # of edgeset variables    */
+#define VAR_NAME_ESET_VAR       "name_eset_var" /* names of edgeset variables*/
+#define VAR_ES_VAR(num1,num2) ex_catstr2("vals_eset_var",num1,"es",num2)
+                                                /* values of edgeset variable*/
+                                                /*   num1 in edgeset num2    */
+#define DIM_NUM_FSET_VAR        "num_fset_var"  /* # of faceset variables    */
+#define VAR_NAME_FSET_VAR       "name_fset_var" /* names of faceset variables*/
+#define VAR_FS_VAR(num1,num2) ex_catstr2("vals_fset_var",num1,"fs",num2)
+                                                /* values of faceset variable*/
+                                                /*   num1 in faceset num2    */
+#define DIM_NUM_SSET_VAR        "num_sset_var"  /* # of sideset variables    */
+#define VAR_NAME_SSET_VAR       "name_sset_var" /* names of sideset variables*/
+#define VAR_SS_VAR(num1,num2) ex_catstr2("vals_sset_var",num1,"ss",num2)
+                                                /* values of sideset variable*/
+                                                /*   num1 in sideset num2    */
+#define DIM_NUM_ELSET_VAR       "num_elset_var" /* # of element set variables*/
+#define VAR_NAME_ELSET_VAR      "name_elset_var"/* names of elemset variables*/
+#define VAR_ELS_VAR(num1,num2) ex_catstr2("vals_elset_var",num1,"es",num2)
+                                                /* values of elemset variable*/
+                                                /*   num1 in elemset num2    */
+
+#define DIM_NUM_HIS_VAR         "num_his_var"   /* obsolete                  */
+#define VAR_NAME_HIS_VAR        "name_his_var"  /* obsolete                  */
+#define VAR_HIS_VAR             "vals_his_var"  /* obsolete                  */
+#define DIM_STR                 "len_string"    /* general dimension of      */
+                                                /*   length MAX_STR_LENGTH   */
+                                                /*   used for some string lengths   */
+#define DIM_STR_NAME            "len_name"      /* general dimension of      */
+                                                /*   length MAX_NAME_LENGTH  */
+                                                /*   used for name lengths   */
+#define DIM_LIN                 "len_line"      /* general dimension of      */
+                                                /*   length MAX_LINE_LENGTH  */
+                                                /*   used for long strings   */
+#define DIM_N4                  "four"          /* general dimension of      */
+                                                /*   length 4                */
+#define DIM_TIME                "time_step"     /* unlimited (expandable)    */
+                                                /*   dimension for time steps*/
+#define DIM_HTIME               "hist_time_step"/* obsolete                  */
+#define VAR_ELEM_NUM_MAP        "elem_num_map"  /* element numbering map     */
+                                                /* obsolete, replaced by     */
+                                                /* VAR_ELEM_MAP(num)         */
+#define VAR_FACE_NUM_MAP        "face_num_map"  /* face numbering map     */
+                                                /* obsolete, replaced by     */
+                                                /* VAR_FACE_MAP(num)         */
+#define VAR_EDGE_NUM_MAP        "edge_num_map"  /* edge numbering map     */
+                                                /* obsolete, replaced by     */
+                                                /* VAR_EDGE_MAP(num)         */
+#define VAR_NODE_NUM_MAP        "node_num_map"  /* node numbering map        */
+                                                /* obsolete, replaced by     */
+                                                /* VAR_NODE_MAP(num)         */
+#define DIM_NUM_EM              "num_elem_maps" /* # of element maps         */
+#define VAR_ELEM_MAP(num)       ex_catstr("elem_map",num)
+                                                /* the numth element map     */
+#define VAR_EM_PROP(num)        ex_catstr("em_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all element maps    */
+#define DIM_NUM_EDM             "num_edge_maps" /* # of edge maps            */
+#define VAR_EDGE_MAP(num)       ex_catstr("edge_map",num)
+                                                /* the numth edge map        */
+#define VAR_EDM_PROP(num)       ex_catstr("edm_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all edge maps       */
+#define DIM_NUM_FAM             "num_face_maps" /* # of face maps            */
+#define VAR_FACE_MAP(num)       ex_catstr("face_map",num)
+                                                /* the numth face map        */
+#define VAR_FAM_PROP(num)       ex_catstr("fam_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all face maps       */
+#define DIM_NUM_NM              "num_node_maps" /* # of node maps            */
+#define VAR_NODE_MAP(num)       ex_catstr("node_map",num)
+                                                /* the numth node map        */
+#define VAR_NM_PROP(num)        ex_catstr("nm_prop",num)
+                                                /* list of the numth property*/
+                                                /*   for all node maps       */
+
+#define DIM_NUM_CFRAMES  "num_cframes"
+#define DIM_NUM_CFRAME9  "num_cframes_9"
+#define VAR_FRAME_COORDS "frame_coordinates"
+#define VAR_FRAME_IDS    "frame_ids"
+#define VAR_FRAME_TAGS   "frame_tags"
+
+#define VAR_ELBLK_IDS_GLOBAL            "el_blk_ids_global"
+#define VAR_ELBLK_CNT_GLOBAL            "el_blk_cnt_global"
+#define VAR_NS_IDS_GLOBAL               "ns_ids_global"
+#define VAR_NS_NODE_CNT_GLOBAL          "ns_node_cnt_global"
+#define VAR_NS_DF_CNT_GLOBAL            "ns_df_cnt_global"
+#define VAR_SS_IDS_GLOBAL               "ss_ids_global"
+#define VAR_SS_SIDE_CNT_GLOBAL          "ss_side_cnt_global"
+#define VAR_SS_DF_CNT_GLOBAL            "ss_df_cnt_global"
+#define VAR_FILE_TYPE                   "nem_ftype"
+#define VAR_COMM_MAP                    "comm_map"
+#define VAR_NODE_MAP_INT                "node_mapi"
+#define VAR_NODE_MAP_INT_IDX            "node_mapi_idx"
+#define VAR_NODE_MAP_BOR                "node_mapb"
+#define VAR_NODE_MAP_BOR_IDX            "node_mapb_idx"
+#define VAR_NODE_MAP_EXT                "node_mape"
+#define VAR_NODE_MAP_EXT_IDX            "node_mape_idx"
+#define VAR_ELEM_MAP_INT                "elem_mapi"
+#define VAR_ELEM_MAP_INT_IDX            "elem_mapi_idx"
+#define VAR_ELEM_MAP_BOR                "elem_mapb"
+#define VAR_ELEM_MAP_BOR_IDX            "elem_mapb_idx"
+#define VAR_INT_N_STAT                  "int_n_stat"
+#define VAR_BOR_N_STAT                  "bor_n_stat"
+#define VAR_EXT_N_STAT                  "ext_n_stat"
+#define VAR_INT_E_STAT                  "int_e_stat"
+#define VAR_BOR_E_STAT                  "bor_e_stat"
+#define VAR_N_COMM_IDS                  "n_comm_ids"
+#define VAR_N_COMM_STAT                 "n_comm_stat"
+#define VAR_N_COMM_INFO_IDX             "n_comm_info_idx"
+#define VAR_E_COMM_IDS                  "e_comm_ids"
+#define VAR_E_COMM_STAT                 "e_comm_stat"
+#define VAR_E_COMM_INFO_IDX             "e_comm_info_idx"
+#define VAR_N_COMM_NIDS                 "n_comm_nids"
+#define VAR_N_COMM_PROC                 "n_comm_proc"
+#define VAR_N_COMM_DATA_IDX             "n_comm_data_idx"
+#define VAR_E_COMM_EIDS                 "e_comm_eids"
+#define VAR_E_COMM_SIDS                 "e_comm_sids"
+#define VAR_E_COMM_PROC                 "e_comm_proc"
+#define VAR_E_COMM_DATA_IDX             "e_comm_data_idx"
+
+#define DIM_NUM_INT_NODES               "num_int_node"
+#define DIM_NUM_BOR_NODES               "num_bor_node"
+#define DIM_NUM_EXT_NODES               "num_ext_node"
+#define DIM_NUM_INT_ELEMS               "num_int_elem"
+#define DIM_NUM_BOR_ELEMS               "num_bor_elem"
+#define DIM_NUM_PROCS                   "num_processors"
+#define DIM_NUM_PROCS_F                 "num_procs_file"
+#define DIM_NUM_NODES_GLOBAL            "num_nodes_global"
+#define DIM_NUM_ELEMS_GLOBAL            "num_elems_global"
+#define DIM_NUM_NS_GLOBAL               "num_ns_global"
+#define DIM_NUM_SS_GLOBAL               "num_ss_global"
+#define DIM_NUM_ELBLK_GLOBAL            "num_el_blk_global"
+#define DIM_NUM_N_CMAPS                 "num_n_cmaps"
+#define DIM_NUM_E_CMAPS                 "num_e_cmaps"
+#define DIM_NCNT_CMAP                   "ncnt_cmap"
+#define DIM_ECNT_CMAP                   "ecnt_cmap"
+
+enum ex_element_type {
+  EX_EL_UNK         =  -1,     /**< unknown entity */
+  EX_EL_NULL_ELEMENT=   0,     
+  EX_EL_TRIANGLE    =   1,     /**< Triangle entity */
+  EX_EL_QUAD        =   2,     /**< Quad entity */
+  EX_EL_HEX         =   3,     /**< Hex entity */
+  EX_EL_WEDGE       =   4,     /**< Wedge entity */
+  EX_EL_TETRA       =   5,     /**< Tetra entity */
+  EX_EL_TRUSS       =   6,     /**< Truss entity */
+  EX_EL_BEAM        =   7,     /**< Beam entity */
+  EX_EL_SHELL       =   8,     /**< Shell entity */
+  EX_EL_SPHERE      =   9,     /**< Sphere entity */
+  EX_EL_CIRCLE      =  10,     /**< Circle entity */
+  EX_EL_TRISHELL    =  11,     /**< Triangular Shell entity */
+  EX_EL_PYRAMID     =  12      /**< Pyramid entity */
+}; 
+typedef enum ex_element_type ex_element_type;
+
+enum ex_coordinate_frame_type {
+  EX_CF_RECTANGULAR =   1,
+  EX_CF_CYLINDRICAL =   2,
+  EX_CF_SPHERICAL   =   3
+}; 
+typedef enum ex_coordinate_frame_type ex_coordinate_frame_type;
+
+/* Internal structure declarations */
+
+struct ex_file_item {
+  int                   file_id;
+  nc_type               netcdf_type_code;
+  int                   int64_status;
+  int                   maximum_name_length;
+  unsigned int          compression_level:4;     /* 0 (disabled) to 9 (maximum) compression level; netcdf-4 only */
+  unsigned int          user_compute_wordsize:1; /* 0 for 4 byte or 1 for 8 byte reals */
+  unsigned int          shuffle:1;               /* 1 true, 0 false */                   
+  unsigned int          file_type:2;             /* 0 - classic, 1 -- 64 bit classic, 2 --netcdf4,  3 --netcdf4 classic */
+  unsigned int          is_parallel:1;            /* 1 true, 0 false */
+  struct ex_file_item*     next;
+};
+
+struct elem_blk_parm
+{
+  char elem_type[33];
+  int64_t elem_blk_id;
+  int64_t num_elem_in_blk;
+  int num_nodes_per_elem;
+  int num_sides;
+  int num_nodes_per_side[6];
+  int num_attr;
+  int64_t elem_ctr;
+  ex_element_type elem_type_val;
+};
+
+struct list_item {              /* for use with ex_get_file_item */
+  int exo_id;
+  int value;
+  struct list_item* next;
+};
+
+struct obj_stats {
+  int64_t *id_vals;
+  int *stat_vals;
+  long num;
+  int exoid;
+  int valid_ids;
+  int valid_stat;
+  struct obj_stats *next;
+};
+
+void  ex_iqsort(int v[], int iv[], int count );
+void  ex_iqsort64(int64_t v[], int64_t iv[], int64_t count );
+
+char* ex_catstr(const char*, int);
+char* ex_catstr2(const char*, int, const char*, int);
+char* ex_dim_num_entries_in_object(ex_entity_type, int);
+char* ex_dim_num_objects(ex_entity_type obj_type);
+char* ex_name_var_of_object( ex_entity_type, int, int );
+char* ex_name_of_map( ex_entity_type, int );
+
+int ex_conv_ini  (int exoid, int* comp_wordsize, int* io_wordsize, int file_wordsize, int int64_status, int is_parallel);
+void ex_conv_exit  (int exoid);
+
+nc_type nc_flt_code  (int exoid);
+int ex_comp_ws  (int exoid);
+int ex_get_cpu_ws(void);
+int ex_is_parallel(int exoid);
+
+struct list_item** ex_get_counter_list(ex_entity_type obj_type);
+int ex_get_file_item  (int, struct list_item**);
+int ex_inc_file_item  (int, struct list_item**);
+void ex_rm_file_item  (int, struct list_item**);
+
+extern struct obj_stats* exoII_eb;
+extern struct obj_stats* exoII_ed;
+extern struct obj_stats* exoII_fa;
+extern struct obj_stats* exoII_ns;
+extern struct obj_stats* exoII_es;
+extern struct obj_stats* exoII_fs;
+extern struct obj_stats* exoII_ss;
+extern struct obj_stats* exoII_els;
+extern struct obj_stats* exoII_em;
+extern struct obj_stats* exoII_edm;
+extern struct obj_stats* exoII_fam;
+extern struct obj_stats* exoII_nm;
+
+
+struct ex_file_item* ex_find_file_item(int exoid);
+struct ex_file_item* ex_add_file_item(int exoid);
+struct obj_stats *ex_get_stat_ptr  ( int exoid, struct obj_stats** obj_ptr);
+
+void ex_rm_stat_ptr  (int exoid, struct obj_stats** obj_ptr);
+
+void ex_compress_variable(int exoid, int varid, int type);
+int ex_id_lkup  (int exoid, ex_entity_type id_type, ex_entity_id num);
+int ex_check_file_type(const char *path, int *type);
+int ex_get_dimension(int exoid, const char *dimtype, const char *label,
+		     size_t *count, int *dimid, const char *routine);
+
+int ex_get_name_internal(int exoid, int varid, size_t index, char *name, int name_size, 
+			 ex_entity_type type, const char *routine);
+int ex_get_names_internal(int exoid, int varid, size_t count, char**names,
+			  ex_entity_type type, const char *routine);
+int ex_put_name_internal(int exoid, int varid, size_t index, const char *name,
+			  ex_entity_type type, const char *subtype, const char *routine);
+int ex_put_names_internal(int exoid, int varid, size_t count, char**names,
+			  ex_entity_type type, const char *subtype, const char *routine);
+void ex_trim_internal(char *name);
+void ex_update_max_name_length(int exoid, int length);
+int  ex_leavedef(int neid, 		/* NemesisI file ID         */
+		 const char *func_name	/* Name of calling function */
+		 );
+
+int ex_get_file_type(int neid,	/* NetCDF/Exodus file ID */
+		     char *ftype	/* Nemesis file type */
+		     );
+
+int ex_put_nemesis_version(int neid);		/* NetCDF/Exodus file ID */
+
+int ne_check_file_version(int neid	/* NetCDF/Exodus file ID */
+                      );
+
+char *ex_catstrn12(char *name, int num1, int num2);
+
+int ne_id_lkup(int            neid,		/* NetCDF/Exodus file ID */
+	       const char    *var_name,	/* Nemesis variable name */
+	       int64_t       *idx,		/* index variable for variable, length 2 */
+	       ex_entity_id   ne_var_id	/* NetCDF variable ID */
+	       );
+
+  /**
+   * For output databases, the maximum length of any entity, variable,
+   * property, attribute, or coordinate name to be written (not
+   * including the NULL terminator). If a name is longer than this
+   * value, a warning message will be output to stderr and the name
+   * will be truncated.  Must be set (via call to
+   * 'ex_set_max_name_length(exoid, int len)' prior to calling ex_create.
+   *
+   * For input databases, the size of the name arrays that the client
+   * code will be passing to API routines that retrieve names (not
+   * including the NULL terminator). This defaults to 32 for
+   * compatibility with older clients. The value used at the time of
+   * creation of the database can be queried by ex_inquire with the
+   * EX_INQ_DB_MAX_NAME_LENGTH argument. The current value for this
+   * variable can be queried with EX_INQ_CUR_MAX_NAME_LENGTH argument.
+   *
+   * Note that this is a global setting for all databases. If you are
+   * accessing multiple databases, they will all use the same value.
+   */
+  extern int ex_default_max_name_length; 
+				    
+  void *ex_safe_free(void *array);
+#endif
diff --git a/exodus/cbind/include/exodusII_par.h b/exodus/cbind/include/exodusII_par.h
new file mode 100644
index 0000000..c7820ee
--- /dev/null
+++ b/exodus/cbind/include/exodusII_par.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2012 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+ *
+ * exodusII_par.h - Exodus II parallel-aware API include file
+ *
+ *****************************************************************************/
+
+#ifndef EXODUS_II_PAR_HDR
+#define EXODUS_II_PAR_HDR
+
+#if !defined(PARALLEL_NETCDF)
+
+#include "exodusII.h"
+
+/*
+ * need following extern if this include file is used in a C++
+ * program, to keep the C++ compiler from mangling the function names.
+ */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ex_open_par(path, mode, comp_ws, io_ws, version, comm, info) ex_open_par_int(path, mode, comp_ws, io_ws, version, comm, info, EX_API_VERS_NODOT)  
+#define ex_create_par(path, mode, comp_ws, io_ws, comm, info) ex_create_par_int(path, mode, comp_ws, io_ws, comm, info, EX_API_VERS_NODOT)  
+
+EXODUS_EXPORT int ex_open_par_int (const char  *path,
+				   int    mode,
+				   int   *comp_ws,
+				   int   *io_ws,
+				   float *version,
+				   MPI_Comm comm,
+				   MPI_Info info,
+				   int my_version);
+
+EXODUS_EXPORT int ex_create_par_int (const char *path, int cmode, int *comp_ws, int *io_ws,
+				     MPI_Comm comm,
+				     MPI_Info info,
+				     int my_version);
+
+#else
+#error "Parallel-aware exodusII_par.h included in non-parallel context"
+#endif
+
+#ifdef __cplusplus
+}                               /* close brackets on extern "C" declaration */
+#endif
+
+#endif
+
diff --git a/exodus/cbind/include/exodusII_test.h b/exodus/cbind/include/exodusII_test.h
new file mode 100644
index 0000000..6072c00
--- /dev/null
+++ b/exodus/cbind/include/exodusII_test.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2014, Sandia Corporation.
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#ifndef __exodusII_test_h
+#define __exodusII_test_h
+
+#include "exodusII.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+  int cCreateEdgeFace( int, char*[] );
+  int cReadEdgeFace( int, char*[] );
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+inline int CreateEdgeFace( int argc, char* argv[] ) { return cCreateEdgeFace( argc, argv ); }
+inline int   ReadEdgeFace( int argc, char* argv[] ) { return   cReadEdgeFace( argc, argv ); }
+
+#endif /* __exodusII_test_h */
diff --git a/exodus/cbind/src/Imakefile b/exodus/cbind/src/Imakefile
new file mode 100644
index 0000000..20e308b
--- /dev/null
+++ b/exodus/cbind/src/Imakefile
@@ -0,0 +1,330 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+
+XCOMM Use include files locates in exodusii/cbind/include
+INCLUDES = IncRef-I../include
+REQUIREDLIBS = -L$(SHLIBDIR) $(NETCDF)
+
+#if UseNetcdf4 == NO
+NET_DEF = -DNOT_NETCDF4
+#endif
+
+#ifndef BuildSharedExodusLibrary
+#define BuildSharedExodusLibrary NO
+#endif  
+
+#define DoNormalLib YES
+#define DoSharedLib BuildSharedExodusLibrary
+#define LibName exodus
+SOREV = 5
+#define SoRev SOREV
+
+DEFINES = $(PICFLAGS) $(NET_DEF)
+
+#if defined(BuildParallelAwareExodus)
+PARSRCS = ex_create_par.c ex_open_par.c
+PAROBJS = ${PARSRCS:.c=.o}
+$(PAROBJS): ../include/exodusII.h ../include/exodusII_int.h ../include/exodusII_par.h
+
+CC = $(CCPAR)
+#define LibraryCcCmd $(CCPAR)
+#endif
+
+SRCS =	ex_close.c \
+	ex_conv.c \
+	ex_copy.c \
+	ex_create.c \
+	ex_create_group.c \
+	ex_get_group_id.c \
+	ex_get_group_ids.c \
+	ex_cvt_nodes_to_sides.c \
+	ex_err.c \
+	ex_get_all_times.c \
+	ex_get_attr.c \
+	ex_get_attr_names.c \
+	ex_get_attr_param.c \
+	ex_get_block.c \
+	ex_get_block_param.c \
+	ex_get_cmap_params.c \
+	ex_get_concat_node_sets.c \
+	ex_get_concat_sets.c \
+	ex_get_concat_side_set_node_count.c \
+	ex_get_concat_side_sets.c \
+	ex_get_conn.c \
+	ex_get_coord.c \
+	ex_get_coordinate_frames.c \
+	ex_get_coord_names.c \
+	ex_get_eb_info_global.c \
+	ex_get_elem_attr.c \
+	ex_get_elem_attr_names.c \
+	ex_get_elem_blk_ids.c \
+	ex_get_elem_block.c \
+	ex_get_elem_cmap.c \
+	ex_get_elem_conn.c \
+	ex_get_elem_map.c \
+	ex_get_elem_num_map.c \
+	ex_get_elem_type.c \
+	ex_get_elem_var.c \
+	ex_get_elem_var_tab.c \
+	ex_get_elem_var_time.c \
+	ex_get_entity_count_per_polyhedra.c \
+	ex_get_glob_vars.c \
+	ex_get_glob_var_time.c \
+	ex_get_id_map.c \
+	ex_get_ids.c \
+	ex_get_info.c \
+	ex_get_init.c \
+	ex_get_init_ext.c \
+	ex_get_init_global.c \
+	ex_get_init_info.c \
+	ex_get_loadbal_param.c \
+	ex_get_map.c \
+	ex_get_map_param.c \
+	ex_get_name.c \
+	ex_get_names.c \
+	ex_get_n_attr.c \
+	ex_get_n_conn.c \
+	ex_get_n_coord.c \
+	ex_get_n_elem_attr.c \
+	ex_get_n_elem_conn.c \
+	ex_get_n_elem_num_map.c \
+	ex_get_n_elem_var.c \
+	ex_get_n_nodal_var.c \
+	ex_get_n_node_num_map.c \
+	ex_get_n_node_set.c \
+	ex_get_n_node_set_df.c \
+	ex_get_nodal_var.c \
+	ex_get_nodal_var_time.c \
+	ex_get_node_cmap.c \
+	ex_get_node_map.c \
+	ex_get_node_num_map.c \
+	ex_get_node_set.c \
+	ex_get_node_set_dist_fact.c \
+	ex_get_node_set_ids.c \
+	ex_get_node_set_param.c \
+	ex_get_n_one_attr.c \
+	ex_get_nset_var.c \
+	ex_get_nset_var_tab.c \
+	ex_get_n_side_set.c \
+	ex_get_n_side_set_df.c \
+	ex_get_ns_param_global.c \
+	ex_get_num_map.c \
+	ex_get_n_var.c \
+	ex_get_object_truth_vector.c \
+	ex_get_one_attr.c \
+	ex_get_one_elem_attr.c \
+	ex_get_partial_attr.c \
+	ex_get_partial_conn.c \
+	ex_get_partial_coord.c \
+	ex_get_partial_elem_attr.c \
+	ex_get_partial_elem_conn.c \
+	ex_get_partial_elem_map.c \
+	ex_get_partial_elem_num_map.c \
+	ex_get_partial_elem_var.c \
+	ex_get_partial_id_map.c \
+	ex_get_partial_nodal_var.c \
+	ex_get_partial_node_num_map.c \
+	ex_get_partial_node_set.c \
+	ex_get_partial_node_set_df.c \
+	ex_get_partial_num_map.c \
+	ex_get_partial_one_attr.c \
+	ex_get_partial_set_dist_fact.c \
+	ex_get_partial_side_set.c \
+	ex_get_partial_side_set_df.c \
+	ex_get_partial_var.c \
+	ex_get_processor_elem_maps.c \
+	ex_get_processor_node_maps.c \
+	ex_get_prop_array.c \
+	ex_get_prop.c \
+	ex_get_prop_names.c \
+	ex_get_qa.c \
+	ex_get_set.c \
+	ex_get_set_dist_fact.c \
+	ex_get_set_param.c \
+	ex_get_sets.c \
+	ex_get_side_set.c \
+	ex_get_side_set_dist_fact.c \
+	ex_get_side_set_ids.c \
+	ex_get_side_set_node_count.c \
+	ex_get_side_set_node_list.c \
+	ex_get_side_set_node_list_len.c \
+	ex_get_side_set_param.c \
+	ex_get_sset_var.c \
+	ex_get_sset_var_tab.c \
+	ex_get_ss_param_global.c \
+	ex_get_time.c \
+	ex_get_truth_table.c \
+	ex_get_var.c \
+	ex_get_variable_name.c \
+	ex_get_variable_names.c \
+	ex_get_variable_param.c \
+	ex_get_var_name.c \
+	ex_get_var_names.c \
+	ex_get_var_param.c \
+	ex_get_var_tab.c \
+	ex_get_var_time.c \
+	ex_inquire.c \
+	ex_ne_util.c \
+	ex_open.c \
+	ex_opts.c \
+	ex_put_all_var_param.c \
+	ex_put_all_var_param_ext.c \
+	ex_put_attr.c \
+	ex_put_attr_names.c \
+	ex_put_attr_param.c \
+	ex_put_block.c \
+	ex_put_block_param.c \
+	ex_get_block_params.c \
+	ex_put_block_params.c \
+	ex_put_cmap_params.c \
+	ex_put_cmap_params_cc.c \
+	ex_put_concat_all_blocks.c \
+	ex_put_concat_elem_block.c \
+	ex_put_concat_node_sets.c \
+	ex_put_concat_sets.c \
+	ex_put_concat_side_sets.c \
+	ex_put_concat_var_param.c \
+	ex_put_conn.c \
+	ex_put_coord.c \
+	ex_put_coordinate_frames.c \
+	ex_put_coord_names.c \
+	ex_put_eb_info_global.c \
+	ex_put_elem_attr.c \
+	ex_put_elem_attr_names.c \
+	ex_put_elem_block.c \
+	ex_put_elem_cmap.c \
+	ex_put_elem_conn.c \
+	ex_put_elem_map.c \
+	ex_put_elem_num_map.c \
+	ex_put_elem_var.c \
+	ex_put_elem_var_slab.c \
+	ex_put_elem_var_tab.c \
+	ex_put_entity_count_per_polyhedra.c \
+	ex_put_glob_vars.c \
+	ex_put_id_map.c \
+	ex_put_info.c \
+	ex_put_init.c \
+	ex_put_init_ext.c \
+	ex_put_init_global.c \
+	ex_put_init_info.c \
+	ex_put_loadbal_param.c \
+	ex_put_loadbal_param_cc.c \
+	ex_put_map.c \
+	ex_put_map_param.c \
+	ex_put_name.c \
+	ex_put_names.c \
+	ex_put_n_coord.c \
+	ex_put_n_elem_attr.c \
+	ex_put_n_elem_conn.c \
+	ex_put_n_elem_num_map.c \
+	ex_put_n_nodal_var.c \
+	ex_put_n_node_num_map.c \
+	ex_put_n_node_set.c \
+	ex_put_n_node_set_df.c \
+	ex_put_nodal_var.c \
+	ex_put_nodal_var_slab.c \
+	ex_put_node_cmap.c \
+	ex_put_node_map.c \
+	ex_put_node_num_map.c \
+	ex_put_node_set.c \
+	ex_put_node_set_dist_fact.c \
+	ex_put_node_set_param.c \
+	ex_put_n_one_attr.c \
+	ex_put_nset_var.c \
+	ex_put_nset_var_tab.c \
+	ex_put_n_side_set.c \
+	ex_put_n_side_set_df.c \
+	ex_put_ns_param_global.c \
+	ex_put_num_map.c \
+	ex_put_n_var.c \
+	ex_put_one_attr.c \
+	ex_put_one_elem_attr.c \
+	ex_put_partial_attr.c \
+	ex_put_partial_coord.c \
+	ex_put_partial_elem_attr.c \
+	ex_put_partial_elem_conn.c \
+	ex_put_partial_elem_map.c \
+	ex_put_partial_elem_num_map.c \
+	ex_put_partial_id_map.c \
+	ex_put_partial_nodal_var.c \
+	ex_put_partial_node_num_map.c \
+	ex_put_partial_node_set.c \
+	ex_put_partial_node_set_df.c \
+	ex_put_partial_num_map.c \
+	ex_put_partial_one_attr.c \
+	ex_put_partial_set.c \
+	ex_put_partial_set_dist_fact.c \
+	ex_put_partial_side_set.c \
+	ex_put_partial_side_set_df.c \
+	ex_put_partial_var.c \
+	ex_put_processor_elem_maps.c \
+	ex_put_processor_node_maps.c \
+	ex_put_prop_array.c \
+	ex_put_prop.c \
+	ex_put_prop_names.c \
+	ex_put_qa.c \
+	ex_put_set.c \
+	ex_put_set_dist_fact.c \
+	ex_put_set_param.c \
+	ex_put_sets.c \
+	ex_put_side_set.c \
+	ex_put_side_set_dist_fact.c \
+	ex_put_side_set_param.c \
+	ex_put_sset_var.c \
+	ex_put_sset_var_tab.c \
+	ex_put_ss_param_global.c \
+	ex_put_time.c \
+	ex_put_truth_table.c \
+	ex_put_var.c \
+	ex_put_variable_name.c \
+	ex_put_variable_names.c \
+	ex_put_variable_param.c \
+	ex_put_var_name.c \
+	ex_put_var_names.c \
+	ex_put_var_param.c \
+	ex_put_var_tab.c \
+	ex_update.c \
+	ex_add_attr.c \
+	ex_utils.c
+
+OBJS   = ${SRCS:.c=.o}
+
+#include <Library.tmpl> 
+
+LibraryTargetSubdirsCopy(libexodus.a,$(OBJS) $(PAROBJS),../../) 
+
+
+$(OBJS): ../include/exodusII.h ../include/exodusII_int.h
+DependTarget()
+LibraryObjectRule()
diff --git a/exodus/cbind/src/Makefile.standalone b/exodus/cbind/src/Makefile.standalone
new file mode 100644
index 0000000..8956cd5
--- /dev/null
+++ b/exodus/cbind/src/Makefile.standalone
@@ -0,0 +1,277 @@
+PARSRCS = ex_create_par.c \
+	  ex_open_par.c
+
+SRCS =	\
+     ex_add_attr.c \
+     ex_close.c \
+     ex_conv.c \
+     ex_copy.c \
+     ex_create.c \
+     ex_create_group.c \
+     ex_cvt_nodes_to_sides.c \
+     ex_err.c \
+     ex_get_all_times.c \
+     ex_get_attr.c \
+     ex_get_attr_names.c \
+     ex_get_attr_param.c \
+     ex_get_block.c \
+     ex_get_block_param.c \
+     ex_get_block_params.c \
+     ex_get_cmap_params.c \
+     ex_get_concat_node_sets.c \
+     ex_get_concat_sets.c \
+     ex_get_concat_side_set_node_count.c \
+     ex_get_concat_side_sets.c \
+     ex_get_conn.c \
+     ex_get_coord.c \
+     ex_get_coord_names.c \
+     ex_get_coordinate_frames.c \
+     ex_get_eb_info_global.c \
+     ex_get_elem_attr.c \
+     ex_get_elem_attr_names.c \
+     ex_get_elem_blk_ids.c \
+     ex_get_elem_block.c \
+     ex_get_elem_cmap.c \
+     ex_get_elem_conn.c \
+     ex_get_elem_map.c \
+     ex_get_elem_num_map.c \
+     ex_get_elem_type.c \
+     ex_get_elem_var.c \
+     ex_get_elem_var_tab.c \
+     ex_get_elem_var_time.c \
+     ex_get_entity_count_per_polyhedra.c \
+     ex_get_glob_var_time.c \
+     ex_get_glob_vars.c \
+     ex_get_group_id.c \
+     ex_get_group_ids.c \
+     ex_get_id_map.c \
+     ex_get_ids.c \
+     ex_get_info.c \
+     ex_get_init.c \
+     ex_get_init_ext.c \
+     ex_get_init_global.c \
+     ex_get_init_info.c \
+     ex_get_loadbal_param.c \
+     ex_get_map.c \
+     ex_get_map_param.c \
+     ex_get_n_attr.c \
+     ex_get_n_conn.c \
+     ex_get_n_coord.c \
+     ex_get_n_elem_attr.c \
+     ex_get_n_elem_conn.c \
+     ex_get_n_elem_num_map.c \
+     ex_get_n_elem_var.c \
+     ex_get_n_nodal_var.c \
+     ex_get_n_node_num_map.c \
+     ex_get_n_node_set.c \
+     ex_get_n_node_set_df.c \
+     ex_get_n_one_attr.c \
+     ex_get_n_side_set.c \
+     ex_get_n_side_set_df.c \
+     ex_get_n_var.c \
+     ex_get_name.c \
+     ex_get_names.c \
+     ex_get_nodal_var.c \
+     ex_get_nodal_var_time.c \
+     ex_get_node_cmap.c \
+     ex_get_node_map.c \
+     ex_get_node_num_map.c \
+     ex_get_node_set.c \
+     ex_get_node_set_dist_fact.c \
+     ex_get_node_set_ids.c \
+     ex_get_node_set_param.c \
+     ex_get_ns_param_global.c \
+     ex_get_nset_var.c \
+     ex_get_nset_var_tab.c \
+     ex_get_num_map.c \
+     ex_get_object_truth_vector.c \
+     ex_get_one_attr.c \
+     ex_get_one_elem_attr.c \
+     ex_get_partial_attr.c \
+     ex_get_partial_conn.c \
+     ex_get_partial_coord.c \
+     ex_get_partial_elem_attr.c \
+     ex_get_partial_elem_conn.c \
+     ex_get_partial_elem_map.c \
+     ex_get_partial_elem_num_map.c \
+     ex_get_partial_elem_var.c \
+     ex_get_partial_id_map.c \
+     ex_get_partial_nodal_var.c \
+     ex_get_partial_node_num_map.c \
+     ex_get_partial_node_set.c \
+     ex_get_partial_node_set_df.c \
+     ex_get_partial_num_map.c \
+     ex_get_partial_one_attr.c \
+     ex_get_partial_set_dist_fact.c \
+     ex_get_partial_side_set.c \
+     ex_get_partial_side_set_df.c \
+     ex_get_partial_var.c \
+     ex_get_processor_elem_maps.c \
+     ex_get_processor_node_maps.c \
+     ex_get_prop.c \
+     ex_get_prop_array.c \
+     ex_get_prop_names.c \
+     ex_get_qa.c \
+     ex_get_set.c \
+     ex_get_set_dist_fact.c \
+     ex_get_set_param.c \
+     ex_get_sets.c \
+     ex_get_side_set.c \
+     ex_get_side_set_dist_fact.c \
+     ex_get_side_set_ids.c \
+     ex_get_side_set_node_count.c \
+     ex_get_side_set_node_list.c \
+     ex_get_side_set_node_list_len.c \
+     ex_get_side_set_param.c \
+     ex_get_ss_param_global.c \
+     ex_get_sset_var.c \
+     ex_get_sset_var_tab.c \
+     ex_get_time.c \
+     ex_get_truth_table.c \
+     ex_get_var.c \
+     ex_get_var_name.c \
+     ex_get_var_names.c \
+     ex_get_var_param.c \
+     ex_get_var_tab.c \
+     ex_get_var_time.c \
+     ex_get_variable_name.c \
+     ex_get_variable_names.c \
+     ex_get_variable_param.c \
+     ex_inquire.c \
+     ex_ne_util.c \
+     ex_open.c \
+     ex_opts.c \
+     ex_put_all_var_param.c \
+     ex_put_all_var_param_ext.c \
+     ex_put_attr.c \
+     ex_put_attr_names.c \
+     ex_put_attr_param.c \
+     ex_put_block.c \
+     ex_put_block_param.c \
+     ex_put_block_params.c \
+     ex_put_cmap_params.c \
+     ex_put_cmap_params_cc.c \
+     ex_put_concat_all_blocks.c \
+     ex_put_concat_elem_block.c \
+     ex_put_concat_node_sets.c \
+     ex_put_concat_sets.c \
+     ex_put_concat_side_sets.c \
+     ex_put_concat_var_param.c \
+     ex_put_conn.c \
+     ex_put_coord.c \
+     ex_put_coord_names.c \
+     ex_put_coordinate_frames.c \
+     ex_put_eb_info_global.c \
+     ex_put_elem_attr.c \
+     ex_put_elem_attr_names.c \
+     ex_put_elem_block.c \
+     ex_put_elem_cmap.c \
+     ex_put_elem_conn.c \
+     ex_put_elem_map.c \
+     ex_put_elem_num_map.c \
+     ex_put_elem_var.c \
+     ex_put_elem_var_slab.c \
+     ex_put_elem_var_tab.c \
+     ex_put_entity_count_per_polyhedra.c \
+     ex_put_glob_vars.c \
+     ex_put_id_map.c \
+     ex_put_info.c \
+     ex_put_init.c \
+     ex_put_init_ext.c \
+     ex_put_init_global.c \
+     ex_put_init_info.c \
+     ex_put_loadbal_param.c \
+     ex_put_loadbal_param_cc.c \
+     ex_put_map.c \
+     ex_put_map_param.c \
+     ex_put_n_attr.c \
+     ex_put_n_coord.c \
+     ex_put_n_elem_attr.c \
+     ex_put_n_elem_conn.c \
+     ex_put_n_elem_num_map.c \
+     ex_put_n_nodal_var.c \
+     ex_put_n_node_num_map.c \
+     ex_put_n_node_set.c \
+     ex_put_n_node_set_df.c \
+     ex_put_n_one_attr.c \
+     ex_put_n_side_set.c \
+     ex_put_n_side_set_df.c \
+     ex_put_n_var.c \
+     ex_put_name.c \
+     ex_put_names.c \
+     ex_put_nodal_var.c \
+     ex_put_nodal_var_slab.c \
+     ex_put_node_cmap.c \
+     ex_put_node_map.c \
+     ex_put_node_num_map.c \
+     ex_put_node_set.c \
+     ex_put_node_set_dist_fact.c \
+     ex_put_node_set_param.c \
+     ex_put_ns_param_global.c \
+     ex_put_nset_var.c \
+     ex_put_nset_var_tab.c \
+     ex_put_num_map.c \
+     ex_put_one_attr.c \
+     ex_put_one_elem_attr.c \
+     ex_put_partial_attr.c \
+     ex_put_partial_coord.c \
+     ex_put_partial_elem_attr.c \
+     ex_put_partial_elem_conn.c \
+     ex_put_partial_elem_map.c \
+     ex_put_partial_elem_num_map.c \
+     ex_put_partial_id_map.c \
+     ex_put_partial_nodal_var.c \
+     ex_put_partial_node_num_map.c \
+     ex_put_partial_node_set.c \
+     ex_put_partial_node_set_df.c \
+     ex_put_partial_num_map.c \
+     ex_put_partial_one_attr.c \
+     ex_put_partial_set.c \
+     ex_put_partial_set_dist_fact.c \
+     ex_put_partial_side_set.c \
+     ex_put_partial_side_set_df.c \
+     ex_put_partial_var.c \
+     ex_put_processor_elem_maps.c \
+     ex_put_processor_node_maps.c \
+     ex_put_prop.c \
+     ex_put_prop_array.c \
+     ex_put_prop_names.c \
+     ex_put_qa.c \
+     ex_put_set.c \
+     ex_put_set_dist_fact.c \
+     ex_put_set_param.c \
+     ex_put_sets.c \
+     ex_put_side_set.c \
+     ex_put_side_set_dist_fact.c \
+     ex_put_side_set_param.c \
+     ex_put_ss_param_global.c \
+     ex_put_sset_var.c \
+     ex_put_sset_var_tab.c \
+     ex_put_time.c \
+     ex_put_truth_table.c \
+     ex_put_var.c \
+     ex_put_var_name.c \
+     ex_put_var_names.c \
+     ex_put_var_param.c \
+     ex_put_var_tab.c \
+     ex_put_variable_name.c \
+     ex_put_variable_names.c \
+     ex_put_variable_param.c \
+     ex_update.c \
+     ex_utils.c
+
+OBJS = ${SRCS:.c=.o}
+
+all:: libexodus.a
+libexodus.a: $(OBJS)
+	$(AR) $@ $?
+	$(RANLIB) $@
+	cp libexodus.a ../../
+
+clean::
+	rm -f *.CKP *.ln *.BAK *.bak *.o *.M *.mod core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut   "#"*
+
+.SUFFIXES: .c
+.c.o:
+	$(CC) -c $(CFLAGS) $*.c
+
diff --git a/exodus/cbind/src/ex_add_attr.c b/exodus/cbind/src/ex_add_attr.c
new file mode 100644
index 0000000..dd3c58c
--- /dev/null
+++ b/exodus/cbind/src/ex_add_attr.c
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2014 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+int ex_add_attr(int exoid,
+		     ex_entity_type obj_type,
+		     ex_entity_id   obj_id,
+		     int64_t     num_attr_per_entry)
+{
+  int status;
+  int dims[2];
+  int strdim, varid, att_name_varid;
+  size_t num_obj;
+  
+  char errmsg[MAX_ERR_LENGTH];
+  const char *dnumobjent;
+  const char *dnumobjatt;
+  const char *vobjatt;
+  const char *vattnam;
+  int numobjentdim;
+  int obj_id_ndx;
+  int numattrdim;
+  
+  exerrval  = 0; /* clear error code */
+
+  if (num_attr_per_entry <= 0) {
+    return (EX_NOERR);
+  }
+
+  /* Determine index of obj_id in obj_type id array */
+  if (obj_type == EX_NODAL)
+    obj_id_ndx = 0;
+  else {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_add_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id, exoid);
+	ex_err("ex_add_attr",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vobjatt = VAR_SSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vobjatt = VAR_NSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vobjatt = VAR_ESATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vobjatt = VAR_FSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vobjatt = VAR_ELSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vobjatt = VAR_NATTRIB;
+    vattnam = VAR_NAME_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vobjatt = VAR_EATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vobjatt = VAR_FATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vobjatt = VAR_ATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Bad block type (%d) specified for file id %d",
+	    obj_type, exoid );
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* element attribute array */
+  /* put netcdf file into define mode  */
+  if ((status=nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_def_dim(exoid, dnumobjatt, num_attr_per_entry, &numattrdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define number of attributes in %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+
+  status = ex_get_dimension(exoid, dnumobjent, ex_name_of_object(obj_type),
+			    &num_obj, &numobjentdim, "ex_add_attr");
+  dims[0] = numobjentdim;
+  dims[1] = numattrdim;
+
+  if ((status = nc_def_var(exoid, vobjatt, nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error:  failed to define attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+  ex_compress_variable(exoid, varid, 2);
+
+  /* inquire previously defined dimensions  */
+  if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get string length in file id %d",exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+     
+  /* Attribute names... */
+  dims[0] = numattrdim;
+  dims[1] = strdim;
+	    
+  if ((status = nc_def_var(exoid, vattnam, NC_CHAR, 2, dims, &att_name_varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define %s attribute name array in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+
+  /* leave define mode  */
+
+  if ((exerrval=nc_enddef (exoid)) != NC_NOERR) {
+    sprintf(errmsg,
+	    "Error: failed to complete %s definition in file id %d", 
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Output a dummy empty attribute name in case client code doesn't
+     write anything; avoids corruption in some cases.
+  */
+  if (att_name_varid >= 0) {
+    size_t  count[2];
+    size_t  start[2];
+    char *text = "";
+    size_t i;
+
+    count[0] = 1;
+    start[1] = 0;
+    count[1] = strlen(text)+1;
+  
+    for (i = 0; i < num_attr_per_entry; i++) {
+      start[0] = i;
+      nc_put_vara_text(exoid, att_name_varid, start, count, text);
+    }
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_add_attr",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_close.c b/exodus/cbind/src/ex_close.c
new file mode 100644
index 0000000..c7b985f
--- /dev/null
+++ b/exodus/cbind/src/ex_close.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exclos - ex_close
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for ex_get_counter_list, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_close, etc
+
+extern char *ret_string;      /* cf ex_utils.c */
+
+/*!
+
+The function ex_close() updates and then closes an open exodus file.
+
+\return In case of an error, ex_close() returns a negative number; a
+        warning will return a positive number. Possible causes of errors
+	include:
+ - data file not properly opened with call to ex_create() or ex_open()
+
+ \param exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+
+The following code segment closes an open exodus file:
+
+\code
+int error,exoid;
+error = ex_close (exoid);
+\endcode
+
+ */
+int ex_close (int exoid)
+{
+   char errmsg[MAX_ERR_LENGTH];
+   int status;
+   int parent_id = 0;
+
+   exerrval = 0; /* clear error code */
+   /*
+    * NOTE: If using netcdf-4, exoid must refer to the root group.
+    * Need to determine whether there are any groups and if so,
+    * call ex_rm_file_item and ex_rm_stat_ptr on each group.
+    */
+
+#if !defined(NOT_NETCDF4)
+   /* nc_inq_grp_parent() will return NC_ENOGRP error if exoid
+    * refers to the root group (which is what we want)
+    */
+   if ((status = nc_inq_grp_parent(exoid, &parent_id)) != NC_ENOGRP) {
+     exerrval = EX_NOTROOTID;
+     sprintf(errmsg,"Error: file id %d does not refer to root group.",exoid);
+     ex_err("ex_close",errmsg,exerrval);
+     return(EX_FATAL);
+   }
+#endif
+   
+   if ((status = nc_sync(exoid)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,"Error: failed to update file id %d",exoid);
+     ex_err("ex_close",errmsg,exerrval);
+     return(EX_FATAL);
+   }
+   if ((status = nc_close (exoid)) == NC_NOERR) {
+     ex_conv_exit(exoid);
+
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_ELEM_BLOCK));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_FACE_BLOCK));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_EDGE_BLOCK));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_NODE_SET));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_EDGE_SET));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_FACE_SET));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_SIDE_SET));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_ELEM_SET));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_NODE_MAP));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_EDGE_MAP));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_FACE_MAP));
+     ex_rm_file_item(exoid, ex_get_counter_list(EX_ELEM_MAP));
+
+     ex_rm_stat_ptr (exoid, &exoII_ed);
+     ex_rm_stat_ptr (exoid, &exoII_fa);
+     ex_rm_stat_ptr (exoid, &exoII_eb);
+     ex_rm_stat_ptr (exoid, &exoII_ns);
+     ex_rm_stat_ptr (exoid, &exoII_es);
+     ex_rm_stat_ptr (exoid, &exoII_fs);
+     ex_rm_stat_ptr (exoid, &exoII_ss);
+     ex_rm_stat_ptr (exoid, &exoII_els);
+     ex_rm_stat_ptr (exoid, &exoII_nm);
+     ex_rm_stat_ptr (exoid, &exoII_edm);
+     ex_rm_stat_ptr (exoid, &exoII_fam);
+     ex_rm_stat_ptr (exoid, &exoII_em);
+   }
+   else {
+     exerrval = status;
+     sprintf(errmsg, "Error: failed to close file id %d",exoid);
+     ex_err("ex_close",errmsg, status);
+     return(EX_FATAL);
+   }
+   return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_conv.c b/exodus/cbind/src/ex_conv.c
new file mode 100644
index 0000000..f6de360
--- /dev/null
+++ b/exodus/cbind/src/ex_conv.c
@@ -0,0 +1,441 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exutils - exodus utilities
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL, free, malloc
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for ex_file_item, EX_FATAL, etc
+#include "netcdf.h"                     // for nc_inq_format, nc_type, etc
+
+
+/*! \file
+ * this file contains code needed to support the various floating point word
+ * size combinations for computation and i/o that applications might want to
+ * use. See the netcdf documentation for more details on the floating point
+ * conversion capabilities.
+ *
+ * netCDF supports two floating point word sizes for its files:
+ *   - NC_FLOAT  - 32 bit IEEE
+ *   - NC_DOUBLE - 64 bit IEEE
+ * 
+ */
+
+#define NC_FLOAT_WORDSIZE 4
+#define NC_DOUBLE_WORDSIZE 8
+
+static struct ex_file_item* file_list = NULL;
+
+struct ex_file_item* ex_find_file_item(int exoid)
+{
+  /* Find base filename in case exoid refers to a group */
+  int base_exoid = (unsigned)exoid & EX_FILE_ID_MASK;
+  struct ex_file_item *ptr = file_list;
+  while (ptr) {						\
+    if( ptr->file_id == base_exoid ) break;				\
+    ptr = ptr->next;						\
+  }								\
+  return ptr;
+}
+
+int ex_conv_ini( int  exoid,
+		 int* comp_wordsize,
+		 int* io_wordsize,
+		 int  file_wordsize,
+		 int  int64_status,
+		 int  is_parallel)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  struct ex_file_item* new_file;
+  int filetype = 0;
+  
+  /*! ex_conv_ini() initializes the floating point conversion process.
+   *
+   * \param exoid         an integer uniquely identifying the file of interest.
+   *
+   * \param comp_wordsize compute floating point word size in the user's code.
+   *                      a zero value indicates that the user is requesting the 
+   *                      default float size for the machine. The appropriate 
+   *                      value is chosen and returned in comp_wordsize, and used
+   *                      in subsequent conversions.  a valid but inappropriate 
+   *                      for this parameter cannot be detected.
+   *
+   * \param io_wordsize   the desired floating point word size for a netCDF file.
+   *                      for an existing file, if this parameter doesn't match
+   *                      the word size of data already stored in the file, a
+   *                      fatal error is generated.  a value of 0 for an existing
+   *                      file indicates that the word size of the file was not
+   *                      known a priori, so use whatever is in the file.  a value
+   *                      of 0 for a new file means to use the default size, an
+   *                      NC_FLOAT (4 bytes).  when a value of 0 is specified the
+   *                      actual value used is returned in io_wordsize.
+   *
+   * \param file_wordsize floating point word size in an existing netCDF file.
+   *                      a value of 0 should be passed in for a new netCDF file.
+   *
+   * \param int64_status  the flags specifying how integer values should be stored
+   *                      on the database and how they should be passes through the
+   *                      api functions.  See #FileVars for more information.
+   *
+   * word size parameters are specified in bytes. valid values are 0, 4, and 8:
+   */
+
+  /* check to make sure machine word sizes aren't weird */
+  if ((sizeof(float)  != 4 && sizeof(float)  != 8) ||
+      (sizeof(double) != 4 && sizeof(double) != 8 ) )
+    {
+      sprintf(errmsg,"Error: unsupported compute word size for file id: %d",
+	      exoid);
+      ex_err("ex_conv_ini",errmsg,EX_FATAL);
+      return(EX_FATAL);
+    }
+
+  /* check to see if requested word sizes are valid */
+  if (!*io_wordsize ) {
+    if (!file_wordsize )
+      *io_wordsize = NC_FLOAT_WORDSIZE;
+    else
+      *io_wordsize = file_wordsize;
+  }
+
+  else if (*io_wordsize != 4 && *io_wordsize != 8 ) {
+    sprintf(errmsg,"Error: unsupported I/O word size for file id: %d",exoid);
+    ex_err("ex_conv_ini",errmsg,EX_FATAL);
+    return(EX_FATAL);
+  }
+
+  else if (file_wordsize && *io_wordsize != file_wordsize ) {
+    *io_wordsize = file_wordsize;
+    sprintf(errmsg,
+	    "Error: invalid I/O word size specified for existing file id: %d",
+            exoid);
+    ex_err("ex_conv_ini",errmsg,EX_MSG);
+    ex_err("ex_conv_ini",
+           "       Requested I/O word size overridden.",
+	   EX_MSG);
+  }
+
+  if (!*comp_wordsize ) {
+    *comp_wordsize = sizeof(float);
+  } else if (*comp_wordsize != 4 && *comp_wordsize != 8 ) {
+    ex_err("ex_conv_ini","Error: invalid compute wordsize specified",EX_FATAL);
+    return(EX_FATAL);
+  }
+
+  /* Check that the int64_status contains only valid bits... */
+  {
+    int valid_int64 = EX_ALL_INT64_API | EX_ALL_INT64_DB;
+    if ((int64_status & valid_int64) != int64_status) {
+      sprintf(errmsg,
+	      "Warning: invalid int64_status flag (%d) specified for existing file id: %d. Ignoring invalids",
+	      int64_status, exoid);
+      ex_err("ex_conv_ini",errmsg,EX_MSG);
+    }
+    int64_status &= valid_int64;
+  }
+  
+  /* Verify filetype 
+   *  0 -- classic format   (NC_FORMAT_CLASSIC -1)
+   *  1 -- 64 bit classic   (NC_FORMAT_64BIT   -1)
+   *  2 -- netcdf4          (NC_FORMAT_NETCDF4 -1)
+   *  3 -- netcdf4 classic  (NC_FORMAT_NETCDF4_CLASSIC -1)
+   */
+  
+  nc_inq_format(exoid, &filetype);
+     
+  new_file = malloc(sizeof(struct ex_file_item));
+
+  new_file->file_id = exoid;
+  new_file->user_compute_wordsize = *comp_wordsize == 4 ? 0 : 1;
+  new_file->int64_status = int64_status;
+  new_file->maximum_name_length = ex_default_max_name_length;
+  new_file->compression_level = 0;
+  new_file->shuffle = 0;
+  new_file->file_type = filetype-1;
+  new_file->is_parallel = is_parallel;
+  
+  new_file->next = file_list;
+  file_list = new_file;
+
+  if (*io_wordsize == NC_FLOAT_WORDSIZE)
+    new_file->netcdf_type_code = NC_FLOAT;
+  else
+    new_file->netcdf_type_code = NC_DOUBLE;
+
+  return(EX_NOERR);
+}
+
+/*............................................................................*/
+/*............................................................................*/
+
+void ex_conv_exit( int exoid )
+{
+  /*! ex_conv_exit() takes the structure identified by "exoid" out of the linked
+   * list which describes the files that ex_conv_array() knows how to convert.
+   *
+   * \note it is absolutely necessary for ex_conv_exit() to be called after
+   *       ncclose(), if the parameter used as "exoid" is the id returned from
+   *       an ncopen() or nccreate() call, as netCDF reuses file ids!
+   *       the best place to do this is ex_close(), which is where I did it.
+   *
+   * \param exoid  integer which uniquely identifies the file of interest.
+   */
+
+  char errmsg[MAX_ERR_LENGTH];
+  struct ex_file_item* file = file_list;
+  struct ex_file_item* prev = NULL;
+
+  exerrval = 0; /* clear error code */
+  while( file ) {
+    if (file->file_id == exoid ) break;
+
+    prev = file;
+    file = file->next;
+  }
+
+  if (!file ) {
+    sprintf(errmsg,"Warning: failure to clear file id %d - not in list.",exoid);
+    ex_err("ex_conv_exit",errmsg,EX_MSG);
+    exerrval = EX_BADFILEID;
+    return;
+  }
+
+  if (prev )
+    prev->next = file->next;
+  else
+    file_list = file->next;
+
+  free( file );
+}
+
+/*............................................................................*/
+/*............................................................................*/
+
+nc_type nc_flt_code( int exoid )
+{
+  /* nc_flt_code() returns either NC_FLOAT or NC_DOUBLE, based on the parameters
+   * with which ex_conv_ini() was called.  nc_flt_code() is used as the nc_type
+   * parameter on ncvardef() calls that define floating point variables.
+   *
+   * "exoid" is some integer which uniquely identifies the file of interest.
+   */
+  struct ex_file_item* file = ex_find_file_item(exoid);
+
+  exerrval = 0; /* clear error code */
+
+  if (!file ) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = EX_BADFILEID;
+    sprintf(errmsg,"Error: unknown file id %d for nc_flt_code().",exoid);
+    ex_err("nc_flt_code",errmsg,exerrval);
+    return (nc_type) -1;
+  }
+  return file->netcdf_type_code;
+}
+
+int ex_int64_status(int exoid)
+{
+  /* ex_int64_status() returns an int that can be tested
+     against the defines listed below to determine which, if any,
+     'types' in the database are to be stored as int64 types and which, if any,
+     types are passed/returned as int64 types in the API
+     
+     Defines:
+        EX_MAPS_INT64_DB  All maps (id, order, ...) store int64_t values
+        EX_IDS_INT64_DB   All entity ids (sets, blocks, maps) are int64_t values
+        EX_BULK_INT64_DB    
+        EX_ALL_INT64_DB   (EX_MAPS_INT64_DB|EX_IDS_INT64_DB|EX_BULK_INT64_DB)
+
+        EX_MAPS_INT64_API  All maps (id, order, ...) passed as int64_t values
+        EX_IDS_INT64_API   All entity ids (sets, blocks, maps) are passed as int64_t values
+        EX_BULK_INT64_API    
+        EX_ALL_INT64_API   (EX_MAPS_INT64_API|EX_IDS_INT64_API|EX_BULK_INT64_API)
+  */
+  struct ex_file_item* file = ex_find_file_item(exoid);
+
+  exerrval = 0; /* clear error code */
+
+  if (!file ) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = EX_BADFILEID;
+    sprintf(errmsg,"Error: unknown file id %d for ex_int64_status().",exoid);
+    ex_err("ex_int64_status",errmsg,exerrval);
+    return 0;
+  }
+  return file->int64_status;
+}
+
+int ex_set_int64_status(int exoid, int mode)
+{
+  /* ex_set_int64_status() sets the value of the INT64_API flags
+     which specify how integer types are passed/returned as int64 types in the API
+     
+     Mode can be one of:
+        0                  All are passed as int32_t values.
+        EX_MAPS_INT64_API  All maps (id, order, ...) passed as int64_t values
+        EX_IDS_INT64_API   All entity ids (sets, blocks, maps) are passed as int64_t values
+        EX_BULK_INT64_API    
+        EX_ALL_INT64_API   (EX_MAPS_INT64_API|EX_IDS_INT64_API|EX_BULK_INT64_API)
+  */
+
+  int api_mode = 0;
+  int db_mode = 0;
+
+  struct ex_file_item* file = ex_find_file_item(exoid);
+  
+  exerrval = 0; /* clear error code */
+
+  if (!file ) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = EX_BADFILEID;
+    sprintf(errmsg,"Error: unknown file id %d for ex_int64_status().",exoid);
+    ex_err("ex_int64_status",errmsg,exerrval);
+    return 0;
+  }
+
+  /* Strip of all non-INT64_API values */
+  api_mode = mode & EX_ALL_INT64_API;
+  db_mode = file->int64_status & EX_ALL_INT64_DB;
+  
+  file->int64_status = api_mode | db_mode;
+  return file->int64_status;
+}
+
+int ex_set_option(int exoid, ex_option_type option, int option_value)
+{
+  struct ex_file_item* file = ex_find_file_item(exoid);
+  if (!file ) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = EX_BADFILEID;
+    sprintf(errmsg,"Error: unknown file id %d for ex_set_option().",exoid);
+    ex_err("ex_set_option",errmsg,exerrval);
+    return EX_FATAL;
+  }
+  
+  exerrval = 0; /* clear error code */
+
+  switch (option) {
+  case EX_OPT_MAX_NAME_LENGTH:
+    file->maximum_name_length = option_value;
+    break;
+  case EX_OPT_COMPRESSION_TYPE:     /* Currently not used. GZip by default */
+    break;
+  case EX_OPT_COMPRESSION_LEVEL:    /* 0 (disabled/fastest) ... 9 (best/slowest) */
+    /* Check whether file type supports compression... */
+    if (file->file_type == 2 || file->file_type == 3) {
+      int value = option_value;
+      if (value > 9) value = 9;
+      if (value < 0) value = 0;
+      file->compression_level = value;
+    }
+    else {
+      file->compression_level = 0;
+    }      
+    break;
+  case EX_OPT_COMPRESSION_SHUFFLE:  /* 0 (disabled); 1 (enabled) */
+    file->shuffle = option_value != 0 ? 1 : 0;
+    break;
+  case EX_OPT_INTEGER_SIZE_API:     /* See *_INT64_* values above */
+    ex_set_int64_status(exoid, option_value);
+    break;
+  case EX_OPT_INTEGER_SIZE_DB: /* (query only) */
+    break;
+  default:
+    {
+      char errmsg[MAX_ERR_LENGTH];
+      exerrval = EX_FATAL;
+      sprintf(errmsg,"Error: invalid option %d for ex_set_option().",(int)option);
+      ex_err("ex_set_option",errmsg,exerrval);
+      return EX_FATAL;
+    }
+  }
+  return EX_NOERR;
+}
+
+int ex_comp_ws( int exoid )
+{
+/*!
+ * ex_comp_ws() returns 4 (i.e. sizeof(float)) or 8 (i.e. sizeof(double)),
+ * depending on the value of floating point word size used to initialize
+ * the conversion facility for this file id (exoid).
+ * \param exoid  integer which uniquely identifies the file of interest.
+*/
+  struct ex_file_item* file = ex_find_file_item(exoid);
+
+    exerrval = 0; /* clear error code */
+
+    if (!file ) {
+      char errmsg[MAX_ERR_LENGTH];
+      exerrval = EX_BADFILEID;
+      sprintf(errmsg,"Error: unknown file id %d",exoid);
+      ex_err("ex_comp_ws",errmsg,exerrval);
+      return(EX_FATAL);
+    }
+    /* Stored as 0 for 4-byte; 1 for 8-byte */
+    return (file->user_compute_wordsize+1)*4;
+  }
+
+int ex_is_parallel(int exoid)
+{
+  /*! ex_is_parallel() returns 1 (true) or 0 (false) depending on whether
+   * the file was opened in parallel or serial/file-per-processor mode.
+   * Note that in this case parallel assumes the output of a single file,
+   * not a parallel run using file-per-processor.
+   */
+  struct ex_file_item* file = ex_find_file_item(exoid);
+
+  exerrval = 0; /* clear error code */
+
+  if (!file ) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = EX_BADFILEID;
+    sprintf(errmsg,"Error: unknown file id %d",exoid);
+    ex_err("ex_is_parallel",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+  /* Stored as 1 for parallel, 0 for serial or file-per-processor */
+  return file->is_parallel;
+}
diff --git a/exodus/cbind/src/ex_copy.c b/exodus/cbind/src/ex_copy.c
new file mode 100644
index 0000000..1b7eb25
--- /dev/null
+++ b/exodus/cbind/src/ex_copy.c
@@ -0,0 +1,852 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <assert.h>                     // for assert
+#include <stddef.h>                     // for size_t
+#include <stdlib.h>                     // for malloc, free
+#include <string.h>                     // for strcmp, strncmp, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_large_model, etc
+#include "exodusII_int.h"               // for ex_get_counter_list, etc
+#include "netcdf.h"                     // for nc_inq_varid, etc
+
+/*! \cond INTERNAL */
+struct ncdim {                  /* dimension */
+    char name[MAX_VAR_NAME_LENGTH];
+    size_t size;
+};
+
+struct ncvar {                  /* variable */
+    char name[MAX_VAR_NAME_LENGTH];
+    nc_type type;
+    int ndims;
+    int dims[NC_MAX_VAR_DIMS];
+    int natts;
+};
+
+struct ncatt {                  /* attribute */
+    int var;
+    char name[MAX_VAR_NAME_LENGTH];
+    nc_type type;
+    size_t len;
+    void *val;
+};
+
+static size_t type_size(nc_type type);
+static int cpy_att    (int, int, int, int);
+static int cpy_var_def(int, int, int, char*);
+static int cpy_var_val(int, int, char*);
+static int cpy_coord_def(int in_id,int out_id,int rec_dim_id,
+			 char *var_nm, int in_large, int out_large);
+static int cpy_coord_val(int in_id,int out_id,char *var_nm,
+			 int in_large, int out_large);
+static void update_internal_structs( int, ex_inquiry, struct list_item** );
+/*! \endcond */
+
+/*!
+  \undoc
+
+ *  efficiently copies all non-transient information (attributes,
+ * dimensions, and variables from an opened EXODUS file to another
+ * opened EXODUS file.  Will not overwrite a dimension or variable
+ * already defined in the new file.
+ * \param      in_exoid     exodus file id for input file
+ * \param      out_exoid    exodus file id for output file
+ */
+
+int ex_copy (int in_exoid, int out_exoid)
+{
+   int status;
+   int ndims;                   /* number of dimensions */
+   int nvars;                   /* number of variables */
+   int ngatts;                  /* number of global attributes */
+   int recdimid;                /* id of unlimited dimension */
+   int dimid;                   /* dimension id */
+   int dim_out_id;              /* dimension id */
+   int varid;                   /* variable id */
+   int var_out_id;              /* variable id */
+   struct ncvar var;            /* variable */
+   struct ncatt att;            /* attribute */
+   nc_type att_type = NC_NAT;
+   size_t att_len = 0;
+   size_t i;
+   size_t numrec;
+   size_t dim_sz;
+   char dim_nm[NC_MAX_NAME];
+   int in_large, out_large;
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0; /* clear error code */
+
+   /*
+    * Get exodus_large_model setting on both input and output
+    * databases so know how to handle coordinates.
+    */
+   in_large  = ex_large_model(in_exoid);
+   out_large = ex_large_model(out_exoid);
+   
+   /*
+    * get number of dimensions, number of variables, number of global
+    * atts, and dimension id of unlimited dimension, if any
+    */
+
+   (void)nc_inq(in_exoid, &ndims, &nvars, &ngatts, &recdimid);
+   (void)nc_inq_dimlen(in_exoid, recdimid, &numrec);
+
+   /* put output file into define mode */
+   (void)nc_redef(out_exoid);
+
+   /* copy global attributes */
+   for (i = 0; i < (size_t)ngatts; i++) {
+
+     (void)nc_inq_attname(in_exoid, NC_GLOBAL, i, att.name);
+        
+     /* if attribute exists in output file, don't overwrite it; compute 
+      * word size, I/O word size etc. are global attributes stored when
+      * file is created with ex_create;  we don't want to overwrite those
+      */
+     if ((status = nc_inq_att(out_exoid, NC_GLOBAL, att.name, &att.type, &att.len)) != NC_NOERR) {
+
+        /* The "last_written_time" attribute is a special attribute
+           used by the Sierra IO system to determine whether a
+           timestep has been fully written to the database in order to
+           try to detect a database crash that happens in the middle
+           of a database output step. Don't want to copy that attribute.
+        */
+        if (strcmp(att.name,"last_written_time") != 0) {
+          /* attribute doesn't exist in new file so OK to create it */
+          nc_copy_att(in_exoid,NC_GLOBAL,att.name,out_exoid,NC_GLOBAL);
+        }
+      }
+   }
+
+   /* copy dimensions */
+
+   /* Get the dimension sizes and names */
+
+   for(dimid = 0; dimid < ndims; dimid++){
+
+     (void)nc_inq_dim(in_exoid,dimid,dim_nm,&dim_sz);
+
+     /* If the dimension isn't one we specifically don't want 
+      * to copy (ie, number of QA or INFO records) and it 
+      * hasn't been defined, copy it */
+     
+     if ( ( strcmp(dim_nm,DIM_NUM_QA)        != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_INFO)      != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_NOD_VAR)   != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_EDG_VAR)   != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_FAC_VAR)   != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_ELE_VAR)   != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_NSET_VAR)  != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_ESET_VAR)  != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_FSET_VAR)  != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_SSET_VAR)  != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_ELSET_VAR) != 0) &&
+	  ( strcmp(dim_nm,DIM_NUM_GLO_VAR)   != 0) ) {
+       
+       /* See if the dimension has already been defined */
+       status = nc_inq_dimid(out_exoid, dim_nm, &dim_out_id);
+       
+       if(status != NC_NOERR) {
+	 if(dimid != recdimid) {
+	   status = nc_def_dim(out_exoid, dim_nm, dim_sz,       &dim_out_id);
+	 } else {
+	   status = nc_def_dim(out_exoid, dim_nm, NC_UNLIMITED, &dim_out_id);
+	 } /* end else */
+	 if (status != NC_NOERR) {
+	   exerrval = status;
+	   sprintf(errmsg,
+		   "Error: failed to define %s dimension in file id %d",
+		   dim_nm, out_exoid);
+	   ex_err("ex_copy",errmsg,exerrval);
+	   return (EX_FATAL);
+	 }
+       } /* end if */
+     } /* end if */
+   } /* end loop over dim */
+
+   /* DIM_STR_NAME is a newly added dimension required by current API.
+    * If it doesn't exist on the source database, we need to add it to
+    * the target...
+    */
+   status = nc_inq_dimid(in_exoid, DIM_STR_NAME, &dim_out_id);
+   if (status != NC_NOERR) {
+     /* Not found; set to default value of 32+1. */
+     if ((status = nc_def_dim(out_exoid, DIM_STR_NAME, 33, &dim_out_id)) != NC_NOERR) {
+       exerrval = status;
+       sprintf(errmsg,
+	       "Error: failed to define string name dimension in file id %d",
+	       out_exoid);
+       ex_err("ex_copy",errmsg,exerrval);
+       return (EX_FATAL);
+     }
+   }
+
+   status = nc_inq_att(in_exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, &att_type, &att_len);
+   if (status != NC_NOERR) {
+      int max_so_far = 32;
+      nc_put_att_int(out_exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, NC_INT, 1, &max_so_far);
+    }
+
+   /* copy variable definitions and variable attributes */
+   for (varid = 0; varid < nvars; varid++) {
+
+     (void)nc_inq_var(in_exoid, varid, var.name, &var.type, &var.ndims, 
+		 var.dims, &var.natts);
+
+      /* we don't want to copy some variables because there is not a
+       * simple way to add to them;
+       * QA records, info records and all results variables (nodal
+       * element, and global results) are examples
+       */
+
+      if ( ( strcmp(var.name,VAR_QA_TITLE)      != 0) &&
+           ( strcmp(var.name,VAR_INFO)          != 0) &&
+           ( strcmp(var.name,VAR_EBLK_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_FBLK_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_ELEM_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_ELSET_TAB)     != 0) &&
+           ( strcmp(var.name,VAR_SSET_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_FSET_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_ESET_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_NSET_TAB)      != 0) &&
+           ( strcmp(var.name,VAR_NAME_GLO_VAR)  != 0) &&
+           ( strcmp(var.name,VAR_GLO_VAR)       != 0) &&
+           ( strcmp(var.name,VAR_NAME_NOD_VAR)  != 0) &&
+           ( strcmp(var.name,VAR_NOD_VAR)       != 0) &&
+           ( strcmp(var.name,VAR_NAME_EDG_VAR)  != 0) &&
+           ( strcmp(var.name,VAR_NAME_FAC_VAR)  != 0) &&
+           ( strcmp(var.name,VAR_NAME_ELE_VAR)  != 0) &&
+           ( strcmp(var.name,VAR_NAME_NSET_VAR) != 0) &&
+           ( strcmp(var.name,VAR_NAME_ESET_VAR) != 0) &&
+           ( strcmp(var.name,VAR_NAME_FSET_VAR) != 0) &&
+           ( strcmp(var.name,VAR_NAME_SSET_VAR) != 0) &&
+           ( strcmp(var.name,VAR_NAME_ELSET_VAR) != 0)&&
+           ( strncmp(var.name,"vals_elset_var", 14) != 0) &&
+           ( strncmp(var.name,"vals_sset_var",  13) != 0) &&
+           ( strncmp(var.name,"vals_fset_var",  13) != 0) &&
+           ( strncmp(var.name,"vals_eset_var",  13) != 0) &&
+           ( strncmp(var.name,"vals_nset_var",  13) != 0) &&
+           ( strncmp(var.name,"vals_nod_var",   12) != 0) &&
+           ( strncmp(var.name,"vals_edge_var",  13) != 0) &&
+           ( strncmp(var.name,"vals_face_var",  13) != 0) &&
+           ( strncmp(var.name,"vals_elem_var",  13) != 0) ) {
+
+        if (strncmp(var.name,VAR_COORD,5) == 0) {
+          var_out_id = cpy_coord_def (in_exoid, out_exoid, recdimid, var.name,
+                                      in_large, out_large);
+        } else {
+          var_out_id = cpy_var_def (in_exoid, out_exoid, recdimid, var.name);
+        }
+
+         /* copy the variable's attributes */
+         (void) cpy_att (in_exoid, out_exoid, varid, var_out_id);
+
+      }
+   }
+
+   /* take the output file out of define mode */
+   if ((exerrval=nc_enddef (out_exoid)) != NC_NOERR) {
+     sprintf(errmsg,
+	     "Error: failed to complete definition in file id %d", 
+	     out_exoid);
+     ex_err("ex_copy",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   /* output variable data */
+
+   for (varid = 0; varid < nvars; varid++) {
+     (void)nc_inq_var(in_exoid, varid, var.name, &var.type, &var.ndims,
+		 var.dims, &var.natts);
+
+      /* we don't want to copy some variable values;
+       * QA records and info records shouldn't be copied because there
+       * isn't an easy way to add to them;
+       * the time value array ("time_whole") and any results variables
+       * (nodal, elemental, or global) shouldn't be copied 
+       */
+
+      if ( ( strcmp(var.name,VAR_QA_TITLE) != 0)        &&
+           ( strcmp(var.name,VAR_INFO) != 0)            &&
+           ( strcmp(var.name,VAR_EBLK_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_FBLK_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_ELEM_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_ELSET_TAB) != 0)       &&
+           ( strcmp(var.name,VAR_SSET_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_FSET_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_ESET_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_NSET_TAB) != 0)        &&
+           ( strcmp(var.name,VAR_NAME_GLO_VAR) != 0)    &&
+           ( strcmp(var.name,VAR_GLO_VAR) != 0)         &&
+           ( strcmp(var.name,VAR_NAME_NOD_VAR) != 0)    &&
+           ( strcmp(var.name,VAR_NOD_VAR) != 0)         &&
+           ( strcmp(var.name,VAR_NAME_EDG_VAR) != 0)    &&
+           ( strcmp(var.name,VAR_NAME_FAC_VAR) != 0)    &&
+           ( strcmp(var.name,VAR_NAME_ELE_VAR) != 0)    &&
+           ( strcmp(var.name,VAR_NAME_NSET_VAR) != 0)   &&
+           ( strcmp(var.name,VAR_NAME_ESET_VAR) != 0)   &&
+           ( strcmp(var.name,VAR_NAME_FSET_VAR) != 0)   &&
+           ( strcmp(var.name,VAR_NAME_SSET_VAR) != 0)   &&
+           ( strcmp(var.name,VAR_NAME_ELSET_VAR) != 0)  &&
+           ( strncmp(var.name,"vals_elset_var", 14) != 0)&&
+           ( strncmp(var.name,"vals_sset_var", 13) != 0)&&
+           ( strncmp(var.name,"vals_fset_var", 13) != 0)&&
+           ( strncmp(var.name,"vals_eset_var", 13) != 0)&&
+           ( strncmp(var.name,"vals_nset_var", 13) != 0)&&
+           ( strncmp(var.name,"vals_nod_var", 12) != 0) &&
+           ( strncmp(var.name,"vals_edge_var",13) != 0) &&
+           ( strncmp(var.name,"vals_face_var",13) != 0) &&
+           ( strncmp(var.name,"vals_elem_var",13) != 0) &&
+           ( strcmp(var.name,VAR_WHOLE_TIME) != 0) ) {
+
+        if (strncmp(var.name,VAR_COORD,5) == 0) {
+          (void) cpy_coord_val (in_exoid, out_exoid, var.name,
+                                in_large, out_large);
+        } else {
+          (void) cpy_var_val (in_exoid, out_exoid, var.name);
+        }
+
+      }
+   }
+
+   /* ensure internal data structures are updated */
+
+   /* if number of blocks > 0 */
+   update_internal_structs( out_exoid, EX_INQ_EDGE_BLK, ex_get_counter_list(EX_EDGE_BLOCK));
+   update_internal_structs( out_exoid, EX_INQ_FACE_BLK, ex_get_counter_list(EX_FACE_BLOCK));
+   update_internal_structs( out_exoid, EX_INQ_ELEM_BLK, ex_get_counter_list(EX_ELEM_BLOCK));
+
+   /* if number of sets > 0 */
+   update_internal_structs( out_exoid, EX_INQ_NODE_SETS, ex_get_counter_list(EX_NODE_SET));
+   update_internal_structs( out_exoid, EX_INQ_EDGE_SETS, ex_get_counter_list(EX_EDGE_SET));
+   update_internal_structs( out_exoid, EX_INQ_FACE_SETS, ex_get_counter_list(EX_FACE_SET));
+   update_internal_structs( out_exoid, EX_INQ_SIDE_SETS, ex_get_counter_list(EX_SIDE_SET));
+   update_internal_structs( out_exoid, EX_INQ_ELEM_SETS, ex_get_counter_list(EX_ELEM_SET));
+
+   /* if number of maps > 0 */
+   update_internal_structs( out_exoid, EX_INQ_NODE_MAP, ex_get_counter_list(EX_NODE_MAP));
+   update_internal_structs( out_exoid, EX_INQ_EDGE_MAP, ex_get_counter_list(EX_EDGE_MAP));
+   update_internal_structs( out_exoid, EX_INQ_FACE_MAP, ex_get_counter_list(EX_FACE_MAP));
+   update_internal_structs( out_exoid, EX_INQ_ELEM_MAP, ex_get_counter_list(EX_ELEM_MAP));
+
+   return(EX_NOERR);
+}
+
+/*! \cond INTERNAL */
+int cpy_att(int in_id,int out_id,int var_in_id,int var_out_id)
+/*
+   int in_id: input netCDF input-file ID
+   int out_id: input netCDF output-file ID
+   int var_in_id: input netCDF input-variable ID
+   int var_out_id: input netCDF output-variable ID
+ */
+{
+  /* Routine to copy all the attributes from the input netCDF
+     file to the output netCDF file. If var_in_id == NC_GLOBAL,
+     then the global attributes are copied. Otherwise the variable's
+     attributes are copied. */
+
+  int idx;
+  int nbr_att;
+
+  if(var_in_id == NC_GLOBAL) {
+    (void)nc_inq_natts(in_id,&nbr_att);
+  } else {
+    (void)nc_inq_varnatts(in_id, var_in_id, &nbr_att);
+  }
+
+  /* Get the attributes names, types, lengths, and values */
+  for (idx=0; idx<nbr_att; idx++) {
+    char att_nm[MAX_VAR_NAME_LENGTH];
+
+    (void)nc_inq_attname(in_id, var_in_id, idx, att_nm);
+    (void)nc_copy_att(in_id, var_in_id, att_nm, out_id, var_out_id);
+  } 
+
+  return(EX_NOERR);
+} 
+
+/*! \internal */
+int cpy_coord_def(int in_id,int out_id,int rec_dim_id,char *var_nm,
+		  int in_large, int out_large)
+/*
+   int in_id: input netCDF input-file ID
+   int out_id: input netCDF output-file ID
+   int rec_dim_id: input input-file record dimension ID
+   char *var_nm: input variable name
+   int in_large: large file setting for input file
+   int out_large: large file setting for output file
+   int cpy_var_def(): output output-file variable ID
+ */
+{
+  const char *routine = NULL;
+  int status;
+  size_t spatial_dim;
+  int nbr_dim;
+  int temp;
+
+  int dim_out_id[2];
+  int var_out_id = -1;
+  
+  /* Handle easiest situation first: in_large matches out_large */
+  if (in_large == out_large) {
+    return cpy_var_def(in_id, out_id, rec_dim_id, var_nm);
+  }
+
+  /* At this point, know that in_large != out_large, so some change to
+     the coord variable definition is needed. Also will need the
+     spatial dimension, so get that now.*/
+  ex_get_dimension(in_id, DIM_NUM_DIM, "dimension", &spatial_dim, &temp, routine);
+  
+  if (in_large == 0 && out_large == 1) {
+    /* output file will have coordx, coordy, coordz (if 3d).  See if
+       they are already defined in output file. Assume either all or
+       none are defined. */
+
+    {
+      int var_out_idx, var_out_idy, var_out_idz;
+      int status1 = nc_inq_varid(out_id, VAR_COORD_X, &var_out_idx);
+      int status2 = nc_inq_varid(out_id, VAR_COORD_Y, &var_out_idy);
+      int status3 = nc_inq_varid(out_id, VAR_COORD_Y, &var_out_idz);
+
+      if (status1 == NC_NOERR && status2 == NC_NOERR &&
+          (spatial_dim == 2 || status3 == NC_NOERR)) {
+        return NC_NOERR; /* already defined in output file */
+      }
+    }
+
+    /* Get dimid of the num_nodes dimension in output file... */
+    (void)nc_inq_dimid(out_id, DIM_NUM_NODES, &dim_out_id[0]);
+
+    /* Define the variables in the output file */
+    
+    /* Define according to the EXODUS file's IO_word_size */
+    nbr_dim = 1;
+    (void)nc_def_var(out_id, VAR_COORD_X, nc_flt_code(out_id), nbr_dim, dim_out_id, &var_out_id);
+    ex_compress_variable(out_id, var_out_id, 2);
+    if (spatial_dim > 1) {
+      (void)nc_def_var(out_id, VAR_COORD_Y, nc_flt_code(out_id), nbr_dim, dim_out_id, &var_out_id);
+      ex_compress_variable(out_id, var_out_id, 2);
+    }
+    if (spatial_dim > 2) {
+      (void)nc_def_var(out_id, VAR_COORD_Z, nc_flt_code(out_id), nbr_dim, dim_out_id, &var_out_id);
+      ex_compress_variable(out_id, var_out_id, 2);
+    }
+  }
+
+  if (in_large == 1 && out_large == 0) {
+    /* input file has coordx, coordy, coordz (if 3d); output will only
+       have "coord".  See if is already defined in output file. */
+    status = nc_inq_varid(out_id, VAR_COORD, &var_out_id);
+    if (status == NC_NOERR)
+      return NC_NOERR; /* already defined in output file */
+
+    /* Get dimid of the spatial dimension and num_nodes dimensions in output file... */
+    (void)nc_inq_dimid(out_id, DIM_NUM_DIM,   &dim_out_id[0]);
+    (void)nc_inq_dimid(out_id, DIM_NUM_NODES, &dim_out_id[1]);
+
+    /* Define the variable in the output file */
+    
+    /* Define according to the EXODUS file's IO_word_size */
+    nbr_dim = 2;
+    (void)nc_def_var(out_id, VAR_COORD, nc_flt_code(out_id), nbr_dim, dim_out_id, &var_out_id);
+  }
+  return var_out_id;
+}
+
+/*! \internal */
+int cpy_var_def(int in_id,int out_id,int rec_dim_id,char *var_nm)
+/*
+   int in_id: input netCDF input-file ID
+   int out_id: input netCDF output-file ID
+   int rec_dim_id: input input-file record dimension ID
+   char *var_nm: input variable name
+   int cpy_var_def(): output output-file variable ID
+ */
+{
+  /* Routine to copy the variable metadata from an input netCDF file
+   * to an output netCDF file. 
+   */
+
+  int status;
+  int *dim_in_id;
+  int *dim_out_id;
+  int idx;
+  int nbr_dim;
+  int var_in_id;
+  int var_out_id;
+
+  nc_type var_type;
+
+  /* See if the requested variable is already in the output file. */
+  status = nc_inq_varid(out_id, var_nm, &var_out_id);
+  if(status == NC_NOERR)
+    return var_out_id;
+
+  /* See if the requested variable is in the input file. */
+  (void)nc_inq_varid(in_id, var_nm, &var_in_id);
+
+  /* Get the type of the variable and the number of dimensions. */
+  (void)nc_inq_vartype (in_id, var_in_id, &var_type);
+  (void)nc_inq_varndims(in_id, var_in_id, &nbr_dim);
+
+  /* Recall:
+     1. The dimensions must be defined before the variable.
+     2. The variable must be defined before the attributes. */
+
+  /* Allocate space to hold the dimension IDs */
+  dim_in_id=malloc(nbr_dim*sizeof(int)); 
+  dim_out_id=malloc(nbr_dim*sizeof(int));
+
+  /* Get the dimension IDs */
+  (void)nc_inq_vardimid(in_id, var_in_id, dim_in_id);
+
+  /* Get the dimension sizes and names */
+  for(idx=0;idx<nbr_dim;idx++){
+    char dim_nm[NC_MAX_NAME];
+    size_t dim_sz;
+
+    (void)nc_inq_dim(in_id, dim_in_id[idx], dim_nm, &dim_sz);
+
+    /* See if the dimension has already been defined */
+    status = nc_inq_dimid(out_id, dim_nm, &dim_out_id[idx]);
+
+    /* If the dimension hasn't been defined, copy it */
+    if (status != NC_NOERR) {
+      if (dim_in_id[idx] != rec_dim_id) {
+        (void)nc_def_dim(out_id, dim_nm, dim_sz, &dim_out_id[idx]);
+      } else {
+        (void)nc_def_dim(out_id, dim_nm, NC_UNLIMITED, &dim_out_id[idx]);
+      } 
+    } 
+  } 
+
+  /* Define the variable in the output file */
+
+  /* If variable is float or double, define it according to the EXODUS
+     file's IO_word_size */
+
+  if ((var_type == NC_FLOAT) || (var_type == NC_DOUBLE)) {
+    (void)nc_def_var(out_id, var_nm, nc_flt_code(out_id), nbr_dim, dim_out_id, &var_out_id);
+    ex_compress_variable(out_id, var_out_id, 2);
+  } else {
+    (void)nc_def_var(out_id, var_nm, var_type,            nbr_dim, dim_out_id, &var_out_id);
+    ex_compress_variable(out_id, var_out_id, 1);
+  }
+
+  /* Free the space holding the dimension IDs */
+  (void)free(dim_in_id);
+  (void)free(dim_out_id);
+
+  return var_out_id;
+} /* end cpy_var_def() */
+
+/*! \internal */
+int
+cpy_var_val(int in_id,int out_id,char *var_nm)
+/*
+   int in_id: input netCDF input-file ID
+   int out_id: input netCDF output-file ID
+   char *var_nm: input variable name
+ */
+{
+  /* Routine to copy the variable data from an input netCDF file
+   * to an output netCDF file. 
+   */
+
+  int *dim_id;
+  int idx;
+  int nbr_dim;
+  int var_in_id;
+  int var_out_id;
+  size_t *dim_cnt;
+  size_t *dim_sz;
+  size_t *dim_srt;
+  size_t var_sz=1L;
+  nc_type var_type_in, var_type_out;
+
+  void *void_ptr;
+
+  /* Get the var_id for the requested variable from both files. */
+  (void)nc_inq_varid(in_id, var_nm, &var_in_id);
+  (void)nc_inq_varid(out_id,var_nm, &var_out_id);
+ 
+  /* Get the number of dimensions for the variable. */
+  (void)nc_inq_vartype( out_id, var_out_id, &var_type_out);
+  (void)nc_inq_varndims(out_id, var_out_id, &nbr_dim);
+
+  (void)nc_inq_vartype( in_id,   var_in_id, &var_type_in);
+  (void)nc_inq_varndims(in_id,   var_in_id, &nbr_dim);
+ 
+  /* Allocate space to hold the dimension IDs */
+  dim_cnt = malloc(nbr_dim*sizeof(size_t));
+
+  dim_id=malloc(nbr_dim*sizeof(int));
+
+  dim_sz=malloc(nbr_dim*sizeof(size_t));
+
+  dim_srt=malloc(nbr_dim*sizeof(size_t));
+ 
+  /* Get the dimension IDs from the input file */
+  (void)nc_inq_vardimid(in_id, var_in_id, dim_id);
+ 
+  /* Get the dimension sizes and names from the input file */
+  for(idx=0;idx<nbr_dim;idx++){
+  /* NB: For the unlimited dimension, ncdiminq() returns the maximum
+     value used so far in writing data for that dimension.
+     Thus if you read the dimension sizes from the output file, then
+     the ncdiminq() returns dim_sz=0 for the unlimited dimension
+     until a variable has been written with that dimension. This is
+     the reason for always reading the input file for the dimension
+     sizes. */
+
+    (void)nc_inq_dimlen(in_id,dim_id[idx],dim_cnt+idx);
+
+    /* Initialize the indicial offset and stride arrays */
+    dim_srt[idx]=0L;
+    var_sz*=dim_cnt[idx];
+  } /* end loop over dim */
+
+  /* Allocate enough space to hold the variable */
+  void_ptr=malloc(var_sz * type_size(var_type_in));
+
+  /* Get the variable */
+
+  /* if variable is float or double, convert if necessary */
+
+  if(nbr_dim==0){  /* variable is a scalar */
+
+    if (var_type_in == NC_INT && var_type_out == NC_INT) {
+      nc_get_var1_int(in_id,  var_in_id,  0L, void_ptr);
+      nc_put_var1_int(out_id, var_out_id, 0L, void_ptr);
+    }
+
+    else if (var_type_in == NC_INT64 && var_type_out == NC_INT64) {
+      nc_get_var1_longlong(in_id,  var_in_id,  0L, void_ptr);
+      nc_put_var1_longlong(out_id, var_out_id, 0L, void_ptr);
+    }
+
+    else if (var_type_in == NC_FLOAT) {
+      nc_get_var1_float(in_id,  var_in_id,  0L, void_ptr);
+      nc_put_var1_float(out_id, var_out_id, 0L, void_ptr);
+    }
+
+    else if (var_type_in == NC_DOUBLE) {
+      nc_get_var1_double(in_id,  var_in_id,  0L, void_ptr);
+      nc_put_var1_double(out_id, var_out_id, 0L, void_ptr);
+    }
+
+    else if (var_type_in == NC_CHAR) {
+      nc_get_var1_text(in_id,  var_in_id,  0L, void_ptr);
+      nc_put_var1_text(out_id, var_out_id, 0L, void_ptr);
+    }
+
+    else {
+      assert(1==0);
+    }
+  } else { /* variable is a vector */
+
+    if (var_type_in == NC_INT && var_type_out == NC_INT) {
+      (void)nc_get_var_int(in_id,  var_in_id,  void_ptr);
+      (void)nc_put_var_int(out_id, var_out_id, void_ptr);
+    }
+
+    else if (var_type_in == NC_INT64 && var_type_out == NC_INT64) {
+      (void)nc_get_var_longlong(in_id,  var_in_id,  void_ptr);
+      (void)nc_put_var_longlong(out_id, var_out_id, void_ptr);
+    }
+
+    else if (var_type_in == NC_FLOAT) {
+      (void)nc_get_var_float(in_id,  var_in_id,  void_ptr);
+      (void)nc_put_var_float(out_id, var_out_id, void_ptr);
+    }
+
+    else if (var_type_in == NC_DOUBLE) {
+      (void)nc_get_var_double(in_id,  var_in_id,  void_ptr);
+      (void)nc_put_var_double(out_id, var_out_id, void_ptr);
+    }
+
+    else if (var_type_in == NC_CHAR) {
+      (void)nc_get_var_text(in_id,  var_in_id,  void_ptr);
+      (void)nc_put_var_text(out_id, var_out_id, void_ptr);
+    }
+
+    else {
+      assert(1==0);
+    }
+  } /* end if variable is an array */
+
+  /* Free the space that held the dimension IDs */
+  (void)free(dim_cnt);
+  (void)free(dim_id);
+  (void)free(dim_sz);
+  (void)free(dim_srt);
+
+  /* Free the space that held the variable */
+  (void)free(void_ptr);
+
+  return(EX_NOERR);
+
+} /* end cpy_var_val() */
+
+/*! \internal */
+int
+cpy_coord_val(int in_id,int out_id,char *var_nm,
+              int in_large, int out_large)
+/*
+   int in_id: input netCDF input-file ID
+   int out_id: input netCDF output-file ID
+   char *var_nm: input variable name
+ */
+{
+  /* Routine to copy the coordinate data from an input netCDF file
+   * to an output netCDF file. 
+   */
+
+  const char *routine = NULL;
+  int temp;
+  size_t i;
+  size_t spatial_dim, num_nodes;
+  size_t start[2], count[2];
+  nc_type var_type_in, var_type_out;
+
+  void *void_ptr = NULL;
+
+  /* Handle easiest situation first: in_large matches out_large */
+  if (in_large == out_large)
+    return cpy_var_val(in_id, out_id, var_nm);
+  
+  /* At this point, know that in_large != out_large, so will need to
+     either copy a vector to multiple scalars or vice-versa.  Also
+     will need a couple dimensions, so get them now.*/
+  ex_get_dimension(in_id, DIM_NUM_DIM, "dimension", &spatial_dim, &temp, routine);
+  ex_get_dimension(in_id, DIM_NUM_NODES, "nodes",   &num_nodes, &temp, routine);
+
+  if (in_large == 0 && out_large == 1) {
+    /* output file will have coordx, coordy, coordz (if 3d). */
+    /* Get the var_id for the requested variable from both files. */
+    int var_in_id, var_out_id[3];
+    (void)nc_inq_varid(in_id, VAR_COORD, &var_in_id);
+
+    (void)nc_inq_varid(out_id, VAR_COORD_X, &var_out_id[0]);
+    (void)nc_inq_varid(out_id, VAR_COORD_Y, &var_out_id[1]);
+    (void)nc_inq_varid(out_id, VAR_COORD_Z, &var_out_id[2]);
+
+    (void)nc_inq_vartype( in_id, var_in_id,     &var_type_in);
+    (void)nc_inq_vartype(out_id, var_out_id[0], &var_type_out);
+
+    void_ptr=malloc(num_nodes * type_size(var_type_in));
+
+    /* Copy each component of the variable... */
+    for (i=0; i < spatial_dim; i++) {
+      start[0] = i; start[1] = 0;
+      count[0] = 1; count[1] = num_nodes;
+      if (var_type_in == NC_FLOAT) {
+	nc_get_vara_float(in_id, var_in_id,     start, count, void_ptr);
+	nc_put_var_float(out_id, var_out_id[i],               void_ptr);
+      } else {
+	assert(var_type_in == NC_DOUBLE);
+	nc_get_vara_double(in_id, var_in_id,    start, count, void_ptr);
+	nc_put_var_double(out_id, var_out_id[i],              void_ptr);
+      }
+    }
+  }
+
+  if (in_large == 1 && out_large == 0) {
+    /* input file will have coordx, coordy, coordz (if 3d); output has only "coord" */
+    int var_in_id[3], var_out_id;
+    (void)nc_inq_varid(in_id,  VAR_COORD_X, &var_in_id[0]);
+    (void)nc_inq_varid(in_id,  VAR_COORD_Y, &var_in_id[1]);
+    (void)nc_inq_varid(in_id,  VAR_COORD_Z, &var_in_id[2]);
+    (void)nc_inq_varid(out_id, VAR_COORD,   &var_out_id);
+    
+    (void)nc_inq_vartype(in_id,  var_in_id[0], &var_type_in);
+    (void)nc_inq_vartype(out_id, var_out_id,   &var_type_out);
+
+    void_ptr=malloc(num_nodes * type_size(var_type_in));
+
+    /* Copy each component of the variable... */
+    for (i=0; i < spatial_dim; i++) {
+      start[0] = i; start[1] = 0;
+      count[0] = 1; count[1] = num_nodes;
+
+      if (var_type_in == NC_FLOAT) {
+        nc_get_var_float( in_id,  var_in_id[i],               void_ptr);
+        nc_put_vara_float(out_id, var_out_id,   start, count, void_ptr);
+      
+      } else {
+        nc_get_var_double( in_id,  var_in_id[i],               void_ptr);
+        nc_put_vara_double(out_id, var_out_id,   start, count, void_ptr);
+      }
+    }
+  }
+
+  /* Free the space that held the variable */
+  (void)free(void_ptr);
+  return(EX_NOERR);
+} /* end cpy_coord_val() */
+
+
+/*! \internal */
+void update_internal_structs( int out_exoid, ex_inquiry inqcode, struct list_item** ctr_list )
+{
+  int i;
+  int number = ex_inquire_int (out_exoid, inqcode);
+
+  if (number > 0) {
+    for (i=0; i<number; i++)
+      ex_inc_file_item (out_exoid, ctr_list);
+  }
+}
+
+size_t type_size(nc_type type)
+{
+  if (type == NC_CHAR)
+    return sizeof(char);
+  else if (type == NC_INT)
+    return sizeof(int);
+  else if (type == NC_INT64)
+    return sizeof(int64_t);
+  else if (type == NC_FLOAT)
+    return sizeof(float);
+  else if (type == NC_DOUBLE)
+    return sizeof(double);
+  else
+    return 0;
+}
+
+/* \endcond */
diff --git a/exodus/cbind/src/ex_create.c b/exodus/cbind/src/ex_create.c
new file mode 100644
index 0000000..aa0ee7b
--- /dev/null
+++ b/exodus/cbind/src/ex_create.c
@@ -0,0 +1,411 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*!
+
+\note The ex_create_int() is an internal function called by
+ex_create(). The user should call ex_create() and not ex_create_int().
+
+The function ex_create() creates a new exodus file and returns an ID
+that can subsequently be used to refer to the file.
+
+All floating point values in an exodus file are stored as either
+4-byte (\c float) or 8-byte (\c double) numbers; no mixing of 4- and
+8-byte numbers in a single file is allowed. An application code can
+compute either 4- or 8-byte values and can designate that the values
+be stored in the exodus file as either 4- or 8-byte numbers;
+conversion between the 4- and 8-byte values is performed automatically
+by the API routines. Thus, there are four possible combinations of
+compute word size and storage (or I/O) word size.
+
+\return In case of an error, ex_create() returns a negative number. Possible
+causes of errors include:
+  -  Passing a file name that includes a directory that does not
+ exist.
+  -  Specifying a file name of a file that exists and also
+ specifying a no clobber option.
+  -  Attempting to create a file in a directory without permission
+ to create files there.
+  -  Passing an invalid file clobber mode.
+
+
+\param path The file name of the new exodus file. This can be given as either an
+            absolute path name (from the root of the file system) or a relative
+	    path name (from the current directory).
+
+\param cmode Mode. Use one of the following predefined constants:
+\arg \c EX_NOCLOBBER  To create the new file only if the given file name does not refer to a
+		      file that already exists.
+
+\arg \c EX_CLOBBER    To create the new file, regardless of whether a file with the same
+		      name already exists. If a file with the same name does exist, its
+		      contents will be erased.
+
+\arg \c EX_LARGE_MODEL  To create a model that can store individual datasets larger than
+			2 gigabytes. This modifies the internal storage used by exodusII and
+			also puts the underlying NetCDF file into the \e 64-bit offset'
+			mode. See largemodel for more details on this
+			mode. A large model file will also be created if the
+			environment variable \c EXODUS_LARGE_MODEL is defined
+			in the users environment. A message will be printed to standard output
+			if this environment variable is found.
+
+\arg \c EX_NORMAL_MODEL Create a standard model.
+
+\arg \c EX_NETCDF4	To create a model using the HDF5-based NetCDF-4
+			output. An HDF5-based NetCDF-4 file will also be created if the
+			environment variable \c EXODUS_NETCDF4 is defined in the
+			users environment. A message will be printed to standard output if
+			this environment variable is found.
+
+\arg \c EX_NOSHARE	Do not open the underlying NetCDF file in \e share mode. See the
+                        NetCDF documentation for more details.
+
+\arg \c EX_SHARE	Do open the underlying NetCDF file in \e share mode. See the NetCDF
+			documentation for more details.
+
+\param[in,out] comp_ws  The word size in bytes (0, 4 or 8) of the floating point variables
+			used in the application program. If 0 (zero) is passed, the default
+			sizeof(float) will be used and returned in this variable. WARNING: all
+			exodus functions requiring floats must be passed floats declared with
+			this passed in or returned compute word size (4 or 8).}
+
+\param io_ws            The word size in bytes (4 or 8) of the floating point
+			data as they are to be stored in the exodus file.
+
+\param run_version (internally generated) used to verify compatability of libary and include files.
+
+The following code segment creates an exodus file called \file{test.exo}:
+
+\code
+#include "exodusII.h"
+int CPU_word_size, IO_word_size, exoid;
+CPU_word_size = sizeof(float);      \comment{use float or double}
+IO_word_size = 8;                   \comment{store variables as doubles}
+
+\comment{create exodus file}
+exoid = ex_create ("test.exo"       \comment{filename path}
+		    EX_CLOBBER,     \comment{create mode}
+		    &CPU_word_size, \comment{CPU float word size in bytes}
+	            &IO_word_size); \comment{I/O float word size in bytes}
+\endcode
+
+*/
+#include "exodusII.h"
+#include "exodusII_int.h"
+#include <stdlib.h>
+#include <assert.h>
+
+static int warning_output = 0;
+
+int ex_create_int (const char *path,
+		   int   cmode,
+		   int  *comp_ws,
+		   int  *io_ws,
+		   int   run_version)
+{
+  int exoid;
+  int status;
+  int dimid;
+  int old_fill;
+  int lio_ws;
+  int filesiz;
+  float vers;
+  char errmsg[MAX_ERR_LENGTH];
+  char *mode_name;
+  int mode = 0;
+#if defined(NC_NETCDF4)
+  static int netcdf4_mode = -1;
+  char *option;
+#endif /* NC_NETCDF4 */
+   
+  int int64_status;
+  unsigned int my_mode = cmode;
+  assert(my_mode == cmode);
+  exerrval = 0; /* clear error code */
+
+  if (run_version != EX_API_VERS_NODOT && warning_output == 0) {
+    int run_version_major = run_version / 100;
+    int run_version_minor = run_version % 100;
+    int lib_version_major = EX_API_VERS_NODOT / 100;
+    int lib_version_minor = EX_API_VERS_NODOT % 100;
+    fprintf(stderr, "EXODUS: Warning: This code was compiled with exodusII version %d.%02d,\n          but was linked with exodusII library version %d.%02d\n          This is probably an error in the build process of this code.\n",
+	    run_version_major, run_version_minor, lib_version_major, lib_version_minor);
+    warning_output = 1;
+  }
+
+  /*
+   * See if any integer data is to be stored as int64 (long long). If
+   * so, then need to set NC_NETCDF4 and unset NC_CLASSIC_MODEL (or
+   * set EX_NOCLASSIC.  Output meaningful error message if the library
+   * is not NetCDF-4 enabled...
+   */
+  int64_status = my_mode & (EX_ALL_INT64_DB | EX_ALL_INT64_API);
+  
+  if ((int64_status & EX_ALL_INT64_DB) != 0) {
+#if defined(NC_NETCDF4)
+    /* Library DOES support netcdf4... Set modes required to use
+     * netcdf-4 in non-classic mode
+     */
+    my_mode |= EX_NOCLASSIC;
+    my_mode |= EX_NETCDF4;
+#else
+    /* Library does NOT support netcdf4 */
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "EXODUS: Error: 64-bit integer storage requested, but the netcdf library does not support the required netcdf-4 extensions.\n");
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+#endif
+  }
+
+#if defined(NC_NETCDF4)
+  if (my_mode & EX_NETCDF4) {
+    mode |= (NC_NETCDF4);
+  } else {
+    if (netcdf4_mode == -1) {
+      option = getenv("EXODUS_NETCDF4");
+      if (option != NULL) {
+	fprintf(stderr, "EXODUS: Using netcdf version 4 selected via EXODUS_NETCDF4 environment variable\n");
+	netcdf4_mode = NC_NETCDF4; 
+      } else {
+	netcdf4_mode = 0;
+      }
+    }
+    mode |= netcdf4_mode;
+  }
+  if (! (my_mode & EX_NOCLASSIC)) {
+    mode |= NC_CLASSIC_MODEL;
+  }
+#endif
+
+  /*
+   * See if "large file" mode was specified in a ex_create my_mode. If
+   * so, then pass the NC_64BIT_OFFSET flag down to netcdf.
+   * If netcdf4 mode specified, don't use NC_64BIT_OFFSET mode.
+   */
+  if ( (my_mode & EX_LARGE_MODEL) && (my_mode & EX_NORMAL_MODEL)) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Warning: conflicting mode specification for file %s, mode %d. Using normal",
+	    path, (int)my_mode);
+    ex_err("ex_create",errmsg,exerrval);
+  }
+  if (my_mode & EX_NORMAL_MODEL)
+    filesiz = 0;
+#if defined(NC_NETCDF4)
+  else if (mode & NC_NETCDF4)
+    filesiz = 1;
+#endif
+  else 
+    filesiz = (int)((my_mode & EX_LARGE_MODEL) || (ex_large_model(-1) == 1));
+
+  if (
+#if defined(NC_NETCDF4)
+      !(mode & NC_NETCDF4) &&
+#endif
+      filesiz == 1) {
+    mode |= NC_64BIT_OFFSET;
+  }
+
+  if (my_mode & EX_SHARE) {
+    mode |= NC_SHARE;
+  }
+
+  /*
+   * set error handling mode to no messages, non-fatal errors
+   */
+  ex_opts(exoptval);    /* call required to set ncopts first time through */
+
+  if (my_mode & EX_CLOBBER) {
+    mode |= NC_CLOBBER;
+    mode_name = "CLOBBER";
+  } else {
+    mode |= NC_NOCLOBBER;
+    mode_name = "NOCLOBBER";
+  }
+
+  if ((status = nc_create (path, mode, &exoid)) != NC_NOERR) {
+    exerrval = status;
+    if (my_mode & EX_NETCDF4) {
+      sprintf(errmsg,
+	      "Error: file create failed for %s in NETCDF4 and %s mode.\n\tThis library probably does not support netcdf-4 files.",
+	      path, mode_name);
+    } else {
+      sprintf(errmsg,
+	      "Error: file create failed for %s, mode: %s",
+	      path, mode_name);
+    }
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* turn off automatic filling of netCDF variables
+   */
+
+  if ((status = nc_set_fill (exoid, NC_NOFILL, &old_fill)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to set nofill mode in file id %d",
+	    exoid);
+    ex_err("ex_create", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* initialize floating point size conversion.  since creating new file, 
+   * i/o wordsize attribute from file is zero.
+   */
+
+  if (ex_conv_ini(exoid, comp_ws, io_ws, 0, int64_status, 0) != EX_NOERR) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: failed to init conversion routines in file id %d",
+            exoid);
+    ex_err("ex_create", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* put the EXODUS version number, and i/o floating point word size as
+   * netcdf global attributes
+   */
+
+  /* store Exodus API version # as an attribute */
+  vers = EX_API_VERS;
+  if ((status=nc_put_att_float(exoid, NC_GLOBAL, ATT_API_VERSION,
+			       NC_FLOAT, 1, &vers)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II API version attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+   
+  /* store Exodus file version # as an attribute */
+  vers = EX_VERS;
+  if ((status=nc_put_att_float(exoid, NC_GLOBAL, ATT_VERSION, NC_FLOAT, 1, &vers)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II file version attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* store Exodus file float word size  as an attribute */
+  lio_ws = (int)(*io_ws);
+  if ((status=nc_put_att_int (exoid, NC_GLOBAL, ATT_FLT_WORDSIZE, NC_INT, 1, &lio_ws)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II file float word size attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* store Exodus file size (1=large, 0=normal) as an attribute */
+  if ((status = nc_put_att_int (exoid, NC_GLOBAL, ATT_FILESIZE, NC_INT, 1, &filesiz)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II file size attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+  
+  {
+    int max_so_far = 32;
+    if ((status=nc_put_att_int(exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, NC_INT, 1, &max_so_far)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add maximum_name_length attribute in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* define some dimensions and variables
+   */
+  
+  /* create string length dimension */
+  if ((status=nc_def_dim (exoid, DIM_STR, (MAX_STR_LENGTH+1), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define string length in file id %d",exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* The name string length dimension is delayed until the ex_put_init function */
+
+  /* create line length dimension */
+  if ((status = nc_def_dim(exoid, DIM_LIN, (MAX_LINE_LENGTH+1), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define line length in file id %d",exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* create number "4" dimension; must be of type long */
+  if ((status = nc_def_dim(exoid, DIM_N4, 4L, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define number \"4\" dimension in file id %d",exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  {
+    int int64_db_status = int64_status & EX_ALL_INT64_DB;
+    if ((status=nc_put_att_int(exoid, NC_GLOBAL, ATT_INT64_STATUS, NC_INT, 1, &int64_db_status)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add int64_status attribute in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d", exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (exoid);
+}
diff --git a/exodus/cbind/src/ex_create_group.c b/exodus/cbind/src/ex_create_group.c
new file mode 100644
index 0000000..37e47f8
--- /dev/null
+++ b/exodus/cbind/src/ex_create_group.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2013 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL
+#include "netcdf.h"                     // for NC_NOERR, nc_def_grp, etc
+
+int ex_create_group (int parent_id, const char *group_name)
+{
+  int exoid = -1;
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+   
+  exerrval = 0; /* clear error code */
+
+#if defined(NOT_NETCDF4)
+  exerrval = NC_ENOTNC4;
+  sprintf(errmsg,
+	  "Error: Group capabilities are not available in this netcdf version--not netcdf4");
+  ex_err("ex_create_group",errmsg,exerrval);
+  return (EX_FATAL);
+#else
+  if ((status = nc_redef (parent_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file id %d into define mode", parent_id);
+    ex_err("ex_create_group",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  if ((status = nc_def_grp (parent_id, group_name, &exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+    "Error: group create failed for %s in file id %d",
+      group_name, parent_id);
+    ex_err("ex_create_group",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_enddef (parent_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d", exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+#endif
+  return (exoid);
+}
diff --git a/exodus/cbind/src/ex_create_par.c b/exodus/cbind/src/ex_create_par.c
new file mode 100644
index 0000000..6bae8e7
--- /dev/null
+++ b/exodus/cbind/src/ex_create_par.c
@@ -0,0 +1,410 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*!
+
+\note The ex_create_int() is an internal function called by
+ex_create(). The user should call ex_create() and not ex_create_int().
+
+The function ex_create() creates a new exodus file and returns an ID
+that can subsequently be used to refer to the file.
+
+All floating point values in an exodus file are stored as either
+4-byte (\c float) or 8-byte (\c double) numbers; no mixing of 4- and
+8-byte numbers in a single file is allowed. An application code can
+compute either 4- or 8-byte values and can designate that the values
+be stored in the exodus file as either 4- or 8-byte numbers;
+conversion between the 4- and 8-byte values is performed automatically
+by the API routines. Thus, there are four possible combinations of
+compute word size and storage (or I/O) word size.
+
+\return In case of an error, ex_create() returns a negative number. Possible
+causes of errors include:
+  -  Passing a file name that includes a directory that does not
+ exist.
+  -  Specifying a file name of a file that exists and also
+ specifying a no clobber option.
+  -  Attempting to create a file in a directory without permission
+ to create files there.
+  -  Passing an invalid file clobber mode.
+
+
+\param path The file name of the new exodus file. This can be given as either an
+            absolute path name (from the root of the file system) or a relative
+	    path name (from the current directory).
+
+\param cmode Mode. Use one of the following predefined constants:
+\arg \c EX_NOCLOBBER  To create the new file only if the given file name does not refer to a
+		      file that already exists.
+
+\arg \c EX_CLOBBER    To create the new file, regardless of whether a file with the same
+		      name already exists. If a file with the same name does exist, its
+		      contents will be erased.
+
+\arg \c EX_LARGE_MODEL  To create a model that can store individual datasets larger than
+			2 gigabytes. This modifies the internal storage used by exodusII and
+			also puts the underlying NetCDF file into the \e 64-bit offset'
+			mode. See largemodel for more details on this
+			mode. A large model file will also be created if the
+			environment variable \c EXODUS_LARGE_MODEL is defined
+			in the users environment. A message will be printed to standard output
+			if this environment variable is found.
+
+\arg \c EX_NORMAL_MODEL Create a standard model.
+
+\arg \c EX_NETCDF4	To create a model using the HDF5-based NetCDF-4
+			output. An HDF5-based NetCDF-4 file will also be created if the
+			environment variable \c EXODUS_NETCDF4 is defined in the
+			users environment. A message will be printed to standard output if
+			this environment variable is found.
+
+\arg \c EX_NOSHARE	Do not open the underlying NetCDF file in \e share mode. See the
+                        NetCDF documentation for more details.
+
+\arg \c EX_SHARE	Do open the underlying NetCDF file in \e share mode. See the NetCDF
+			documentation for more details.
+
+\param[in,out] comp_ws  The word size in bytes (0, 4 or 8) of the floating point variables
+			used in the application program. If 0 (zero) is passed, the default
+			sizeof(float) will be used and returned in this variable. WARNING: all
+			exodus functions requiring floats must be passed floats declared with
+			this passed in or returned compute word size (4 or 8).}
+
+\param io_ws            The word size in bytes (4 or 8) of the floating point
+			data as they are to be stored in the exodus file.
+
+\param run_version (internally generated) used to verify compatability of libary and include files.
+
+The following code segment creates an exodus file called \file{test.exo}:
+
+\code
+#include "exodusII.h"
+int CPU_word_size, IO_word_size, exoid;
+CPU_word_size = sizeof(float);      \comment{use float or double}
+IO_word_size = 8;                   \comment{store variables as doubles}
+
+\comment{create exodus file}
+exoid = ex_create ("test.exo"       \comment{filename path}
+		    EX_CLOBBER,     \comment{create mode}
+		    &CPU_word_size, \comment{CPU float word size in bytes}
+	            &IO_word_size); \comment{I/O float word size in bytes}
+\endcode
+
+*/
+#include <stdlib.h>
+#include <assert.h>
+#include <mpi.h>
+
+#include "netcdf_par.h"
+#include "exodusII.h"
+#include "exodusII_int.h"
+
+static int warning_output = 0;
+
+int ex_create_par_int (const char *path,
+		       int   cmode,
+		       int  *comp_ws,
+		       int  *io_ws,
+		       MPI_Comm comm,
+		       MPI_Info info,
+		       int   run_version)
+{
+  int exoid, dims[1];
+  int status;
+  int dimid, time_dim;
+  int old_fill;
+  int lio_ws;
+  int filesiz;
+  float vers;
+  char errmsg[MAX_ERR_LENGTH];
+  char *mode_name;
+  int mode = 0;
+   
+  int int64_status;
+  int pariomode = 0;
+
+  unsigned int my_mode = cmode;
+  assert(my_mode == cmode);
+  exerrval = 0; /* clear error code */
+
+#if !defined(NC_NETCDF4)
+    /* Library does NOT support netcdf4 */
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "EXODUS: Error: Parallel output requires the netcdf-4 library format, but this netcdf library does not support that.\n");
+    ex_err("ex_create_par",errmsg,exerrval);
+    return (EX_FATAL);
+#endif
+
+  if (run_version != EX_API_VERS_NODOT && warning_output == 0) {
+    int run_version_major = run_version / 100;
+    int run_version_minor = run_version % 100;
+    int lib_version_major = EX_API_VERS_NODOT / 100;
+    int lib_version_minor = EX_API_VERS_NODOT % 100;
+    fprintf(stderr, "EXODUS: Warning: This code was compiled with exodusII version %d.%02d,\n          but was linked with exodusII library version %d.%02d\n          This is probably an error in the build process of this code.\n",
+	    run_version_major, run_version_minor, lib_version_major, lib_version_minor);
+    warning_output = 1;
+  }
+
+  /*
+   * See if any integer data is to be stored as int64 (long long). If
+   * so, then need to set NC_NETCDF4 and unset NC_CLASSIC_MODEL (or
+   * set EX_NOCLASSIC.  Output meaningful error message if the library
+   * is not NetCDF-4 enabled...
+   */
+  int64_status = my_mode & (EX_ALL_INT64_DB | EX_ALL_INT64_API);
+  
+  if ((int64_status & EX_ALL_INT64_DB) != 0) {
+    /* Library DOES support netcdf4... Set modes required to use
+     * netcdf-4 in non-classic mode
+     */
+    my_mode |= EX_NOCLASSIC;
+    my_mode |= EX_NETCDF4;
+  }
+
+  /* Check parallel io mode.  Valid is NC_MPIPOSIX or NC_MPIIO or NC_PNETCDF
+   * Exodus uses different flag values; map to netcdf values
+   */
+  if (my_mode & EX_MPIPOSIX) {
+    pariomode = NC_MPIPOSIX;
+    my_mode |= EX_NETCDF4;
+  }
+  else if (my_mode & EX_MPIIO) {
+    pariomode = NC_MPIIO;
+    my_mode |= EX_NETCDF4;
+  }
+  else if (my_mode & EX_PNETCDF) {
+    pariomode = NC_PNETCDF;
+    mode |= NC_64BIT_OFFSET;
+  }
+
+  if (my_mode & EX_NETCDF4) {
+    mode |= NC_NETCDF4;
+  }
+
+  if (! (my_mode & EX_NOCLASSIC)) {
+    mode |= NC_CLASSIC_MODEL;
+  }
+
+  /*
+   * See if "large file" mode was specified in a ex_create my_mode. If
+   * so, then pass the NC_64BIT_OFFSET flag down to netcdf.
+   * If netcdf4 mode specified, don't use NC_64BIT_OFFSET mode.
+   */
+  if ( (my_mode & EX_LARGE_MODEL) && (my_mode & EX_NORMAL_MODEL)) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Warning: conflicting mode specification for file %s, mode %d. Using normal",
+	    path, (int)my_mode);
+    ex_err("ex_create",errmsg,exerrval);
+  }
+  filesiz = 1;
+  
+  if (my_mode & EX_SHARE) {
+    mode |= NC_SHARE;
+  }
+
+  /*
+   * set error handling mode to no messages, non-fatal errors
+   */
+  ex_opts(exoptval);    /* call required to set ncopts first time through */
+
+  if (my_mode & EX_CLOBBER) {
+    mode |= NC_CLOBBER;
+    mode_name = "CLOBBER";
+  } else {
+    mode |= NC_NOCLOBBER;
+    mode_name = "NOCLOBBER";
+  }
+
+  if ((status = nc_create_par (path, mode|pariomode, comm, info, &exoid)) != NC_NOERR) {
+    exerrval = status;
+    if (my_mode & EX_NETCDF4) {
+      sprintf(errmsg,
+	      "Error: file create failed for %s in NETCDF4 and %s mode.\n\tThis library probably does not support netcdf-4 files.",
+	      path, mode_name);
+    } else {
+      sprintf(errmsg,
+	      "Error: file create failed for %s, mode: %s",
+	      path, mode_name);
+    }
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* turn off automatic filling of netCDF variables */
+
+  if ((status = nc_set_fill (exoid, NC_NOFILL, &old_fill)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to set nofill mode in file id %d",
+	    exoid);
+    ex_err("ex_create", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* initialize floating point size conversion.  since creating new file, 
+   * i/o wordsize attribute from file is zero.
+   */
+
+  if (ex_conv_ini(exoid, comp_ws, io_ws, 0, int64_status,1) != EX_NOERR) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: failed to init conversion routines in file id %d",
+            exoid);
+    ex_err("ex_create", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* put the EXODUS version number, and i/o floating point word size as
+   * netcdf global attributes
+   */
+
+  /* store Exodus API version # as an attribute */
+  vers = EX_API_VERS;
+  if ((status=nc_put_att_float(exoid, NC_GLOBAL, ATT_API_VERSION,
+			       NC_FLOAT, 1, &vers)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II API version attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+   
+  /* store Exodus file version # as an attribute */
+  vers = EX_VERS;
+  if ((status=nc_put_att_float(exoid, NC_GLOBAL, ATT_VERSION, NC_FLOAT, 1, &vers)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II file version attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* store Exodus file float word size  as an attribute */
+  lio_ws = (int)(*io_ws);
+  if ((status=nc_put_att_int (exoid, NC_GLOBAL, ATT_FLT_WORDSIZE, NC_INT, 1, &lio_ws)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II file float word size attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* store Exodus file size (1=large, 0=normal) as an attribute */
+  if ((status = nc_put_att_int (exoid, NC_GLOBAL, ATT_FILESIZE, NC_INT, 1, &filesiz)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store Exodus II file size attribute in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg, exerrval);
+    return (EX_FATAL);
+  }
+  
+  /* define some dimensions and variables
+   */
+  
+  /* create string length dimension */
+  if ((status=nc_def_dim (exoid, DIM_STR, (MAX_STR_LENGTH+1), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define string length in file id %d",exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* The name string length dimension is delayed until the ex_put_init function */
+
+  /* create line length dimension */
+  if ((status = nc_def_dim(exoid, DIM_LIN, (MAX_LINE_LENGTH+1), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define line length in file id %d",exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* create number "4" dimension; must be of type long */
+  if ((status = nc_def_dim(exoid, DIM_N4, 4L, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define number \"4\" dimension in file id %d",exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_def_dim(exoid, DIM_TIME, NC_UNLIMITED, &time_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define time dimension in file id %d", exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  dims[0] = time_dim;
+  if ((status = nc_def_var(exoid, VAR_WHOLE_TIME, nc_flt_code(exoid), 1, dims, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define whole time step variable in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  ex_compress_variable(exoid, dimid, 2);
+
+  {
+    int int64_db_status = int64_status & EX_ALL_INT64_DB;
+    if ((status=nc_put_att_int(exoid, NC_GLOBAL, ATT_INT64_STATUS, NC_INT, 1, &int64_db_status)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add int64_status attribute in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d", exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (exoid);
+}
diff --git a/exodus/cbind/src/ex_cvt_nodes_to_sides.c b/exodus/cbind/src/ex_cvt_nodes_to_sides.c
new file mode 100644
index 0000000..0478c2f
--- /dev/null
+++ b/exodus/cbind/src/ex_cvt_nodes_to_sides.c
@@ -0,0 +1,1040 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <ctype.h>                      // for toupper
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for malloc, NULL, free
+#include <string.h>                     // for strncmp, strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, ex_block, etc
+#include "exodusII_int.h"               // for elem_blk_parm, EX_FATAL, etc
+
+static int64_t get_node(void_int *connect, size_t index, size_t int_size)
+{
+  if (int_size == sizeof(int64_t)) {
+    return ((int64_t*)connect)[index];
+  } else {
+    return ((int*)connect)[index];
+  }
+}
+
+static void put_side(void_int *side_list, size_t index, size_t value, size_t int_size)
+{
+  if (int_size == sizeof(int64_t)) {
+    ((int64_t*)side_list)[index] = value;
+  } else {
+    ((int*)side_list)[index] = value;
+  }
+}
+
+/*!
+
+The function ex_cvt_nodes_to_sides() is used to convert a side set
+node list to a side set side list. This routine is provided for
+application programs that utilize side sets defined by nodes (as was
+done previous to release 2.0) rather than local faces or edges. The
+application program must allocate memory for the returned array of
+sides. The length of this array is the same as the length of the
+concatenated side sets element list, which can be determined with a
+call to ex_inquire() or ex_inquire_int().
+
+\return In case of an error, ex_cvt_nodes_to_sides() returns a
+negative number; a warning will return a positive number. Possible
+causes of errors include:
+  -  a warning value is returned if no side sets are stored in the file.
+  -  because the faces of a wedge require a different number of
+     nodes to describe them (quadrilateral vs. triangular faces), the
+     function will abort with a fatal return code if a wedge is
+     encountered in the side set element list.
+
+\param[in] exoid                  exodus file ID returned from a previous call to ex_create()
+                                  or ex_open().
+
+\param[in]  num_elem_per_set      Array containing the number of sides for each set. The number
+                                  of sides is equal to the number of elements for each set.
+
+\param[in]  num_nodes_per_set     Array containing the number of nodes for each set.
+
+\param[in]  side_sets_elem_index  Array containing indices into the \c side_sets_elem_list which are
+                                  the locations of the first element for each set. These indices are
+				  0-based.  Unused.
+
+\param[in]  side_sets_node_index  Array containing indices into the \c side_sets_node_list
+                                  which are the locations of the first node for each set. These
+				  indices are 0-based. Unused.
+
+\param[in]  side_sets_elem_list   Array containing the elements for all side sets. Internal element IDs
+                                  are used in this list (see Section LocalElementIds).
+
+\param[in]  side_sets_node_list   Array containing the nodes for all side sets. Internal node
+                                  IDs are used in this list (see  Section LocalNodeIds).
+
+\param[out]  side_sets_side_list  Returned array containing the sides for all side sets.
+
+
+The following code segment will convert side sets described
+by nodes to side sets described by local side numbers:
+
+\code
+int error, exoid, ids[2], num_side_per_set[2],
+    num_nodes_per_set[2], elem_ind[2], node_ind[2],
+    elem_list[4], node_list[8], el_lst_len, *side_list;
+
+ids[0] = 30             ; ids[1]  = 31;
+num_side_per_set[0]  = 2; num_side_per_set[1] = 2;
+num_nodes_per_set[0] = 4; num_nodes_per_set[1] = 4;
+
+elem_ind[0] = 0; elem_ind[1] = 2;
+node_ind[0] = 0; node_ind[1] = 4;
+
+\comment{side set #1}
+elem_list[0] = 2; elem_list[1] = 2;
+node_list[0] = 8; node_list[1] = 5;
+node_list[2] = 6; node_list[3] = 7;
+
+\comment{side set #2}
+elem_list[2] = 1; elem_list[3] = 2;
+node_list[4] = 2; node_list[5] = 3;
+node_list[6] = 7; node_list[7] = 8;
+
+el_lst_len = ex_inquire_int(exoid, EX_INQ_SS_ELEM_LEN);
+
+\comment{side set element list is same length as side list}
+side_list = (int *) calloc (el_lst_len, sizeof(int));
+
+ex_cvt_nodes_to_sides(exoid, num_side_per_set, num_nodes_per_set,
+                      elem_ind, node_ind, elem_list,
+                      node_list, side_list);
+\endcode
+
+ <b>Algorithm:</b>
+
+\verbatim
+  Read elem_block_ids --> elem_blk_id[array]
+
+  Read element block parameters --> elem_blk_parms[array]
+
+  Determine total number of elements in side set by summing num_elem_per_set
+
+  Build side set element to side set node list index --> ss_elem_node_ndx[array]
+
+  For each element in the side_set_elem_list  {
+    If Jth element is not in current element block (e.g. J>elem_ctr) {
+      get element block parameters (num_elem_in_blk, ...)
+      elem_ctr += num_elem_in_blk
+
+      free old connectity array space
+      allocate connectivity array: size=num_elem_in_blk*num_nodes_per_elem
+      get connectivity array
+    }
+
+    If Jth element is in current element block (e.g. J<=elem_ctr) {
+      For each node in element (linear search of up to num_nodes_per_elem) {
+        If side set element node[1] == element node[i] {
+          Case element type = Hex {
+            If side set element node[2] == element node[Hex_table[i,1]]
+              Jth side = Hex_table[i,2]
+
+             break
+          }
+          Case element type = Wedge {
+            If side set element node[2] == element node[Wedge_table[i,1]]
+              Jth side = Wedge_table[i,2]
+
+            break
+          }
+        }
+      }
+    }
+  }
+\endverbatim
+
+ */
+
+int ex_cvt_nodes_to_sides(int exoid,
+                          void_int *num_elem_per_set,
+                          void_int *num_nodes_per_set,
+                          void_int *side_sets_elem_index, /* unused */
+                          void_int *side_sets_node_index, /* unused */
+                          void_int *side_sets_elem_list,
+                          void_int *side_sets_node_list,
+                          void_int *side_sets_side_list)
+{
+  size_t m;
+  size_t i, j, k, n;
+  int  num_side_sets, num_elem_blks;
+  int64_t  tot_num_elem = 0, tot_num_ss_elem = 0, elem_num = 0, ndim;
+  void_int *elem_blk_ids = NULL;
+  void_int *connect = NULL;
+  void_int *ss_elem_ndx = NULL;
+  void_int *ss_elem_node_ndx = NULL;
+  void_int *ss_parm_ndx = NULL;
+  size_t elem_ctr, node_ctr, elem_num_pos;
+  int num_nodes_per_elem, num_node_per_side;
+
+  int *same_elem_type = NULL;
+  int el_type = 0;
+
+  int int_size;
+  int ids_size;
+
+  struct elem_blk_parm  *elem_blk_parms = NULL;
+
+  int err_stat = EX_NOERR;
+
+  /* node to side translation tables -
+     These tables are used to look up the side number based on the
+     first and second node in the side/face list. The side node order
+     is found in the original Exodus document, SAND87-2997. The element
+     node order is found in the ExodusII document, SAND92-2137. These
+     tables were generated by following the right-hand rule for determining
+     the outward normal. Note: Only the more complex 3-D shapes require
+     these tables, the simple shapes are trivial - the first node found
+     is also the side number.
+  */
+
+  /*    1     2   3    4                                          node 1 */
+  static int shell_table[2][8]  = {
+    {2,4, 3,1, 4,2, 1,3},                                    /* node 2 */
+    {1,2, 1,2, 1,2, 1,2}                                     /* side # */
+  };
+
+  /*    1     2   3    4                                          node 1 */
+  static int shell_edge_table[2][8]  = {
+    {2,4, 3,1, 4,2, 1,3},                                    /* node 2 */
+    {3,6, 4,3, 5,4, 6,5}                                     /* side # */
+  };
+
+  /*    1     2   3                                               node 1 */
+  static int trishell_table[2][6]  = {
+    {2,3, 3,1, 1,2},                                         /* node 2 */
+    {1,2, 1,2, 1,2}                                          /* side # */
+  };
+
+  /*     1      2      3      4                                   node 1 */
+  static int tetra_table[2][12]  = {
+    {2,3,4, 1,3,4, 4,1,2, 1,2,3},                            /* node 2 */
+    {1,4,3, 4,2,1, 2,3,4, 1,2,3}                             /* side # */
+  };
+
+#if 0
+  static int wedge_table[2][18]  = {
+    /*     1      2      3      4      5      6                     node 1 */
+    {2,4,3, 5,1,3, 6,1,2, 1,6,5, 6,2,4, 4,3,5},              /* node 2 */
+    {1,3,4, 1,4,2, 2,3,4, 1,3,5, 5,2,1, 5,3,2}               /* side # */
+  };
+#endif
+
+  static int hex_table[2][24]  = {
+    /*     1      2      3      4      5      6      7      8       node 1 */
+    {4,2,5, 1,3,6, 7,4,2, 3,1,8, 6,8,1, 5,2,7, 8,6,3, 7,5,4},/* node 2 */
+    {5,1,4, 5,2,1, 2,3,5, 5,4,3, 6,4,1, 1,2,6, 6,2,3, 3,6,4} /* side # */
+  };
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+  /* inquire how many side sets have been stored */
+
+  num_side_sets = ex_inquire_int(exoid, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of side sets in file id %d",exoid);
+    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if (num_side_sets == 0)
+    {
+      sprintf(errmsg,
+	      "Warning: no side sets defined in file id %d",exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,EX_WARN);
+      return(EX_WARN);
+    }
+
+  num_elem_blks = ex_inquire_int(exoid, EX_INQ_ELEM_BLK);
+  if (num_elem_blks < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of element blocks in file id %d",exoid);
+    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  tot_num_elem = ex_inquire_int(exoid, EX_INQ_ELEM);
+  if (tot_num_elem < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get total number of elements in file id %d",exoid);
+    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* get the dimensionality of the coordinates;  this is necessary to
+     distinguish between 2d TRIs and 3d TRIs */
+  ndim = ex_inquire_int(exoid, EX_INQ_DIM);
+
+  int_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+    int_size = sizeof(int64_t);
+
+  /* First count up # of elements in the side sets*/
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    for (i=0;i<num_side_sets;i++)
+      tot_num_ss_elem += ((int64_t*)num_elem_per_set)[i];
+  } else {
+    for (i=0;i<num_side_sets;i++)
+      tot_num_ss_elem += ((int*)num_elem_per_set)[i];
+  }
+
+  /* Allocate space for the ss element index array */
+  if (!(ss_elem_ndx=malloc(tot_num_ss_elem*int_size)))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem sort array for file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+  if (int_size == sizeof(int64_t)) {
+    /* Sort side set element list into index array  - non-destructive */
+    int64_t *elems = (int64_t*)ss_elem_ndx;
+    for (i=0;i<tot_num_ss_elem;i++) {
+      elems[i] = i; /* init index array to current position */
+    }
+    ex_iqsort64(side_sets_elem_list, elems, tot_num_ss_elem);
+  } else {
+    /* Sort side set element list into index array  - non-destructive */
+    int *elems = (int*)ss_elem_ndx;
+    for (i=0;i<tot_num_ss_elem;i++) {
+      elems[i] = i; /* init index array to current position */
+    }
+    ex_iqsort(side_sets_elem_list, elems,tot_num_ss_elem);
+  }
+
+  /* Allocate space for the element block ids */
+  ids_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    ids_size = sizeof(int64_t);
+  }
+
+  if (!(elem_blk_ids=malloc(num_elem_blks*ids_size)))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for element block ids for file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+  if (ex_get_elem_blk_ids(exoid, elem_blk_ids))
+    {
+      sprintf(errmsg,
+	      "Error: failed to get element block ids in file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,EX_MSG);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+  /* Allocate space for the element block params */
+  if (!(elem_blk_parms=malloc(num_elem_blks*sizeof(struct elem_blk_parm))))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for element block params for file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+  elem_ctr = 0;
+  for (i=0; i<num_elem_blks; i++)
+    {
+      ex_block block;
+      block.type = EX_ELEM_BLOCK;
+      if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	block.id = ((int64_t*)elem_blk_ids)[i];
+      } else {
+	block.id = ((int*)elem_blk_ids)[i];
+      }
+
+      /* read in an element block parameter */
+      if ((ex_get_block_param (exoid, &block)) == -1) {
+	sprintf(errmsg,
+		"Error: failed to get element block %"PRId64" parameters in file id %d",
+		block.id, exoid);
+	ex_err("ex_cvt_nodes_to_sides",errmsg,EX_MSG);
+	err_stat = EX_FATAL;
+	goto cleanup;
+      }
+
+      elem_blk_parms[i].num_elem_in_blk = block.num_entry;
+      elem_blk_parms[i].num_nodes_per_elem = block.num_nodes_per_entry;
+      elem_blk_parms[i].num_attr = block.num_attribute;
+      elem_blk_parms[i].elem_blk_id = block.id;
+
+      for (m=0; m < strlen(block.topology); m++) {
+	elem_blk_parms[i].elem_type[m] = toupper(block.topology[m]);
+      }
+      elem_blk_parms[i].elem_type[m] = '\0';
+
+      if (strncmp(elem_blk_parms[i].elem_type,"CIRCLE",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_CIRCLE;
+	  /* set side set node stride */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 1;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"SPHERE",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_SPHERE;
+	  /* set side set node stride */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 1;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"QUAD",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_QUAD;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 4)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  else if (elem_blk_parms[i].num_nodes_per_elem == 5)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"TRIANGLE",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_TRIANGLE;
+	  /* determine side set node stride */
+	  if (ndim == 2)  /* 2d TRIs */
+	    {
+	      if (elem_blk_parms[i].num_nodes_per_elem == 3)
+		elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	      else
+		elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	    }
+	  else if (ndim == 3)  /* 3d TRIs */
+	    {
+	      elem_blk_parms[i].elem_type_val = EX_EL_TRISHELL;
+	      elem_blk_parms[i].num_nodes_per_side[0] =
+		elem_blk_parms[i].num_nodes_per_elem;
+	    }
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"SHELL",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_SHELL;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 2)
+	    {
+	      /* 2d SHELL; same as BEAM or TRUSS or BAR */
+	      elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	      elem_blk_parms[i].elem_type_val = EX_EL_BEAM;
+	    }
+	  else if (elem_blk_parms[i].num_nodes_per_elem == 4)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 8;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"HEX",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_HEX;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 8)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else if (elem_blk_parms[i].num_nodes_per_elem == 9)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else if (elem_blk_parms[i].num_nodes_per_elem == 12)  /* HEXSHELL */
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else if (elem_blk_parms[i].num_nodes_per_elem == 27)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 9;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 8;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"TETRA",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_TETRA;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 4)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  else if (elem_blk_parms[i].num_nodes_per_elem == 8)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 6;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"WEDGE",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_WEDGE;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 6)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 8;
+	  sprintf(errmsg,
+		  "Warning: WEDGE%d is assumed to have %d nodes per face",
+		  elem_blk_parms[i].num_nodes_per_elem,
+		  elem_blk_parms[i].num_nodes_per_side[0]);
+	  ex_err("ex_cvt_nodes_to_sides",errmsg,EX_MSG);
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"PYRAMID",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_PYRAMID;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 5)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 8;
+	  sprintf(errmsg,
+		  "Warning: PYRAMID%d is assumed to have %d nodes per face",
+		  elem_blk_parms[i].num_nodes_per_elem,
+		  elem_blk_parms[i].num_nodes_per_side[0]);
+	  ex_err("ex_cvt_nodes_to_sides",errmsg,EX_MSG);
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"BEAM",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_BEAM;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 2)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	}
+      else if ( (strncmp(elem_blk_parms[i].elem_type,"TRUSS",3) == 0) ||
+		(strncmp(elem_blk_parms[i].elem_type,"BAR",3) == 0)  ||
+		(strncmp(elem_blk_parms[i].elem_type,"EDGE",3) == 0) )
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_TRUSS;
+	  /* determine side set node stride */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 2)
+	    elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  else
+	    elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	}
+      else if (strncmp(elem_blk_parms[i].elem_type,"NULL",3) == 0)
+	{
+	  elem_blk_parms[i].elem_type_val = EX_EL_NULL_ELEMENT;
+	  /* set side set node stride */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 0;
+	}
+      else
+	{ /* unsupported element type; no problem if no sides specified for
+	     this element block */
+	  elem_blk_parms[i].elem_type_val = EX_EL_UNK;
+	  elem_blk_parms[i].num_nodes_per_side[0] = 0;
+	}
+      elem_blk_parms[i].elem_blk_id = block.id;    /* save id */
+      elem_ctr += elem_blk_parms[i].num_elem_in_blk;
+      elem_blk_parms[i].elem_ctr = elem_ctr;      /* save elem number max */
+    }
+
+
+  /* Allocate space for the ss element to element block parameter index array */
+  if (!(ss_parm_ndx=malloc(tot_num_ss_elem*int_size)))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem parms index for file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+
+  /* Allocate space for the ss element to node list index array */
+  if (!(ss_elem_node_ndx=malloc((tot_num_ss_elem+1)*int_size)))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem to node index for file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+  /* determine if each side set has uniform element types; this will
+     be used to help determine the stride through the node list
+  */
+
+  /* Allocate space for same element type flag array*/
+  if (!(same_elem_type=malloc(num_side_sets*sizeof(int))))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for element type flag array for file id %d",
+	      exoid);
+      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+
+  same_elem_type[0] = EX_TRUE;
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    elem_ctr = ((int64_t*)num_elem_per_set)[0];
+    for (i=0,k=0;i<tot_num_ss_elem;i++) {
+      int64_t elem = ((int64_t*)side_sets_elem_list)[i];
+      for (j=0; j<num_elem_blks; j++) {
+	if (elem <= elem_blk_parms[j].elem_ctr) break;
+      }
+
+      if (i==0) {
+	el_type = elem_blk_parms[j].elem_type_val;
+      }
+
+      /* determine which side set this element is in; assign to kth side set */
+      if (i >= elem_ctr) {
+	elem_ctr += ((int64_t*)num_elem_per_set)[++k];
+
+	el_type = elem_blk_parms[j].elem_type_val;
+	same_elem_type[k] = EX_TRUE;
+      }
+
+      if (el_type != elem_blk_parms[j].elem_type_val) same_elem_type[k] = EX_FALSE;
+    }
+
+    /* Build side set element to node list index and side set element
+       parameter index.
+    */
+    node_ctr = 0;
+    elem_ctr = ((int64_t*)num_elem_per_set)[0];
+    for (i=0,k=0;i<tot_num_ss_elem;i++) {
+      int64_t elem = ((int64_t*)side_sets_elem_list)[i];
+
+      for (j=0; j<num_elem_blks; j++) {
+	if (elem <= elem_blk_parms[j].elem_ctr) {
+	  ((int64_t*)ss_parm_ndx)[i] = j;     /* assign parameter block index */
+	  break;
+	}
+      }
+      ((int64_t*)ss_elem_node_ndx)[i] = node_ctr;     /* assign node list index */
+
+      /* determine which side set this element is in; assign to kth side set */
+      if (i >= elem_ctr) {
+	/* skip over NULL side sets */
+	while ( ((int64_t*)num_elem_per_set)[++k] == 0);
+	elem_ctr += ((int64_t*)num_elem_per_set)[k];
+      }
+
+      /* determine number of nodes per side */
+      if (((((int64_t*)num_nodes_per_set)[k] % ((int64_t*)num_elem_per_set)[k]) == 0) &&
+	  (same_elem_type[k])) {  /* all side set elements are same type */
+	node_ctr += ((int64_t*)num_nodes_per_set)[k] /((int64_t*)num_elem_per_set)[k];
+      } else {
+	node_ctr += elem_blk_parms[j].num_nodes_per_side[0];
+      }
+    }
+    ((int64_t*)ss_elem_node_ndx)[i] = node_ctr;       /* assign node list index */
+  } else {
+    elem_ctr = ((int*)num_elem_per_set)[0];
+    for (i=0,k=0;i<tot_num_ss_elem;i++) {
+      int elem = ((int*)side_sets_elem_list)[i];
+
+      for (j=0; j<num_elem_blks; j++) {
+	if (elem <= elem_blk_parms[j].elem_ctr) break;
+      }
+
+      if (i==0) {
+	el_type = elem_blk_parms[j].elem_type_val;
+      }
+
+      /* determine which side set this element is in; assign to kth side set */
+      if (i >= elem_ctr) {
+	elem_ctr += ((int*)num_elem_per_set)[++k];
+
+	el_type = elem_blk_parms[j].elem_type_val;
+	same_elem_type[k] = EX_TRUE;
+      }
+
+      if (el_type != elem_blk_parms[j].elem_type_val) same_elem_type[k] = EX_FALSE;
+    }
+
+    /* Build side set element to node list index and side set element
+       parameter index.
+    */
+    node_ctr = 0;
+    elem_ctr = ((int*)num_elem_per_set)[0];
+    for (i=0,k=0;i<tot_num_ss_elem;i++) {
+      int elem = ((int*)side_sets_elem_list)[i];
+
+      for (j=0; j<num_elem_blks; j++) {
+	if (elem <= elem_blk_parms[j].elem_ctr)
+	  {
+	    ((int*)ss_parm_ndx)[i] = j;     /* assign parameter block index */
+	    break;
+	  }
+      }
+      ((int*)ss_elem_node_ndx)[i] = node_ctr;     /* assign node list index */
+
+      /* determine which side set this element is in; assign to kth side set */
+      if (i >= elem_ctr) {
+	/* skip over NULL side sets */
+	while ( ((int*)num_elem_per_set)[++k] == 0);
+	elem_ctr += ((int*)num_elem_per_set)[k];
+      }
+
+      /* determine number of nodes per side */
+      if (((((int*)num_nodes_per_set)[k] % ((int*)num_elem_per_set)[k]) == 0) &&
+	  (same_elem_type[k])) {  /* all side set elements are same type */
+	node_ctr += ((int*)num_nodes_per_set)[k] /((int*)num_elem_per_set)[k];
+      } else {
+	node_ctr += elem_blk_parms[j].num_nodes_per_side[0];
+      }
+    }
+    ((int*)ss_elem_node_ndx)[i] = node_ctr;       /* assign node list index */
+  }
+
+  /* All setup, ready to go ... */
+
+  elem_ctr=0;
+
+  for (j=0; j < tot_num_ss_elem; j++)
+    {
+      int64_t elem;
+      int64_t idx;
+      int64_t ss_node0, ss_node1;
+      int64_t p_ndx;
+      if (int_size == sizeof(int64_t)) {
+	idx =  ((int64_t*)ss_elem_ndx)[j];
+	elem = ((int64_t*)side_sets_elem_list)[idx];
+	ss_node0 = ((int64_t*)side_sets_node_list)[((int64_t*)ss_elem_node_ndx)[idx]];
+	ss_node1 = ((int64_t*)side_sets_node_list)[((int64_t*)ss_elem_node_ndx)[idx]+1];
+	p_ndx    = ((int64_t*)ss_parm_ndx)[idx];
+      } else {
+	idx =  ((int*)ss_elem_ndx)[j];
+	elem = ((int*)side_sets_elem_list)[idx];
+	ss_node0 = ((int*)side_sets_node_list)[((int*)ss_elem_node_ndx)[idx]];
+	ss_node1 = ((int*)side_sets_node_list)[((int*)ss_elem_node_ndx)[idx]+1];
+	p_ndx    = ((int*)ss_parm_ndx)[idx];
+      }
+      elem_num = elem-1;
+
+      if (elem > elem_ctr)
+	{
+	  /* release connectivity array space and get next one */
+	  if (elem_ctr > 0)
+	    ex_safe_free(connect);
+
+	  /* Allocate space for the connectivity array for new element block */
+	  if (!(connect= malloc(elem_blk_parms[p_ndx].num_elem_in_blk*
+				elem_blk_parms[p_ndx].num_nodes_per_elem*
+				int_size)))
+	    {
+	      exerrval = EX_MEMFAIL;
+	      sprintf(errmsg,
+		      "Error: failed to allocate space for connectivity array for file id %d",
+		      exoid);
+	      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  /* get connectivity array */
+	  if (ex_get_elem_conn(
+			       exoid,
+			       elem_blk_parms[p_ndx].elem_blk_id,
+			       connect) == -1)
+	    {
+	      sprintf(errmsg,
+		      "Error: failed to get connectivity array for elem blk %"PRId64" for file id %d",
+		      elem_blk_parms[p_ndx].elem_blk_id,
+		      exoid);
+	      ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+	  elem_ctr = elem_blk_parms[p_ndx].elem_ctr;
+	}
+      /*  For the first node of each side in side set, using a linear search
+	  (of up to num_nodes_per_elem) of the connectivity array,
+	  locate the node position in the element. The first node position
+	  and the second node position are used with a element type specific
+	  table to determine the side. */
+
+      /* calculate the relative element number position in it's block*/
+      elem_num_pos = elem_num -
+	(elem_blk_parms[p_ndx].elem_ctr -
+	 elem_blk_parms[p_ndx].num_elem_in_blk);
+      /* calculate the beginning of the node list for this element by
+         using the ss_elem_node_ndx index into the side_sets_node_index
+         and adding the element number position * number of nodes per elem */
+
+      num_nodes_per_elem = elem_blk_parms[p_ndx].num_nodes_per_elem;
+
+      for (n=0; n<num_nodes_per_elem; n++) {
+	/* find node in connectivity array that matches first node in side set */
+	if ( ((int_size == sizeof(int64_t)) &&
+	      (ss_node0 == ((int64_t*)connect)[num_nodes_per_elem*(elem_num_pos)+n])) ||
+	     ((int_size == sizeof(int)) &&
+	      (ss_node0 == ((int*)connect)[num_nodes_per_elem*(elem_num_pos)+n])) ) {
+	  switch (elem_blk_parms[p_ndx].elem_type_val)
+	    {
+	    case EX_EL_CIRCLE:
+	    case EX_EL_SPHERE:
+	      {
+		/* simple case: 1st node number is same as side # */
+		put_side(side_sets_side_list,idx, n+1, int_size);
+		break;
+	      }
+	    case EX_EL_QUAD:
+	    case EX_EL_TRIANGLE:
+	    case EX_EL_TRUSS:
+	    case EX_EL_BEAM:
+	      {
+		/* simple case: 1st node number is same as side # */
+		put_side(side_sets_side_list,idx,n+1, int_size);
+		break;
+	      }
+	    case EX_EL_TRISHELL:
+	      {
+		/* use table to find which node to compare to next */
+		if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					 (trishell_table[0][2*n]-1),int_size))
+		  {
+		    /* Assume only front or back, no edges... */
+		    put_side(side_sets_side_list,idx, trishell_table[1][2*n],int_size);
+		  }
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (trishell_table[0][2*n+1]-1),int_size))
+		  {
+		    /* Assume only front or back, no edges... */
+		    put_side(side_sets_side_list,idx,trishell_table[1][2*n+1],int_size);
+		  }
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (trishell_table[0][2*n+2]-1),int_size))
+		  {
+		    /* Assume only front or back, no edges... */
+		    put_side(side_sets_side_list,idx,trishell_table[1][2*n+2],int_size);
+		  }
+		else
+		  {
+		    exerrval = EX_BADPARAM;
+		    sprintf(errmsg,
+			    "Error: failed to find TRIANGULAR SHELL element %"PRId64", node %"PRId64" in connectivity array %"PRId64" for file id %d",
+			    elem_num+1,
+			    ss_node1,
+			    elem_blk_parms[p_ndx].elem_blk_id,
+			    exoid);
+		    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		    err_stat = EX_FATAL;
+		    goto cleanup;
+		  }
+		break;
+
+	      }
+	    case EX_EL_SHELL:
+	      {
+		/* use table to find which node to compare to next */
+
+		if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+		  num_node_per_side = ((int64_t*)ss_elem_node_ndx)[idx+1] - ((int64_t*)ss_elem_node_ndx)[idx];
+		else
+		  num_node_per_side = ((int*)ss_elem_node_ndx)[idx+1] - ((int*)ss_elem_node_ndx)[idx];
+
+
+		if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					 (shell_table[0][2*n]-1),int_size))
+		  {
+		    if (num_node_per_side >= 4)
+		      /* 4- or 8-node side (front or back face) */
+		      put_side(side_sets_side_list,idx,shell_table[1][2*n],int_size);
+		    else
+		      /* 2- or 3-node side (edge of shell) */
+		      put_side(side_sets_side_list,idx,shell_edge_table[1][2*n],int_size);
+		  }
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (shell_table[0][2*n+1]-1),int_size))
+		  {
+		    if (num_node_per_side >= 4)
+		      /* 4- or 8-node side (front or back face) */
+		      put_side(side_sets_side_list,idx,shell_table[1][2*n+1],int_size);
+		    else
+		      /* 2- or 3-node side (edge of shell) */
+		      put_side(side_sets_side_list,idx,shell_edge_table[1][2*n+1],int_size);
+		  }
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (shell_table[0][2*n+2]-1),int_size))
+		  {
+		    if (num_node_per_side >= 4)
+		      /* 4- or 8-node side (front or back face) */
+		      put_side(side_sets_side_list,idx,shell_table[1][2*n+2],int_size);
+		    else
+		      /* 2- or 3-node side (edge of shell) */
+		      put_side(side_sets_side_list,idx,shell_edge_table[1][2*n+2],int_size);
+		  }
+		else
+		  {
+		    exerrval = EX_BADPARAM;
+		    sprintf(errmsg,
+			    "Error: failed to find SHELL element %"PRId64", node %"PRId64" in connectivity array %"PRId64" for file id %d",
+			    elem_num+1,
+			    ss_node1,
+			    elem_blk_parms[p_ndx].elem_blk_id,
+			    exoid);
+		    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		    err_stat = EX_FATAL;
+		    goto cleanup;
+		  }
+		break;
+
+	      }
+	    case EX_EL_HEX:
+	      {
+		/* use table to find which node to compare to next */
+
+		if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					 (hex_table[0][3*n]-1),int_size))
+		  put_side(side_sets_side_list,idx,hex_table[1][3*n],int_size);
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (hex_table[0][3*n+1]-1),int_size))
+		  put_side(side_sets_side_list,idx,hex_table[1][3*n+1],int_size);
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (hex_table[0][3*n+2]-1),int_size))
+		  put_side(side_sets_side_list,idx,hex_table[1][3*n+2],int_size);
+		else
+		  {
+		    exerrval = EX_BADPARAM;
+		    sprintf(errmsg,
+			    "Error: failed to find HEX element %"PRId64", node %"PRId64" in connectivity array %"PRId64" for file id %d",
+			    elem_num+1,
+			    ss_node1,
+			    elem_blk_parms[p_ndx].elem_blk_id,
+			    exoid);
+		    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		    err_stat = EX_FATAL;
+		    goto cleanup;
+		  }
+		break;
+	      }
+	    case EX_EL_TETRA:
+	      {
+		/* use table to find which node to compare to next */
+
+		if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					 (tetra_table[0][3*n]-1),int_size))
+		  put_side(side_sets_side_list,idx,tetra_table[1][3*n],int_size);
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (tetra_table[0][3*n+1]-1),int_size))
+		  put_side(side_sets_side_list,idx,tetra_table[1][3*n+1],int_size);
+		else if (ss_node1 == get_node(connect,num_nodes_per_elem*(elem_num_pos)+
+					      (tetra_table[0][3*n+2]-1),int_size))
+		  put_side(side_sets_side_list,idx,tetra_table[1][3*n+2],int_size);
+		else
+		  {
+		    exerrval = EX_BADPARAM;
+		    sprintf(errmsg,
+			    "Error: failed to find TETRA element %"PRId64", node %"PRId64" in connectivity array %"PRId64" for file id %d",
+			    elem_num+1,
+			    ss_node1,
+			    elem_blk_parms[p_ndx].elem_blk_id,
+			    exoid);
+		    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		    err_stat = EX_FATAL;
+		    goto cleanup;
+		  }
+		break;
+	      }
+	    case EX_EL_PYRAMID:
+	      {
+		/* NOTE: PYRAMID elements in side set node lists are currently not supported */
+		exerrval = EX_BADPARAM;
+		sprintf(errmsg,
+			"ERROR: unsupported PYRAMID element found in side set node list in file id %d",
+			exoid);
+		ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		err_stat = EX_FATAL;
+		goto cleanup;
+	      }
+	    case EX_EL_WEDGE:
+	      {
+		/* NOTE: WEDGE elements in side set node lists are currently not supported */
+		exerrval = EX_BADPARAM;
+		sprintf(errmsg,
+			"ERROR: unsupported WEDGE element found in side set node list in file id %d",
+			exoid);
+		ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		err_stat = EX_FATAL;
+		goto cleanup;
+	      }
+	    default:
+	      {
+		exerrval = EX_BADPARAM;
+		sprintf(errmsg,
+			"Error: %s is an unsupported element type",
+			elem_blk_parms[p_ndx].elem_type);
+		ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+		err_stat = EX_FATAL;
+		goto cleanup;
+	      }
+	    }
+	  break; /* done with this element */
+	}
+      }
+      if (n >= num_nodes_per_elem) /* did we find the node? */
+	{
+	  exerrval = EX_BADPARAM;
+	  sprintf(errmsg,
+		  "Error: failed to find element %"PRId64", node %"PRId64" in element block %"PRId64" for file id %d",
+		  elem_num+1, ss_node0,
+		  elem_blk_parms[p_ndx].elem_blk_id,
+		  exoid);
+	  ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+	  err_stat = EX_FATAL;
+	  goto cleanup;
+	}
+
+    }
+
+  /* All done: release connectivity array space, element block ids array,
+     element block parameters array, and side set element index array */
+ cleanup:
+  ex_safe_free(connect);
+  ex_safe_free(ss_elem_node_ndx);
+  ex_safe_free(ss_parm_ndx);
+  ex_safe_free(elem_blk_parms);
+  ex_safe_free(elem_blk_ids);
+  ex_safe_free(ss_elem_ndx);
+  ex_safe_free(same_elem_type);
+  
+  return (err_stat);
+}
+
diff --git a/exodus/cbind/src/ex_err.c b/exodus/cbind/src/ex_err.c
new file mode 100644
index 0000000..bce9cbf
--- /dev/null
+++ b/exodus/cbind/src/ex_err.c
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdio.h>                      // for fprintf, stderr, fflush
+#include <stdlib.h>                     // for exit
+#include <string.h>                     // for strcpy
+#include "exodusII.h"                   // for exoptval, MAX_ERR_LENGTH, etc
+#include "netcdf.h"                     // for NC_EAXISTYPE, NC_EBADDIM, etc
+
+/*!
+\fn{void ex_err(const char *module_name, const char *message, int err_num)}
+
+The function ex_err() logs an error to \c stderr. It is intended
+to provide explanatory messages for error codes returned from other
+exodus routines.
+
+The passed in error codes and corresponding messages are listed in
+???. The programmer may supplement the error message printed
+for standard errors by providing an error message. If the error code
+is provided with no error message, the predefined message will be
+used. The error code \c EX_MSG is available to log application
+specific messages.
+
+\param[in]  module_name  This is a string containing the name of the calling function.
+\param[in]  message      This is a string containing a message explaining the error 
+                         or problem. If \c EX_VERBOSE (see ex_opts()) is true, 
+                         this message will be printed to \c stderr. Otherwise, 
+			 nothing will be printed. Maximum length is \c MAX_ERR_LENGTH.
+
+\param[in] err_num       This is an integer code identifying the error. exodus C functions
+                         place an error code value in \c exerrval, an external int. Negative
+			 values are considered fatal errors while positive values are
+			 warnings. There is a set of predefined values defined in
+			 \file{exodusII.h}. The predefined constant \c EX_PRTLASTMSG will
+			 cause the last error message to be output, regardless of the setting
+			 of the error reporting level (see ex_opts()).
+
+The following is an example of the use of this function:
+
+\code
+int exoid, CPU_word_size, IO_word_size, errval;
+float version;
+char errmsg[MAX_ERR_LENGTH];
+
+CPU_word_size = sizeof(float); 
+IO_word_size = 0;
+
+\comment{open exodus file}
+if (exoid = ex_open ("test.exo", EX_READ, &CPU_word_size, 
+                     &IO_word_size, &version)) {
+   errval = 999;
+   sprintf(errmsg,"Error: cannot open file test.exo");
+   ex_err("prog_name", errmsg, errval);
+}
+\endcode
+
+*/
+
+int exerrval = 0;               /* clear initial global error code value */
+
+static char last_pname[MAX_ERR_LENGTH];
+static char last_errmsg[MAX_ERR_LENGTH];
+static int last_err_num;
+
+void ex_err(const char *module_name,      
+            const char *message, 
+            int err_num)            
+{
+  if (err_num == 0)             /* zero is no error, ignore and return */
+    return;
+
+  else if (err_num ==  EX_PRTLASTMSG)
+  {
+    fprintf(stderr, "[%s] %s\n",last_pname,last_errmsg);
+    fprintf(stderr, "    exerrval = %d\n",last_err_num);
+    return;
+  }
+
+  else if (err_num == EX_NULLENTITY)
+  {
+    if (exoptval & EX_NULLVERBOSE) {
+      fprintf(stderr, "Exodus Library Warning: [%s]\n\t%s\n",module_name,message);
+    }
+  }
+  else if (exoptval & EX_VERBOSE) /* check see if we really want to hear this */
+  {
+    fprintf(stderr, "Exodus Library Warning/Error: [%s]\n\t%s\n",module_name,message);
+    fprintf(stderr, "\t%s\n", nc_strerror(err_num));
+  } 
+  /* save the error message for replays */
+  strcpy(last_errmsg, message);
+  strcpy(last_pname, module_name);
+  last_err_num = err_num;
+
+  fflush(stderr);
+
+  /* with netCDF 3.4, (fatal) system error codes are > 0; 
+     so all EXODUS fatal error codes are > 0    */
+  if ((err_num > 0) && (exoptval & EX_ABORT))
+    exit (err_num);
+}
+
+void ex_get_err( const char** msg, const char** func, int* err_num )
+ {
+   (*msg) = last_errmsg;
+   (*func) = last_pname;
+   (*err_num) = last_err_num;
+ }
+
diff --git a/exodus/cbind/src/ex_get_all_times.c b/exodus/cbind/src/ex_get_all_times.c
new file mode 100644
index 0000000..412c71a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_all_times.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, VAR_WHOLE_TIME, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_double, etc
+
+/*!
+
+The function ex_get_all_times() reads the time values for all time
+steps. Memory must be allocated for the time values array before this
+function is invoked. The storage requirements (equal to the number of
+time steps) can be determined by using the ex_inquire() or
+ex_inquire_int() routines.
+
+Because time values are floating point values, the application code
+must declare the array passed to be the appropriate type (\c float or
+\c double) to match the compute word size passed in ex_create() or
+ex_open().
+
+\return In case of an error, ex_get_all_times() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  no time steps have been stored in the file.
+
+\param[in]   exoid        exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  time_values  Returned array of times. These are the time values at all time steps.
+
+The following code segment will read the time values for all time
+steps stored in the data file:
+
+\code
+int error, exoid, num_time_steps;
+float *time_values;
+
+\comment{determine how many time steps are stored}
+num_time_steps = ex_inquire_int(exoid, EX_INQ_TIME);
+
+\comment{read time values at all time steps}
+time_values = (float *) calloc(num_time_steps, sizeof(float));
+
+error = ex_get_all_times(exoid, time_values);
+\endcode
+
+*/
+
+int ex_get_all_times (int   exoid,
+                      void *time_values)
+{
+   int varid;
+   int status;
+   char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;
+
+  if ((status = nc_inq_varid(exoid, VAR_WHOLE_TIME, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to locate time variable %s in file id %d",
+            VAR_WHOLE_TIME, exoid);
+    ex_err("ex_get_all_times",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /*read time values */
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_var_float(exoid, varid, time_values);
+  } else {
+    status = nc_get_var_double(exoid, varid, time_values);
+  }
+    
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to get time values from file id %d",
+            exoid);
+    ex_err("ex_get_all_times",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_attr.c b/exodus/cbind/src/ex_get_attr.c
new file mode 100644
index 0000000..9cfccd3
--- /dev/null
+++ b/exodus/cbind/src/ex_get_attr.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgatt - ex_get_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge/face/element block)
+*       int     obj_id                  object id (edge id, face id, elem id)
+*
+* exit conditions - 
+*       float*  attrib                  array of attributes
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_double, etc
+
+/*!
+ * \undoc reads the attributes for an edge, face, or element block
+ */
+
+int ex_get_attr( int   exoid,
+                 ex_entity_type obj_type,
+                 ex_entity_id   obj_id,
+                 void* attrib )
+
+{
+  int status;
+  int attrid, obj_id_ndx;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in vobjids array */
+  if (obj_type == EX_NODAL)
+    obj_id_ndx = 0;
+  else {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_get_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id, exoid);
+	ex_err("ex_get_attr",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    vattrbname = VAR_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    vattrbname = VAR_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    vattrbname = VAR_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    vattrbname = VAR_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    vattrbname = VAR_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    vattrbname = VAR_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    vattrbname = VAR_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    vattrbname = VAR_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    vattrbname = VAR_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_get_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if ((status = nc_inq_varid(exoid, vattrbname, &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate attributes for %s %"PRId64" in file id %d",
+            ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_get_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* read in the attributes */
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_var_float(exoid, attrid, attrib);
+  } else {
+    status = nc_get_var_double(exoid, attrid, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get attributes for %s %"PRId64" in file id %d",
+            ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_get_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_attr_names.c b/exodus/cbind/src/ex_get_attr_names.c
new file mode 100644
index 0000000..d6ff111
--- /dev/null
+++ b/exodus/cbind/src/ex_get_attr_names.c
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgeat - ex_get_attr_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge/face/elem block)
+*       int     obj_id                  object id (edge/face/elem block id)
+*
+* exit conditions - 
+*       char*   names[]                 ptr array of attribute names
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*! \undoc */
+/*
+ * reads the attribute names for an element block
+ */
+int ex_get_attr_names( int   exoid,
+                       ex_entity_type obj_type,
+                       ex_entity_id   obj_id,
+                       char **names)
+{
+  int status;
+  int varid, numattrdim, obj_id_ndx;
+  size_t num_attr, i;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumobjatt;
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in vobjids array */
+  if (obj_type != EX_NODAL) {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type), obj_id, exoid);
+	ex_err("ex_get_attr_names",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type), obj_id, exoid);
+	ex_err("ex_get_attr_names",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_NODE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vattrbname = VAR_NAME_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_SIDE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vattrbname = VAR_NAME_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vattrbname = VAR_NAME_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vattrbname = VAR_NAME_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vattrbname = VAR_NAME_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vattrbname = VAR_NAME_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vattrbname = VAR_NAME_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vattrbname = VAR_NAME_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vattrbname = VAR_NAME_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_get_attr_names",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid(exoid, dnumobjatt, &numattrdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: no attributes found for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_get_attr_names",errmsg,EX_MSG);
+    return (EX_WARN);              /* no attributes for this object */
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numattrdim, &num_attr)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_get_attr_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* It is OK if we don't find the attribute names since they were
+     added at version 4.26; earlier databases won't have the names.
+  */
+  status = nc_inq_varid(exoid, vattrbname, &varid);
+
+  /* read in the attributes */
+
+  if (status == NC_NOERR) {
+    /* read the names */
+    status = ex_get_names_internal(exoid, varid, num_attr, names, obj_type, "ex_get_attr_names");
+    if (status != NC_NOERR) {
+      return (EX_FATAL);
+    }
+  } else {
+    /* Names variable does not exist on the database; probably since this is an
+     * older version of the database.  Return an empty array...
+     */
+    for (i=0; i<num_attr; i++) {
+      names[i][0] = '\0';
+    }
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_attr_param.c b/exodus/cbind/src/ex_get_attr_param.c
new file mode 100644
index 0000000..2940e55
--- /dev/null
+++ b/exodus/cbind/src/ex_get_attr_param.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expmp - ex_get_attr_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid           exodus file id
+*       int     obj_type        block/set type (node, edge, face, elem)
+*       int     obj_id          block/set id (ignored for NODAL)       
+*       int     num_attrs       number of attributes
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+ * \undoc retrieves the number of attributes.
+ */
+
+int ex_get_attr_param (int   exoid,
+		       ex_entity_type obj_type,
+		       ex_entity_id   obj_id,
+		       int*  num_attrs)
+{
+  int status;
+  int dimid;
+  
+  char errmsg[MAX_ERR_LENGTH];
+  const char *dnumobjatt;
+
+  int obj_id_ndx;
+  size_t lnum_attr_per_entry;
+  
+  /* Determine index of obj_id in vobjids array */
+  if (obj_type == EX_NODAL)
+    obj_id_ndx = 0;
+  else {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	*num_attrs = 0;
+	return (EX_NOERR);
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_get_attr_param",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Bad block type (%d) specified for file id %d",
+	    obj_type, exoid );
+    ex_err("ex_get_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  exerrval = 0; /* clear error code */
+
+  if ((status = nc_inq_dimid(exoid, dnumobjatt, &dimid)) != NC_NOERR) {
+    /* dimension is undefined */
+    *num_attrs = 0;
+  } else {
+    if ((status = nc_inq_dimlen(exoid, dimid, &lnum_attr_per_entry)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of attributes in %s %"PRId64" in file id %d",
+	      ex_name_of_object(obj_type),obj_id, exoid);
+      ex_err("ex_get_attr_param",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+    *num_attrs = lnum_attr_per_entry;
+  }
+  return (EX_NOERR);
+}
+
diff --git a/exodus/cbind/src/ex_get_block.c b/exodus/cbind/src/ex_get_block.c
new file mode 100644
index 0000000..7f2a07d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_block.c
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*! 
+*
+* \undoc exgblk - read block parameters
+*
+* entry conditions -
+*   input parameters:
+*       int     idexo                   exodus file id
+*       int     blk_type                block type (edge,face,element)
+*       int     blk_id                  block id
+*
+* exit conditions -
+*       char*   elem_type               element type name
+*       int*    num_entries_this_blk    number of elements in this element block
+*       int*    num_nodes_per_entry     number of nodes per element block
+*       int*    num_attr_per_entry      number of attributes
+*
+* revision history -
+*
+*
+*/
+
+#include <string.h>                     // for strcpy
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_block, void_int, etc
+
+/*
+ * reads the parameters used to describe an edge, face, or element block
+ */
+
+int ex_get_block( int exoid,
+		  ex_entity_type blk_type,
+		  ex_entity_id   blk_id,
+		  char* elem_type,
+		  void_int* num_entries_this_blk,
+		  void_int* num_nodes_per_entry,
+		  void_int* num_edges_per_entry,
+		  void_int* num_faces_per_entry,
+		  void_int* num_attr_per_entry )
+{
+  int err;
+  ex_block block;
+  block.id   = blk_id;
+  block.type = blk_type;
+
+  err = ex_get_block_param(exoid, &block);
+  
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    int64_t* n_entries_this_blk = num_entries_this_blk;
+    int64_t* n_nodes_per_entry  = num_nodes_per_entry;
+    int64_t* n_edges_per_entry  = num_edges_per_entry;
+    int64_t* n_faces_per_entry  = num_faces_per_entry;
+    int64_t* n_attr_per_entry   = num_attr_per_entry;
+      
+    if (n_entries_this_blk) *n_entries_this_blk = block.num_entry;
+    if (n_nodes_per_entry)  *n_nodes_per_entry  = block.num_nodes_per_entry;
+    if (n_edges_per_entry)  *n_edges_per_entry  = block.num_edges_per_entry;
+    if (n_faces_per_entry)  *n_faces_per_entry  = block.num_faces_per_entry;
+    if (n_attr_per_entry)   *n_attr_per_entry   = block.num_attribute;
+  } else {
+    int* n_entries_this_blk = num_entries_this_blk;
+    int* n_nodes_per_entry  = num_nodes_per_entry;
+    int* n_edges_per_entry  = num_edges_per_entry;
+    int* n_faces_per_entry  = num_faces_per_entry;
+    int* n_attr_per_entry   = num_attr_per_entry;
+      
+    if (n_entries_this_blk) *n_entries_this_blk = block.num_entry;
+    if (n_nodes_per_entry)  *n_nodes_per_entry  = block.num_nodes_per_entry;
+    if (n_edges_per_entry)  *n_edges_per_entry  = block.num_edges_per_entry;
+    if (n_faces_per_entry)  *n_faces_per_entry  = block.num_faces_per_entry;
+    if (n_attr_per_entry)   *n_attr_per_entry   = block.num_attribute;
+  }
+
+  if (elem_type)
+    strcpy(elem_type, block.topology);
+  
+  return err;
+}
+
diff --git a/exodus/cbind/src/ex_get_block_param.c b/exodus/cbind/src/ex_get_block_param.c
new file mode 100644
index 0000000..0c896ad
--- /dev/null
+++ b/exodus/cbind/src/ex_get_block_param.c
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*! 
+*
+* \undoc exgblk - read block parameters
+*
+* entry conditions -
+*   input parameters:
+*       int     idexo                   exodus file id
+*       int     blk_type                block type (edge,face,element)
+*       int     blk_id                  block id
+*
+* exit conditions -
+*       char*   elem_type               element type name
+*       int*    num_entries_this_blk    number of elements in this element block
+*       int*    num_nodes_per_entry     number of nodes per element block
+*       int*    num_attr_per_entry      number of attributes
+*
+* revision history -
+*
+*
+*/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strcpy
+#include "exodusII.h"                   // for ex_block, exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ATT_NAME_ELB, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*
+ * reads the parameters used to describe an edge, face, or element block
+ */
+
+int ex_get_block_param( int exoid,
+			ex_block *block )
+{
+  int dimid, connid, blk_id_ndx;
+  size_t len, i;
+  char  errmsg[MAX_ERR_LENGTH];
+  int status;
+  const char* dnument;
+  const char* dnumnod;
+  const char* dnumedg;
+  const char* dnumfac;
+  const char* dnumatt;
+  const char* ablknam;
+  const char* vblkcon;
+
+  exerrval = 0;
+
+  /* First, locate index of element block id in VAR_ID_EL_BLK array */
+  blk_id_ndx = ex_id_lkup(exoid,block->type,block->id);
+  if (exerrval != 0)  {
+    strcpy(block->topology, "NULL");     	/* NULL element type name */
+    block->num_entry = 0;  /* no elements            */
+    block->num_nodes_per_entry = 0;   /* no nodes               */
+    block->num_edges_per_entry = 0;
+    block->num_faces_per_entry = 0;
+    block->num_attribute = 0;    /* no attributes          */
+    if (exerrval == EX_NULLENTITY) {    /* NULL element block?    */
+      return (EX_NOERR);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id  %"PRId64" in id array in file id %d",
+	      ex_name_of_object(block->type), block->id,exoid);
+      ex_err("ex_get_block_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  switch (block->type) {
+  case EX_EDGE_BLOCK:
+    dnument = DIM_NUM_ED_IN_EBLK(blk_id_ndx);
+    dnumnod = DIM_NUM_NOD_PER_ED(blk_id_ndx);
+    dnumedg = 0;
+    dnumfac = 0;
+    dnumatt = DIM_NUM_ATT_IN_EBLK(blk_id_ndx);
+    vblkcon = VAR_EBCONN(blk_id_ndx);
+    ablknam = ATT_NAME_ELB;
+    break;
+  case EX_FACE_BLOCK:
+    dnument = DIM_NUM_FA_IN_FBLK(blk_id_ndx);
+    dnumnod = DIM_NUM_NOD_PER_FA(blk_id_ndx);
+    dnumedg = 0; /* it is possible this might be non-NULL some day */
+    dnumfac = 0;
+    dnumatt = DIM_NUM_ATT_IN_FBLK(blk_id_ndx);
+    vblkcon = VAR_FBCONN(blk_id_ndx);
+    ablknam = ATT_NAME_ELB;
+    break;
+  case EX_ELEM_BLOCK:
+    dnument = DIM_NUM_EL_IN_BLK(blk_id_ndx);
+    dnumnod = DIM_NUM_NOD_PER_EL(blk_id_ndx);
+    dnumedg = DIM_NUM_EDG_PER_EL(blk_id_ndx);
+    dnumfac = DIM_NUM_FAC_PER_EL(blk_id_ndx);
+    dnumatt = DIM_NUM_ATT_IN_BLK(blk_id_ndx);
+    vblkcon = VAR_CONN(blk_id_ndx);
+    ablknam = ATT_NAME_ELB;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg, "Bad block type parameter (%d) specified for file id %d.",
+	     block->type, exoid );
+    return (EX_FATAL);
+  }
+
+  /* inquire values of some dimensions */
+  if ((status = nc_inq_dimid (exoid, dnument, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of entities in %s  %"PRId64" in file id %d",
+	    ex_name_of_object(block->type),block->id,exoid);
+    ex_err("ex_get_block_param",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+  
+  if ((status = nc_inq_dimlen (exoid, dimid, &len)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of %ss in block  %"PRId64" in file id %d",
+	    ex_name_of_object(block->type),block->id, exoid);
+    ex_err("ex_get_block_param",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+  block->num_entry = len;
+
+  if ((status = nc_inq_dimid (exoid, dnumnod, &dimid)) != NC_NOERR) {
+    /* undefined => no node entries per element */
+    len = 0;
+  } else {
+    if ((status = nc_inq_dimlen (exoid, dimid, &len)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of nodes/entity in %s  %"PRId64" in file id %d",
+	      ex_name_of_object(block->type),block->id, exoid);
+      ex_err("ex_get_block_param",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+  }
+  block->num_nodes_per_entry = len;
+
+  if ( block->type != EX_ELEM_BLOCK ) {
+    block->num_edges_per_entry = 0;
+  } else {
+    if ((status = nc_inq_dimid (exoid, dnumedg, &dimid)) != NC_NOERR) {
+      /* undefined => no edge entries per element */
+      len = 0;
+    } else {
+      if ((status = nc_inq_dimlen (exoid, dimid, &len)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of edges/entry in %s  %"PRId64" in file id %d",
+		ex_name_of_object(block->type),block->id, exoid);
+	ex_err("ex_get_block_param",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+    }
+    block->num_edges_per_entry = len;
+  }
+
+  if ( block->type != EX_ELEM_BLOCK ) {
+    block->num_faces_per_entry = 0;
+  } else {
+    if ((status = nc_inq_dimid (exoid, dnumfac, &dimid)) != NC_NOERR) {
+      /* undefined => no face entries per element */
+      len = 0;
+    } else {
+      if ((status = nc_inq_dimlen(exoid, dimid, &len)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of faces/entity in %s  %"PRId64" in file id %d",
+		ex_name_of_object(block->type),block->id, exoid);
+	ex_err("ex_get_block_param",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+    }
+    block->num_faces_per_entry = len;
+  }
+
+  if ((status = nc_inq_dimid (exoid, dnumatt, &dimid)) != NC_NOERR) {
+    /* dimension is undefined */
+    block->num_attribute = 0;
+  } else {
+    if ((status = nc_inq_dimlen(exoid, dimid, &len)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of attributes in %s  %"PRId64" in file id %d",
+	      ex_name_of_object(block->type),block->id, exoid);
+      ex_err("ex_get_block_param",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+    block->num_attribute = len;
+  }
+
+  if (block->num_nodes_per_entry > 0) {
+    ; /* Do nothing, vblkcon should be correctly set already */
+  } else if (block->num_edges_per_entry > 0) {
+    vblkcon = VAR_EBCONN(blk_id_ndx);
+  } else if (block->num_faces_per_entry > 0) {
+    vblkcon = VAR_FCONN(blk_id_ndx);
+  }
+
+  if (vblkcon) {
+    /* look up connectivity array for this element block id */
+    if ((status = nc_inq_varid (exoid, vblkcon, &connid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate connectivity array for %s  %"PRId64" in file id %d",
+	      ex_name_of_object(block->type), block->id,exoid);
+      ex_err("ex_get_block_param",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+    
+    if ((status = nc_inq_attlen (exoid, connid, ablknam, &len)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get %s  %"PRId64" type in file id %d",
+	      ex_name_of_object(block->type), block->id,exoid);
+      ex_err("ex_get_block_param",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+    
+    if (len > (MAX_STR_LENGTH+1)) {
+      len = MAX_STR_LENGTH;
+      sprintf (errmsg,
+	       "Warning: %s  %"PRId64" type will be truncated to %ld chars", 
+	       ex_name_of_object(block->type), block->id, (long)len);
+      ex_err("ex_get_block_param",errmsg,EX_MSG);
+    }
+    
+    for (i=0; i < MAX_STR_LENGTH+1; i++)
+      block->topology[i] = '\0';
+
+    /* get the element type name */
+    if ((status = nc_get_att_text (exoid, connid, ablknam, block->topology)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,"Error: failed to get %s  %"PRId64" type in file id %d",
+	      ex_name_of_object(block->type), block->id, exoid);
+      ex_err("ex_get_block_param",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+    
+    /* get rid of trailing blanks */
+    ex_trim_internal(block->topology);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_block_params.c b/exodus/cbind/src/ex_get_block_params.c
new file mode 100644
index 0000000..ec5b84c
--- /dev/null
+++ b/exodus/cbind/src/ex_get_block_params.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2014 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include <stddef.h>                     // for size_t
+#include "exodusII.h"                   // for ex_get_block_param, etc
+#include "exodusII_int.h"               // for EX_NOERR
+
+/*!
+ * Reads the parameters describing element/face/edge blocks
+ * \param   exoid                   exodus file id
+ * \param   block_count             number of blocks being queried
+ * \param   block                   array of ex_block structures describing block counts
+ *
+ * the id and type fields of the block(s) must be defined to specify which blocks to access;
+ *  all other fileds will be filled in based on data from the file
+ */
+
+int ex_get_block_params(int exoid,
+			size_t block_count,
+			struct ex_block **blocks)
+{
+  size_t i;
+  for (i=0; i < block_count; i++) {
+    int status = ex_get_block_param(exoid, blocks[i]);
+    if (status != EX_NOERR) {
+      return status;
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_cmap_params.c b/exodus/cbind/src/ex_get_cmap_params.c
new file mode 100644
index 0000000..599cad9
--- /dev/null
+++ b/exodus/cbind/src/ex_get_cmap_params.c
@@ -0,0 +1,426 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_cmap_params()
+ *****************************************************************************
+ * This function outputs the communication map parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid                - The NetCDF ID of an already open NemesisI file.
+ *      node_cmap_ids       - Pointer to vector of nodal communication
+ *                            set IDs.
+ *      node_cmap_node_cnts - Pointer to a vector which contains a count of
+ *                            the number of FEM nodes for each nodal
+ *                            communication map.
+ *      elem_cmap_ids       - Pointer to vector for retrieval of elemental
+ *                            communication set IDs.
+ *      elem_cmap_elem_cnts - Pointer to a vector which contains a count of
+ *                            the number of FEM elements for each elemental
+ *                            communication map.
+ *      processor           - The processor the file being read was written
+ *                            for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for ex_err, exerrval, etc
+#include <exodusII_int.h>               // for EX_FATAL, VAR_E_COMM_IDS, etc
+#include <inttypes.h>                   // for PRId64
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_dimid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_get_cmap_params(int  exoid,
+                       void_int *node_cmap_ids,
+                       void_int *node_cmap_node_cnts,
+                       void_int *elem_cmap_ids,
+                       void_int *elem_cmap_elem_cnts,
+                       int  processor
+		       )
+{
+  const char   *func_name="ex_get_cmap_params";
+
+  size_t  cnt, num_n_comm_maps, num_e_comm_maps, start[1], count[1];
+  int64_t cmap_info_idx[2], cmap_data_idx[2];
+  int     nmstat;
+  int     status, map_idx, varid, dimid;
+
+  char    errmsg[MAX_ERR_LENGTH];
+  /*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0;	/* clear error code */
+
+  /*****************************************************************************/
+  /*****************************************************************************/
+  /*                    Nodal communication map(s)                             */
+  /*****************************************************************************/
+  /*****************************************************************************/
+
+  /* get the cmap information variables index */
+  if (ex_get_idx(exoid, VAR_N_COMM_INFO_IDX, cmap_info_idx, processor) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_N_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the number of nodal communications maps in the file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_N_CMAPS, &dimid)) == NC_NOERR) {
+    /* check if I need to get the dimension of the nodal comm map */
+    if (cmap_info_idx[1] == -1) {
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_N_CMAPS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      cmap_info_idx[1] = count[0];
+    }  /* End "if (cmap_info_idx[1] == -1) */
+
+    num_n_comm_maps = cmap_info_idx[1] - cmap_info_idx[0];
+
+    if (num_n_comm_maps > 0) {
+      count[0] = num_n_comm_maps;
+
+      /* Get the variable ID for the vector of nodal comm map IDs */
+      if ((status = nc_inq_varid(exoid, VAR_N_COMM_IDS, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to get variable ID for \"%s\" in file ID %d",
+                VAR_N_COMM_IDS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      /* Get the vector of nodal communication map IDs */
+      if (node_cmap_ids != NULL) {
+        start[0] = cmap_info_idx[0];
+	if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	  status = nc_get_vara_longlong(exoid, varid, start, count, node_cmap_ids);
+	} else {
+	  status = nc_get_vara_int(exoid, varid, start, count, node_cmap_ids);
+	}
+
+        if (status != NC_NOERR) {
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: failed to get variable \"%s\" from file ID %d",
+                  VAR_N_COMM_IDS, exoid);
+          ex_err(func_name, errmsg, exerrval);
+          return (EX_FATAL);
+        }
+
+        if ((status = nc_inq_varid(exoid, VAR_N_COMM_STAT, &varid)) != NC_NOERR) {
+          exerrval = status;
+          sprintf(errmsg,
+		  "Error: failed to find variable ID for \"%s\" from file ID %d",
+                  VAR_N_COMM_STAT, exoid);
+          ex_err(func_name, errmsg, exerrval);
+          return (EX_FATAL);
+        }
+
+        if (node_cmap_node_cnts != NULL) {
+
+          /* Get the node counts in each of the nodal communication maps */
+          for(cnt=0; cnt < num_n_comm_maps; cnt++) {
+	    int64_t cmap_id;
+	    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	      cmap_id = ((int64_t*)node_cmap_ids)[cnt];
+	    } else {
+	      cmap_id = ((int*)node_cmap_ids)[cnt];
+	    }
+
+            if ((map_idx=ne_id_lkup(exoid, VAR_N_COMM_IDS, cmap_info_idx, cmap_id)) < 0) {
+              exerrval = EX_MSG;
+              sprintf(errmsg,
+		      "Error: failed to find nodal comm map with ID %"PRId64" in file ID %d",
+                      cmap_id, exoid);
+              ex_err(func_name, errmsg, exerrval);
+              return (EX_FATAL);
+            }
+
+            /* Check the status of the node map */
+            start[0] = map_idx;
+            if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+              exerrval = status;
+              sprintf(errmsg,
+		      "Error: failed to get status for \"%s\" from file ID %d",
+                      VAR_N_COMM_STAT, exoid);
+              ex_err(func_name, errmsg, exerrval);
+              return (EX_FATAL);
+            }
+
+            if (nmstat == 1) {
+
+              /* get the cmap information variables index */
+              if (ex_get_idx(exoid, VAR_N_COMM_DATA_IDX, cmap_data_idx,
+                             map_idx) == -1) {
+                exerrval = status;
+                sprintf(errmsg,
+			"Error: failed to find index variable, \"%s\", in file ID %d",
+                        VAR_N_COMM_DATA_IDX, exoid);
+                ex_err(func_name, errmsg, exerrval);
+
+                return (EX_FATAL);
+              }
+
+              if (cmap_data_idx[1] == -1) {
+                /*
+                 * Find the dimension ID of the variable containing the
+                 * node count
+                 */
+                if ((status = nc_inq_dimid(exoid, DIM_NCNT_CMAP, &dimid)) != NC_NOERR) {
+                  exerrval = status;
+                  sprintf(errmsg,
+			  "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                          DIM_NCNT_CMAP, exoid);
+                  ex_err(func_name, errmsg, exerrval);
+                  return (EX_FATAL);
+                }
+
+		/* Find the value of the number of nodes in this nodal comm map */
+                if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+                  exerrval = status;
+                  sprintf(errmsg,
+			  "Error: failed to find length of dimension \"%s\" in file ID %d",
+                          DIM_NCNT_CMAP, exoid);
+                  ex_err(func_name, errmsg, exerrval);
+                  return (EX_FATAL);
+                }
+
+                cmap_data_idx[1] = count[0];
+              }
+
+	      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+		((int64_t*)node_cmap_node_cnts)[cnt] = cmap_data_idx[1] - cmap_data_idx[0];
+	      } else {
+		((int*)node_cmap_node_cnts)[cnt] = cmap_data_idx[1] - cmap_data_idx[0];
+	      }
+            }
+            else
+	      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+		((int64_t*)node_cmap_node_cnts)[cnt] = 0;
+	      } else {
+		((int*)node_cmap_node_cnts)[cnt] = 0;
+	      }
+          }  /* "for(cnt=0; cnt < num_n_comm_maps; cnt++)" */
+        }  /* "if (node_cmap_node_cnts != NULL)" */
+      }  /* "if (node_cmap_ids != NULL)" */
+    }  /* "if (num_n_comm_maps > 0)" */
+  } /* End "if ((dimid = nc_inq_dimid(exoid, DIM_NUM_N_CMAPS)) != -1)" */
+
+  /*****************************************************************************/
+  /*****************************************************************************/
+  /*                Elemental communication map(s)                             */
+  /*****************************************************************************/
+  /*****************************************************************************/
+
+  /* get the cmap information variables index */
+  if (ex_get_idx(exoid, VAR_E_COMM_INFO_IDX, cmap_info_idx, processor) == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_E_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the number of elemental communications maps in the file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_E_CMAPS, &dimid)) == NC_NOERR) {
+    /* check if I need to get the dimension of the nodal comm map */
+    if (cmap_info_idx[1] == -1) {
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_E_CMAPS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      cmap_info_idx[1] = count[0];
+    }  /* End "if (cmap_info_idx[1] == -1) */
+
+    num_e_comm_maps = cmap_info_idx[1] - cmap_info_idx[0];
+
+    if (num_e_comm_maps > 0) {
+      count[0] = num_e_comm_maps;
+
+      /* Get the variable ID for the vector of nodal comm map IDs */
+      if ((status = nc_inq_varid(exoid, VAR_E_COMM_IDS, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to get variable ID for \"%s\" in file ID %d",
+                VAR_E_COMM_IDS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      /* Get the vector of elemental communication map IDs */
+      if (elem_cmap_ids != NULL) {
+        start[0] = cmap_info_idx[0];
+	if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	  status = nc_get_vara_longlong(exoid, varid, start, count, elem_cmap_ids);
+	} else {
+	  status = nc_get_vara_int(exoid, varid, start, count, elem_cmap_ids);
+	}
+        if (status != NC_NOERR) {
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: failed to get variable \"%s\" from file ID %d",
+                  VAR_E_COMM_IDS, exoid);
+          ex_err(func_name, errmsg, exerrval);
+          return (EX_FATAL);
+        }
+
+        if ((status = nc_inq_varid(exoid, VAR_E_COMM_STAT, &varid)) != NC_NOERR) {
+          exerrval = status;
+          sprintf(errmsg,
+		  "Error: failed to find variable ID for \"%s\" from file ID %d",
+                  VAR_E_COMM_STAT, exoid);
+          ex_err(func_name, errmsg, exerrval);
+          return (EX_FATAL);
+        }
+
+        if (elem_cmap_elem_cnts != NULL) {
+          /*
+           * Get the element counts in each of the elemental
+           * communication maps
+           */
+          for(cnt=0; cnt < num_e_comm_maps; cnt++) {
+	    int64_t cmap_id;
+	    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	      cmap_id = ((int64_t*)elem_cmap_ids)[cnt];
+	    } else {
+	      cmap_id = ((int*)elem_cmap_ids)[cnt];
+	    }
+
+            if ((map_idx=ne_id_lkup(exoid, VAR_E_COMM_IDS, cmap_info_idx,
+				    cmap_id)) < 0) {
+              exerrval = EX_MSG;
+              sprintf(errmsg,
+		      "Error: failed to find elemental comm map with ID %"PRId64" in file ID %d",
+                      cmap_id, exoid);
+              ex_err(func_name, errmsg, exerrval);
+              return (EX_FATAL);
+            }
+
+            /* Check the status of the requested elemental map */
+            start[0] = map_idx;
+            if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+              exerrval = status;
+              sprintf(errmsg,
+                      "Error: failed to get status for \"%s\" from file ID %d",
+                      VAR_E_COMM_STAT, exoid);
+              ex_err(func_name, errmsg, exerrval);
+              return (EX_FATAL);
+            }
+
+            if (nmstat == 1) {
+
+              /* get the cmap information variables index */
+              if (ex_get_idx(exoid, VAR_E_COMM_DATA_IDX, cmap_data_idx,
+                             map_idx) == -1) {
+                exerrval = status;
+                sprintf(errmsg,
+			"Error: failed to find index variable, \"%s\", in file ID %d",
+			VAR_E_COMM_DATA_IDX, exoid);
+                ex_err(func_name, errmsg, exerrval);
+
+                return (EX_FATAL);
+              }
+
+              if (cmap_data_idx[1] == -1) {
+                /*
+                 * Find the dimension ID of the variable containing the
+                 * element count
+                 */
+                if ((status = nc_inq_dimid(exoid, DIM_ECNT_CMAP, &dimid)) != NC_NOERR) {
+                  exerrval = status;
+                  sprintf(errmsg,
+			  "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                          DIM_ECNT_CMAP, exoid);
+                  ex_err(func_name, errmsg, exerrval);
+                  return (EX_FATAL);
+                }
+
+                /*
+                 * Find the value of the number of elements in this elemental
+                 * comm map
+                 */
+                if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+                  exerrval = status;
+                  sprintf(errmsg,
+			  "Error: failed to find length of dimension \"%s\" in file ID %d",
+                          DIM_ECNT_CMAP, exoid);
+                  ex_err(func_name, errmsg, exerrval);
+                  return (EX_FATAL);
+                }
+                cmap_data_idx[1] = count[0];
+              }
+	      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+		((int64_t*)elem_cmap_elem_cnts)[cnt] = cmap_data_idx[1] - cmap_data_idx[0];
+	      } else {
+		((int*)elem_cmap_elem_cnts)[cnt] = cmap_data_idx[1] - cmap_data_idx[0];
+	      }
+            }
+            else
+	      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+		((int64_t*)elem_cmap_elem_cnts)[cnt] = 0;
+	      } else {
+		((int*)elem_cmap_elem_cnts)[cnt] = 0;
+	      }
+          }  /* "for(cnt=0; cnt < num_e_comm_maps; cnt++)" */
+        }  /* "if (elem_cmap_elem_cnts != NULL)" */
+      }  /* "if (elem_cmap_ids != NULL)" */
+    }  /* "if (num_e_comm_maps > 0)" */
+  } /* End "if ((dimid = nc_inq_dimid(exoid, DIM_NUM_E_CMAPS(processor))) != -1)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_concat_node_sets.c b/exodus/cbind/src/ex_get_concat_node_sets.c
new file mode 100644
index 0000000..2913267
--- /dev/null
+++ b/exodus/cbind/src/ex_get_concat_node_sets.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for NULL
+#include "exodusII.h"                   // for ex_set_specs, void_int, etc
+
+/*!
+\deprecated Use ex_get_concat_sets()(exoid, EX_NODE_SET, set_specs) instead
+
+The function ex_get_concat_node_sets() reads the node set ID's, node
+set node count array, node set distribution factors count array, node
+set node pointers array, node set distribution factors pointer array,
+node set node list, and node set distribution factors for all of the
+node sets. ``Concatenated node sets'' refers to the arrays required to
+define all of the node sets (ID array, counts arrays, pointers arrays,
+node list array, and distribution factors array) as described in
+Section 3.10 on page 11.
+
+Because the distribution factors are floating point values, the
+application code must declare the array passed to be the appropriate
+type (\c float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+The length of each of the returned arrays can be determined by
+invoking ex_inquire() or ex_inquire_int().
+
+\return In case of an error, ex_get_concat_node_sets() returns a
+negative number; a warning will return a positive number. Possible
+causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if no node sets are stored in the file.
+
+
+\param[in]  exoid                 exodus file ID returned from a previous call to ex_create()
+                                  or ex_open().
+
+\param[out]  node_set_ids         Returned array containing the node set ID for each set.
+
+\param[out]  num_nodes_per_set    Returned array containing the number of nodes for each set.
+
+\param[out]  num_df_per_set       Returned array containing the number of distribution factors for each
+                                  set.
+
+\param[out]  node_sets_node_index Returned array containing the indices into the \c node_set_node_list
+                                  which are the locations of the first node for each set. These indices
+				  are 0-based.
+
+\param[out]  node_sets_df_index   Returned array containing the indices into the \c node_set_dist_fact
+                                  which are the locations of the first distribution factor for each
+				  set. These indices are 0-based.
+
+\param[out]  node_sets_node_list  Returned array containing the nodes for all sets. Internal node IDs
+                                  are used in this list (see Section LocalNodeIds).
+
+\param[out]  node_sets_dist_fact  Returned array containing the distribution factors for all sets.
+
+
+As an example, the following code segment will read concatenated node
+sets:
+
+\code
+
+int error, exoid, num_node_sets, list_len, *ids, 
+    *num_nodes_per_set, *num_df_per_set, *node_ind, 
+    *df_ind, *node_list;
+
+float *dist_fact
+
+\comment{read concatenated node sets}
+num_node_sets = ex_inquire_int(exoid, EX_INQ_NODE_SETS);
+
+ids               = (int *) calloc(num_node_sets, sizeof(int));
+num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+num_df_per_set    = (int *) calloc(num_node_sets, sizeof(int));
+node_ind          = (int *) calloc(num_node_sets, sizeof(int));
+df_ind            = (int *) calloc(num_node_sets, sizeof(int));
+
+list_len = ex_inquire_int(exoid, EX_INQ_NS_NODE_LEN);
+node_list = (int *) calloc(list_len, sizeof(int));
+
+list_len = ex_inquire_int(exoid, EX_INQ_NS_DF_LEN);
+dist_fact = (float *) calloc(list_len, sizeof(float));
+
+error = ex_get_concat_node_sets (exoid, ids, num_nodes_per_set, 
+                                 num_df_per_set, node_ind, df_ind, 
+                                 node_list, dist_fact);
+\endcode
+*/
+
+int ex_get_concat_node_sets (int   exoid,
+                             void_int  *node_set_ids,
+                             void_int  *num_nodes_per_set, 
+                             void_int  *num_df_per_set, 
+                             void_int  *node_sets_node_index,
+                             void_int  *node_sets_df_index,
+                             void_int  *node_sets_node_list, 
+                             void *node_sets_dist_fact)
+{
+  struct ex_set_specs set_specs;
+
+  set_specs.sets_ids = node_set_ids;
+  set_specs.num_entries_per_set = num_nodes_per_set;
+  set_specs.num_dist_per_set = num_df_per_set;
+  set_specs.sets_entry_index = node_sets_node_index;
+  set_specs.sets_dist_index = node_sets_df_index;
+  set_specs.sets_entry_list = node_sets_node_list;
+  set_specs.sets_extra_list = NULL;
+  set_specs.sets_dist_fact = node_sets_dist_fact;
+
+  return ex_get_concat_sets(exoid, EX_NODE_SET, &set_specs);
+}
diff --git a/exodus/cbind/src/ex_get_concat_sets.c b/exodus/cbind/src/ex_get_concat_sets.c
new file mode 100644
index 0000000..52151b7
--- /dev/null
+++ b/exodus/cbind/src/ex_get_concat_sets.c
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*!
+*
+* \undoc exgcss - ex_get_concat_sets
+*
+* reads the set ID's, set entry count array, set entry pointers
+* array, set entry list, set extra list, and set distribution factors
+* for all sets of the specified type.
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       ex_entity_type set_type                type of set
+*
+* exit conditions -
+*       struct ex_set_specs* set_specs  set specs structure
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_set_specs, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+int ex_get_concat_sets (int   exoid,
+                        ex_entity_type set_type,
+                        struct ex_set_specs* set_specs)
+{
+  int status, dimid;
+  void_int  *num_entries_per_set = set_specs->num_entries_per_set;
+  void_int  *num_dist_per_set = set_specs->num_dist_per_set;
+  void_int  *sets_entry_index = set_specs->sets_entry_index;
+  void_int  *sets_dist_index = set_specs->sets_dist_index;
+
+  void *sets_dist_fact = set_specs->sets_dist_fact; 
+
+  int num_sets, i;
+  float  *flt_dist_fact;
+  double *dbl_dist_fact;
+  char errmsg[MAX_ERR_LENGTH];
+  ex_inquiry ex_inq_val;
+
+  exerrval = 0; /* clear error code */
+
+  /* setup pointers based on set_type 
+     NOTE: there is another block that sets more stuff later ... */
+
+  if (set_type == EX_NODE_SET) {
+    ex_inq_val = EX_INQ_NODE_SETS;
+  }
+  else if (set_type == EX_EDGE_SET) {
+    ex_inq_val = EX_INQ_EDGE_SETS;
+  }
+  else if (set_type == EX_FACE_SET) {
+    ex_inq_val = EX_INQ_FACE_SETS;
+  }
+  else if (set_type == EX_SIDE_SET) {
+    ex_inq_val = EX_INQ_SIDE_SETS;
+  }
+  else if (set_type == EX_ELEM_SET) {
+    ex_inq_val = EX_INQ_ELEM_SETS;
+  }
+  else {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: invalid set type (%d)", set_type);
+    ex_err("ex_put_set_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* first check if any sets are specified */
+
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    if (status == NC_EBADDIM) {
+      sprintf(errmsg,
+	      "Warning: no %ss defined for file id %d",
+	      ex_name_of_object(set_type), exoid);
+      ex_err("ex_get_concat_sets",errmsg,exerrval);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %ss defined in file id %d", 
+	      ex_name_of_object(set_type), exoid);
+      ex_err("ex_get_concat_sets",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire how many sets have been stored */
+
+  num_sets = ex_inquire_int(exoid, ex_inq_val);
+  if (num_sets < 0) {
+    sprintf(errmsg,
+            "Error: failed to get number of %ss defined for file id %d",
+	    ex_name_of_object(set_type), exoid);
+    /* use error val from inquire */
+    ex_err("ex_get_concat_sets",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_get_ids (exoid, set_type, set_specs->sets_ids) != NC_NOERR) {
+    sprintf(errmsg,
+            "Error: failed to get %s ids for file id %d",
+	    ex_name_of_object(set_type), exoid);
+    /* use error val from inquire */
+    ex_err("ex_get_concat_sets",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    ((int64_t*)sets_entry_index)[0] = 0;
+    ((int64_t*)sets_dist_index)[0] = 0;
+  } else {
+    ((int*)sets_entry_index)[0] = 0;
+    ((int*)sets_dist_index)[0] = 0;
+  }
+
+  for (i=0; i<num_sets; i++) {
+    int set_id;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      set_id = ((int64_t*)set_specs->sets_ids)[i];
+    } else {
+      set_id = ((int*)set_specs->sets_ids)[i];
+    }
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      if (ex_get_set_param(exoid, set_type, set_id, 
+			   &(((int64_t*)num_entries_per_set)[i]),
+			   &(((int64_t*)num_dist_per_set)[i])) != NC_NOERR)
+	return(EX_FATAL); /* error will be reported by sub */
+      
+      if (i < num_sets-1) {
+	/* fill in entry and dist factor index arrays */
+	((int64_t*)sets_entry_index)[i+1] = ((int64_t*)sets_entry_index)[i]+((int64_t*)num_entries_per_set)[i];
+	((int64_t*)sets_dist_index)[i+1] = ((int64_t*)sets_dist_index)[i]+((int64_t*)num_dist_per_set)[i];
+      }
+
+      if (((int64_t*)num_entries_per_set)[i] == 0) /* NULL  set? */
+	continue;
+
+      {
+	/* Now, use ExodusII call to get sets */
+	int64_t *sets_entry_list = set_specs->sets_entry_list;
+	int64_t *sets_extra_list = set_specs->sets_extra_list;
+	int64_t *sets_extra = sets_extra_list ? &((int64_t*)sets_extra_list)[((int64_t*)sets_entry_index)[i]] : NULL;
+	status = ex_get_set(exoid, set_type, set_id,
+			    &(sets_entry_list[((int64_t*)sets_entry_index)[i]]),
+			    sets_extra);
+      }
+    } else {
+      if (ex_get_set_param(exoid, set_type, set_id, 
+			   &(((int*)num_entries_per_set)[i]),
+			   &(((int*)num_dist_per_set)[i])) != NC_NOERR)
+	return(EX_FATAL); /* error will be reported by sub */
+      
+      if (i < num_sets-1) {
+	/* fill in entry and dist factor index arrays */
+	((int*)sets_entry_index)[i+1] = ((int*)sets_entry_index)[i]+((int*)num_entries_per_set)[i];
+	((int*)sets_dist_index)[i+1] = ((int*)sets_dist_index)[i]+((int*)num_dist_per_set)[i];
+      }
+
+      if (((int*)num_entries_per_set)[i] == 0) /* NULL  set? */
+	continue;
+
+      {
+	/* Now, use ExodusII call to get sets */
+	int *sets_entry_list = set_specs->sets_entry_list;
+	int *sets_extra_list = set_specs->sets_extra_list;
+	int *sets_extra = sets_extra_list ? &((int*)sets_extra_list)[((int*)sets_entry_index)[i]] : NULL;
+	status = ex_get_set(exoid, set_type, set_id,
+			    &(sets_entry_list[((int*)sets_entry_index)[i]]),
+			    sets_extra);
+      }
+    }
+
+    if (status != NC_NOERR)
+      return(EX_FATAL); /* error will be reported by subroutine */
+    
+    /* get distribution factors for this set */
+    if (sets_dist_fact != 0) {
+      size_t df_idx;
+      size_t num_dist;
+      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	df_idx = ((int64_t*)sets_dist_index)[i];
+	num_dist = ((int64_t*)num_dist_per_set)[i];
+      } else {
+	df_idx = ((int*)sets_dist_index)[i];
+	num_dist = ((int*)num_dist_per_set)[i];
+      }
+      if (num_dist > 0) {      /* only get df if they exist */
+	if (ex_comp_ws(exoid) == sizeof(float)) {
+	  flt_dist_fact = sets_dist_fact;
+	  status = ex_get_set_dist_fact(exoid, set_type, set_id,
+					&(flt_dist_fact[df_idx]));
+	} else {
+	  dbl_dist_fact = sets_dist_fact;
+	  status = ex_get_set_dist_fact(exoid, set_type, set_id,
+					&(dbl_dist_fact[df_idx]));
+	}
+	if (status != NC_NOERR) {
+	  return(EX_FATAL); /* error will be reported by subroutine */
+	}
+      }
+    }
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_concat_side_set_node_count.c b/exodus/cbind/src/ex_get_concat_side_set_node_count.c
new file mode 100644
index 0000000..c046471
--- /dev/null
+++ b/exodus/cbind/src/ex_get_concat_side_set_node_count.c
@@ -0,0 +1,642 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+*
+* exgcssc - ex_get_concat_side_set_node_count
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*       int     *side_set_node_cnt_list returned array of number of nodes for
+*                                       side or face for all sidesets
+* revision history - 
+*
+*****************************************************************************/
+
+#include <assert.h>                     // for assert
+#include <ctype.h>                      // for toupper
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for malloc, NULL, free
+#include <string.h>                     // for strncmp, strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, EX_MSG, etc
+#include "exodusII_int.h"               // for elem_blk_parm, EX_FATAL, etc
+
+/* Generic error message for element type/node count mapping...*/
+#define EL_NODE_COUNT_ERROR sprintf(errmsg, \
+      "Error: An element of type '%s' with %d nodes is not valid.",\
+                      elem_blk_parms[i].elem_type,\
+                      elem_blk_parms[i].num_nodes_per_elem);\
+              ex_err("ex_get_side_set_node_count",errmsg,EX_MSG);\
+              ex_safe_free(elem_blk_ids); \
+              ex_safe_free(side_set_ids); \
+              ex_safe_free(ss_elem_ndx); \
+              ex_safe_free(side_set_elem_list); \
+              ex_safe_free(side_set_side_list); \
+              ex_safe_free(elem_blk_parms); \
+              return(EX_FATAL);
+/*! \endcond */
+
+/*! \undoc */
+int ex_get_concat_side_set_node_count(int exoid,
+				      int *side_set_node_cnt_list)
+{
+  size_t m;
+  int ii, i, j, iss, ioff; 
+  ex_entity_id side_set_id;
+  int  num_side_sets, num_elem_blks, num_df, ndim;
+  int64_t tot_num_elem = 0, tot_num_ss_elem = 0, side, elem;
+  void_int *elem_blk_ids       = NULL;
+  void_int *side_set_ids       = NULL;
+  void_int *ss_elem_ndx        = NULL;
+  void_int *side_set_elem_list = NULL;
+  void_int *side_set_side_list = NULL;
+  size_t elem_ctr;
+  int int_size, ids_size;
+  int status;
+  
+  struct elem_blk_parm  *elem_blk_parms = NULL;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+  /* inquire how many side sets have been stored */
+  num_side_sets = ex_inquire_int(exoid, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    sprintf(errmsg,
+           "Error: failed to get number of side sets in file id %d",exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if (num_side_sets == 0) {
+    sprintf(errmsg,
+           "Warning: no side sets defined in file id %d",exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,EX_WARN);
+    return(EX_WARN);
+  }
+
+  num_elem_blks = ex_inquire_int(exoid, EX_INQ_ELEM_BLK);
+  if (num_elem_blks < 0) {
+    sprintf(errmsg,
+           "Error: failed to get number of element blocks in file id %d",exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  tot_num_elem = ex_inquire_int(exoid, EX_INQ_ELEM);
+  if (tot_num_elem < 0) {
+    sprintf(errmsg,
+           "Error: failed to get total number of elements in file id %d",exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* get the dimensionality of the coordinates;  this is necessary to
+     distinguish between 2d TRIs and 3d TRIs */
+  ndim = ex_inquire_int(exoid, EX_INQ_DIM);
+  if (ndim < 0) {
+    sprintf(errmsg,
+           "Error: failed to get dimensionality in file id %d",exoid);
+    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  int_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+    int_size = sizeof(int64_t);
+  
+  /* Allocate space for the element block ids */
+  ids_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    ids_size = sizeof(int64_t);
+  }
+
+  if (!(elem_blk_ids=malloc(num_elem_blks*ids_size))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+            "Error: failed to allocate space for element block ids for file id %d",
+            exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+    goto error_ret;
+  }
+
+  if (ex_get_ids(exoid, EX_ELEM_BLOCK, elem_blk_ids) == -1) {
+    sprintf(errmsg,
+            "Error: failed to get element block ids in file id %d",
+            exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,EX_MSG);
+    goto error_ret;
+  } 
+
+  /* Allocate space for the element block params */
+  if (!(elem_blk_parms=malloc(num_elem_blks*sizeof(struct elem_blk_parm)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+      "Error: failed to allocate space for element block params for file id %d",
+            exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+    goto error_ret;
+  }
+
+  elem_ctr = 0;
+  for (i=0; i<num_elem_blks; i++)
+  {
+    ex_entity_id id;
+    ex_block block;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      id = ((int64_t*)elem_blk_ids)[i];
+    } else {
+      id = ((int*)elem_blk_ids)[i];
+    }
+
+    /* read in an element block parameter */
+    block.type = EX_ELEM_BLOCK;
+    block.id = id;
+
+    /* read in an element block parameter */
+    if ((ex_get_block_param (exoid, &block)) == -1) {
+      sprintf(errmsg,
+             "Error: failed to get element block  %"PRId64" parameters in file id %d",
+              block.id, exoid);
+      ex_err("ex_get_concat_side_set_node_count",errmsg,EX_MSG);
+      goto error_ret;
+    }
+
+    elem_blk_parms[i].num_elem_in_blk = block.num_entry;
+    elem_blk_parms[i].num_nodes_per_elem = block.num_nodes_per_entry;
+    elem_blk_parms[i].num_attr = block.num_attribute;
+
+    for (m=0; m < strlen(block.topology); m++) {
+      elem_blk_parms[i].elem_type[m] = toupper(block.topology[m]);
+    }
+    elem_blk_parms[i].elem_type[m] = '\0';
+
+    if (strncmp(elem_blk_parms[i].elem_type,"CIRCLE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_CIRCLE;
+      elem_blk_parms[i].num_sides = 1;
+      elem_blk_parms[i].num_nodes_per_side[0] = 1;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SPHERE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_SPHERE;
+      elem_blk_parms[i].num_sides = 1;
+        elem_blk_parms[i].num_nodes_per_side[0] = 1;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"QUAD",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_QUAD;
+      elem_blk_parms[i].num_sides = 4;
+      if (elem_blk_parms[i].num_nodes_per_elem == 4) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+        elem_blk_parms[i].num_nodes_per_side[1] = 2;
+        elem_blk_parms[i].num_nodes_per_side[2] = 2;
+        elem_blk_parms[i].num_nodes_per_side[3] = 2;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 5) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+        elem_blk_parms[i].num_nodes_per_side[1] = 2;
+        elem_blk_parms[i].num_nodes_per_side[2] = 2;
+        elem_blk_parms[i].num_nodes_per_side[3] = 2;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 9 ||
+                 elem_blk_parms[i].num_nodes_per_elem == 8) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+        elem_blk_parms[i].num_nodes_per_side[1] = 3;
+        elem_blk_parms[i].num_nodes_per_side[2] = 3;
+        elem_blk_parms[i].num_nodes_per_side[3] = 3;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TRIANGLE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_TRIANGLE;
+      if (ndim == 2) { /* 2d TRIs */
+        elem_blk_parms[i].num_sides = 3;
+        if (elem_blk_parms[i].num_nodes_per_elem == 3) {
+          elem_blk_parms[i].num_nodes_per_side[0] = 2;
+          elem_blk_parms[i].num_nodes_per_side[1] = 2;
+          elem_blk_parms[i].num_nodes_per_side[2] = 2;
+        } else if (elem_blk_parms[i].num_nodes_per_elem == 6) {
+          elem_blk_parms[i].num_nodes_per_side[0] = 3;
+          elem_blk_parms[i].num_nodes_per_side[1] = 3;
+          elem_blk_parms[i].num_nodes_per_side[2] = 3;
+        }
+      } else if (ndim == 3) { /* 3d TRIs -- triangular shell*/
+        elem_blk_parms[i].num_sides = 5; /* 2 Faces and 3 Edges */
+        if (elem_blk_parms[i].num_nodes_per_elem == 3) {
+          elem_blk_parms[i].num_nodes_per_side[0] = 3;
+          elem_blk_parms[i].num_nodes_per_side[1] = 3;
+          elem_blk_parms[i].num_nodes_per_side[2] = 2;
+          elem_blk_parms[i].num_nodes_per_side[3] = 2;
+          elem_blk_parms[i].num_nodes_per_side[4] = 2;
+        } else if (elem_blk_parms[i].num_nodes_per_elem == 6) {
+          elem_blk_parms[i].num_nodes_per_side[0] = 6;
+          elem_blk_parms[i].num_nodes_per_side[1] = 6;
+          elem_blk_parms[i].num_nodes_per_side[2] = 3;
+          elem_blk_parms[i].num_nodes_per_side[3] = 3;
+          elem_blk_parms[i].num_nodes_per_side[4] = 3;
+        } else {
+          EL_NODE_COUNT_ERROR;
+        }
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SHELL",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_SHELL;
+
+      if (elem_blk_parms[i].num_nodes_per_elem == 2) {/* KLUDGE for 2D Shells*/
+        elem_blk_parms[i].num_sides = 2; 
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+        elem_blk_parms[i].num_nodes_per_side[1] = 2;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 4) {
+        elem_blk_parms[i].num_sides = 6;  /* 2 Faces, 4 Edges */
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+        elem_blk_parms[i].num_nodes_per_side[1] = 4;
+        elem_blk_parms[i].num_nodes_per_side[2] = 2;
+        elem_blk_parms[i].num_nodes_per_side[3] = 2;
+        elem_blk_parms[i].num_nodes_per_side[4] = 2;
+        elem_blk_parms[i].num_nodes_per_side[5] = 2;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 8 ||
+                 elem_blk_parms[i].num_nodes_per_elem == 9) {
+        elem_blk_parms[i].num_sides = 6;  /* 2 Faces, 4 Edges */
+        elem_blk_parms[i].num_nodes_per_side[0] =
+          elem_blk_parms[i].num_nodes_per_elem; /* 8 or 9 */
+        elem_blk_parms[i].num_nodes_per_side[1] =
+          elem_blk_parms[i].num_nodes_per_elem; /* 8 or 9 */
+        elem_blk_parms[i].num_nodes_per_side[2] = 3;
+        elem_blk_parms[i].num_nodes_per_side[3] = 3;
+        elem_blk_parms[i].num_nodes_per_side[4] = 3;
+        elem_blk_parms[i].num_nodes_per_side[5] = 3;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"HEX",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_HEX;
+      elem_blk_parms[i].num_sides = 6;  
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 8) {  /* 8-node bricks */
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+        elem_blk_parms[i].num_nodes_per_side[1] = 4;
+        elem_blk_parms[i].num_nodes_per_side[2] = 4;
+        elem_blk_parms[i].num_nodes_per_side[3] = 4;
+        elem_blk_parms[i].num_nodes_per_side[4] = 4;
+        elem_blk_parms[i].num_nodes_per_side[5] = 4;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 9) { /* 9-node bricks */
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+        elem_blk_parms[i].num_nodes_per_side[1] = 4;
+        elem_blk_parms[i].num_nodes_per_side[2] = 4;
+        elem_blk_parms[i].num_nodes_per_side[3] = 4;
+        elem_blk_parms[i].num_nodes_per_side[4] = 4;
+        elem_blk_parms[i].num_nodes_per_side[5] = 4;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 12) { /* HEXSHELLS */
+        elem_blk_parms[i].num_nodes_per_side[0] = 6;
+        elem_blk_parms[i].num_nodes_per_side[1] = 6;
+        elem_blk_parms[i].num_nodes_per_side[2] = 6;
+        elem_blk_parms[i].num_nodes_per_side[3] = 6;
+        elem_blk_parms[i].num_nodes_per_side[4] = 4;
+        elem_blk_parms[i].num_nodes_per_side[5] = 4;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 20) { /* 20-node bricks */
+        elem_blk_parms[i].num_nodes_per_side[0] = 8;
+        elem_blk_parms[i].num_nodes_per_side[1] = 8;
+        elem_blk_parms[i].num_nodes_per_side[2] = 8;
+        elem_blk_parms[i].num_nodes_per_side[3] = 8;
+        elem_blk_parms[i].num_nodes_per_side[4] = 8;
+        elem_blk_parms[i].num_nodes_per_side[5] = 8;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 27) { /* 27-node bricks */
+        elem_blk_parms[i].num_nodes_per_side[0] = 9;
+        elem_blk_parms[i].num_nodes_per_side[1] = 9;
+        elem_blk_parms[i].num_nodes_per_side[2] = 9;
+        elem_blk_parms[i].num_nodes_per_side[3] = 9;
+        elem_blk_parms[i].num_nodes_per_side[4] = 9;
+        elem_blk_parms[i].num_nodes_per_side[5] = 9;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TETRA",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_TETRA;
+      elem_blk_parms[i].num_sides = 4;  
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 4) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+        elem_blk_parms[i].num_nodes_per_side[1] = 3;
+        elem_blk_parms[i].num_nodes_per_side[2] = 3;
+        elem_blk_parms[i].num_nodes_per_side[3] = 3;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 8) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+        elem_blk_parms[i].num_nodes_per_side[1] = 4;
+        elem_blk_parms[i].num_nodes_per_side[2] = 4;
+        elem_blk_parms[i].num_nodes_per_side[3] = 4;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 10) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 6;
+        elem_blk_parms[i].num_nodes_per_side[1] = 6;
+        elem_blk_parms[i].num_nodes_per_side[2] = 6;
+        elem_blk_parms[i].num_nodes_per_side[3] = 6;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"WEDGE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_WEDGE;
+      elem_blk_parms[i].num_sides = 5;  
+      if (elem_blk_parms[i].num_nodes_per_elem == 6) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+        elem_blk_parms[i].num_nodes_per_side[1] = 4;
+        elem_blk_parms[i].num_nodes_per_side[2] = 4;
+        elem_blk_parms[i].num_nodes_per_side[3] = 3;
+        elem_blk_parms[i].num_nodes_per_side[4] = 3;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 15){
+        elem_blk_parms[i].num_nodes_per_side[0] = 8;
+        elem_blk_parms[i].num_nodes_per_side[1] = 8;
+        elem_blk_parms[i].num_nodes_per_side[2] = 8;
+        elem_blk_parms[i].num_nodes_per_side[3] = 6;
+        elem_blk_parms[i].num_nodes_per_side[4] = 6;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"PYRAMID",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_PYRAMID;
+      elem_blk_parms[i].num_sides = 5;  
+      if (elem_blk_parms[i].num_nodes_per_elem == 5) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+        elem_blk_parms[i].num_nodes_per_side[1] = 3;
+        elem_blk_parms[i].num_nodes_per_side[2] = 3;
+        elem_blk_parms[i].num_nodes_per_side[3] = 3;
+        elem_blk_parms[i].num_nodes_per_side[4] = 4;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 13){
+        elem_blk_parms[i].num_nodes_per_side[0] = 6;
+        elem_blk_parms[i].num_nodes_per_side[1] = 6;
+        elem_blk_parms[i].num_nodes_per_side[2] = 6;
+        elem_blk_parms[i].num_nodes_per_side[3] = 6;
+        elem_blk_parms[i].num_nodes_per_side[4] = 8;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"BEAM",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_BEAM;
+      elem_blk_parms[i].num_sides = 2;  
+
+      if (elem_blk_parms[i].num_nodes_per_elem == 2) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+        elem_blk_parms[i].num_nodes_per_side[1] = 2;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 3){
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+        elem_blk_parms[i].num_nodes_per_side[1] = 3;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    else if ( (strncmp(elem_blk_parms[i].elem_type,"TRUSS",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"BAR",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"EDGE",3) == 0) )
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_TRUSS;
+      elem_blk_parms[i].num_sides = 2;  
+
+      if (elem_blk_parms[i].num_nodes_per_elem == 2) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+        elem_blk_parms[i].num_nodes_per_side[1] = 2;
+      } else if (elem_blk_parms[i].num_nodes_per_elem == 3) {
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+        elem_blk_parms[i].num_nodes_per_side[1] = 3;
+      } else {
+        EL_NODE_COUNT_ERROR;
+      }
+    }
+    /* Used for an empty block in a parallel decomposition */
+    else if (strncmp(elem_blk_parms[i].elem_type,"NULL",3) == 0) {
+      elem_blk_parms[i].elem_type_val = EX_EL_NULL_ELEMENT;
+      elem_blk_parms[i].num_sides = 0;  
+      elem_blk_parms[i].num_nodes_per_side[0] = 0;
+      elem_blk_parms[i].num_elem_in_blk = 0;
+    } else {
+      /* unsupported element type; no problem if no sides specified for
+         this element block */
+      elem_blk_parms[i].elem_type_val = EX_EL_UNK;
+      elem_blk_parms[i].num_sides = 0;  
+      elem_blk_parms[i].num_nodes_per_side[0] = 0;
+    }
+
+    elem_blk_parms[i].elem_blk_id = id;    /* save id */
+    elem_ctr += elem_blk_parms[i].num_elem_in_blk;
+    elem_blk_parms[i].elem_ctr = elem_ctr;      /* save elem number max */
+  }
+
+
+  /* Finally... Create the list of node counts for each face in the
+   * side set.
+   */
+  /* Allocate space for the sideset ids */
+  if (!(side_set_ids=malloc(num_side_sets*ids_size))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+            "Error: failed to allocate space for side set ids for file id %d",
+            exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+    goto error_ret;
+  }
+
+  if (ex_get_ids(exoid, EX_SIDE_SET, side_set_ids) == -1) {
+    sprintf(errmsg,
+            "Error: failed to get side set ids in file id %d",
+            exoid);
+    ex_err("ex_get_concat_side_set_node_count",errmsg,EX_MSG);
+    goto error_ret;
+  } 
+
+  /* Lookup index of side set id in VAR_SS_IDS array */
+  ioff = 0;
+  for (iss=0; iss<num_side_sets; iss++) {
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      side_set_id = ((int64_t*)side_set_ids)[iss];
+    } else {
+      side_set_id = ((int*)side_set_ids)[iss];
+    }
+    
+    /* First determine the  # of elements in the side set*/
+    if (int_size == sizeof(int64_t)) {
+      status = ex_get_set_param(exoid,EX_SIDE_SET, side_set_id,&tot_num_ss_elem,&num_df);
+    } else {
+      int tot, df;
+      status = ex_get_set_param(exoid,EX_SIDE_SET, side_set_id,&tot,&df);
+      tot_num_ss_elem = tot;
+      num_df = df;
+    }
+
+    if (status != EX_NOERR) {
+      sprintf(errmsg,
+	      "Error: failed to get number of elements in side set  %"PRId64" in file id %d",
+	      side_set_id, exoid);
+      ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+      goto error_ret;
+    }
+    
+    if (tot_num_ss_elem == 0)
+      continue;
+   
+    /* Allocate space for the side set element list */
+    if (!(side_set_elem_list=malloc(tot_num_ss_elem*int_size))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set element list for file id %d",
+	      exoid);
+      ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+      goto error_ret;
+    }
+    
+    /* Allocate space for the side set side list */
+    if (!(side_set_side_list=malloc(tot_num_ss_elem*int_size))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set side list for file id %d",
+	      exoid);
+      ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+      goto error_ret;
+    }
+    
+    if (ex_get_set(exoid, EX_SIDE_SET, side_set_id, 
+		   side_set_elem_list, side_set_side_list) == -1) {
+      sprintf(errmsg,
+	      "Error: failed to get side set  %"PRId64" in file id %d",
+	      side_set_id, exoid);
+      ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+      goto error_ret;
+    }
+    
+    /* Allocate space for the ss element index array */
+    if (!(ss_elem_ndx=malloc(tot_num_ss_elem*int_size))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem sort array for file id %d",
+	      exoid);
+      ex_err("ex_get_concat_side_set_node_count",errmsg,exerrval);
+      goto error_ret;
+    }
+    
+    /* Sort side set element list into index array  - non-destructive */
+    if (int_size == sizeof(int64_t)) {
+      /* Sort side set element list into index array  - non-destructive */
+      int64_t *elems = (int64_t*)ss_elem_ndx;
+      for (i=0;i<tot_num_ss_elem;i++) {
+	elems[i] = i; /* init index array to current position */
+      }
+      ex_iqsort64(side_set_elem_list, ss_elem_ndx,tot_num_ss_elem);
+    } else {
+      /* Sort side set element list into index array  - non-destructive */
+      int *elems = (int*)ss_elem_ndx;
+      for (i=0;i<tot_num_ss_elem;i++) {
+	elems[i] = i; /* init index array to current position */
+      }
+      ex_iqsort(side_set_elem_list, ss_elem_ndx,tot_num_ss_elem);
+    }
+    
+    j = 0; /* The current element block... */
+    for (ii=0;ii<tot_num_ss_elem;ii++) {
+      
+      int64_t elem_ndx;
+      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	elem_ndx = ((int64_t*)ss_elem_ndx)[ii];
+	elem     = ((int64_t*)side_set_elem_list)[elem_ndx];
+	side     = ((int64_t*)side_set_side_list)[elem_ndx]-1;
+      } else {
+	elem_ndx = ((int*)ss_elem_ndx)[ii];
+	elem     = ((int*)side_set_elem_list)[elem_ndx];
+	side     = ((int*)side_set_side_list)[elem_ndx]-1;
+      }
+      
+      /*
+       * Since the elements are being accessed in sorted, order, the
+       * block that contains the elements must progress sequentially
+       * from block 0 to block[num_elem_blks-1]. Once we find an element
+       * not in this block, find a following block that contains it...
+       */       
+      for ( ; j<num_elem_blks; j++) {
+	if (elem <= elem_blk_parms[j].elem_ctr) {
+	  break;
+	}
+      }
+      
+      if (j < num_elem_blks) {
+	assert(side < elem_blk_parms[j].num_sides);  
+	side_set_node_cnt_list[elem_ndx+ioff] = elem_blk_parms[j].num_nodes_per_side[side];
+      } else {
+	exerrval = EX_BADPARAM;
+	sprintf(errmsg,
+		"Error: Invalid element number  %"PRId64" found in side set  %"PRId64" in file %d",
+		elem, side_set_id, exoid);
+	ex_err("ex_get_concat_side_set_node_count",errmsg,EX_MSG);
+	goto error_ret;
+      }
+    }
+    ss_elem_ndx        = ex_safe_free(ss_elem_ndx);
+    side_set_elem_list = ex_safe_free(side_set_elem_list);
+    side_set_side_list = ex_safe_free(side_set_side_list);
+    ioff += tot_num_ss_elem;
+  }
+    
+  /* All done: release allocated memory */
+  ex_safe_free(elem_blk_ids);
+  ex_safe_free(side_set_ids);
+  ex_safe_free(ss_elem_ndx);
+  ex_safe_free(side_set_elem_list);
+  ex_safe_free(side_set_side_list);
+  ex_safe_free(elem_blk_parms);
+  return(EX_NOERR);
+
+ error_ret:
+  ex_safe_free(elem_blk_ids);
+  ex_safe_free(side_set_ids);
+  ex_safe_free(ss_elem_ndx);
+  ex_safe_free(side_set_elem_list);
+  ex_safe_free(side_set_side_list);
+  ex_safe_free(elem_blk_parms);
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_get_concat_side_sets.c b/exodus/cbind/src/ex_get_concat_side_sets.c
new file mode 100644
index 0000000..b81cc8b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_concat_side_sets.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+ *
+ * exgcss - ex_get_concat_side_sets
+ *
+ * entry conditions - 
+ *   input parameters:
+ *       int     exoid                   exodus file id
+ *
+ * exit conditions -
+ *       int     *side_set_ids           array of side set ids
+ *       int     *num_elem_per_set       number of elements/sides/faces  per set
+ *       int     *num_dist_per_set       number of distribution factors per set
+ *       int     *side_sets_elem_index   index array of elements into elem list
+ *       int     *side_sets_dist_index   index array of df into df list
+ *       int     *side_sets_elem_list    array of elements
+ *       int     *side_sets_side_list    array of sides
+ *       void    *side_sets_dist_fact    array of distribution factors
+ *
+ * revision history - 
+ *
+ *
+ *****************************************************************************/
+
+#include "exodusII.h"                   // for ex_set_specs, void_int, etc
+
+/*!
+ * \undoc reads the side set ID's, side set element count array, side set node count 
+ * array, side set element pointers array, side set node pointers array, side 
+ * set element list, side set node list, and side set distribution factors
+ * \deprecated Use ex_get_concat_sets()(exoid, EX_SIDE_SET, set_specs) instead
+ */
+
+int ex_get_concat_side_sets (int   exoid,
+                             void_int  *side_set_ids,
+                             void_int  *num_elem_per_set,
+                             void_int  *num_dist_per_set,
+                             void_int  *side_sets_elem_index,
+                             void_int  *side_sets_dist_index,
+                             void_int  *side_sets_elem_list,
+                             void_int  *side_sets_side_list,
+                             void *side_sets_dist_fact)
+{
+  struct ex_set_specs set_specs;
+
+  set_specs.sets_ids = side_set_ids;
+  set_specs.num_entries_per_set = num_elem_per_set;
+  set_specs.num_dist_per_set = num_dist_per_set;
+  set_specs.sets_entry_index = side_sets_elem_index;
+  set_specs.sets_dist_index = side_sets_dist_index;
+  set_specs.sets_entry_list = side_sets_elem_list;
+  set_specs.sets_extra_list = side_sets_side_list;
+  set_specs.sets_dist_fact = side_sets_dist_fact;
+
+  return ex_get_concat_sets(exoid, EX_SIDE_SET, &set_specs);
+}
diff --git a/exodus/cbind/src/ex_get_conn.c b/exodus/cbind/src/ex_get_conn.c
new file mode 100644
index 0000000..ae8cc24
--- /dev/null
+++ b/exodus/cbind/src/ex_get_conn.c
@@ -0,0 +1,297 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*!
+*
+* \undoc exgconn - exodusII read edge/face/element block connectivity
+*
+* entry conditions - 
+*   expelb must be called first to establish element block parameters.
+*   input parameters:
+*       int     exoid           exodus file id
+*       int     blk_type        block type (edge, face, element)
+*       int     blk_id          block id
+*
+* exit conditions - 
+*       int*    nodeconn        nodal connectivity array
+*       int*    edgeconn        edge connectivity array (where applicable)
+*       int*    faceconn        face connectivity array (where applicable)
+*
+*
+*/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_int, etc
+
+int ex_get_conn( int   exoid,
+                 ex_entity_type blk_type,
+                 ex_entity_id   blk_id,
+                 void_int*  nodeconn,
+                 void_int*  edgeconn,
+                 void_int*  faceconn )
+{
+  int connid  = -1;
+  int econnid = -1;
+  int fconnid = -1;
+
+  int blk_id_ndx, status;
+
+  int numnodperentdim = -1;
+  int numedgperentdim = -1;
+  int numfacperentdim = -1;
+
+  int iexit = (EX_NOERR); /* exit status */
+
+  size_t num_nodes_per_entry = 0;
+  size_t num_edges_per_entry = 0;
+  size_t num_faces_per_entry = 0;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  const char* dnumnodent = NULL;
+  const char* dnumedgent = NULL;
+  const char* dnumfacent = NULL;
+  const char* vnodeconn = NULL;
+  const char* vedgeconn = NULL;
+  const char* vfaceconn = NULL;
+
+  /* Should we warn if edgeconn or faceconn are non-NULL?
+   * No, fail silently so the same code can be used to read any type of block info.
+   * However, we will warn if edgeconn or faceconn are NULL but num_edges_per_entry
+   * or num_faces_per_entry (respectively) are positive.
+   */
+  exerrval = 0; /* clear error code */
+
+  /* Locate index of element block id in VAR_ID_EL_BLK array */
+
+  blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+  if (exerrval != 0) 
+    {
+      if (exerrval == EX_NULLENTITY)
+	{
+	  sprintf(errmsg,
+		  "Warning: no connectivity array for NULL %s %"PRId64" in file id %d",
+		  ex_name_of_object(blk_type),blk_id,exoid);
+	  ex_err("ex_get_conn",errmsg,EX_NULLENTITY);
+	  return (EX_WARN); /* no connectivity array for this element block */
+	}
+      else
+	{
+	  sprintf(errmsg,
+		  "Error: failed to locate %s id %"PRId64" in id array in file id %d",
+		  ex_name_of_object(blk_type),blk_id,exoid);
+	  ex_err("ex_get_conn",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+    }
+
+  switch (blk_type) {
+  case EX_EDGE_BLOCK:
+    dnumnodent = DIM_NUM_NOD_PER_ED(blk_id_ndx);
+    dnumedgent = 0;
+    dnumfacent = 0;
+    vnodeconn = VAR_EBCONN(blk_id_ndx);
+    vedgeconn = 0;
+    vfaceconn = 0;
+    break;
+  case EX_FACE_BLOCK:
+    dnumnodent = DIM_NUM_NOD_PER_FA(blk_id_ndx);
+    dnumedgent = 0;
+    dnumfacent = 0;
+    vnodeconn = VAR_FBCONN(blk_id_ndx);
+    vedgeconn = 0;
+    vfaceconn = 0;
+    break;
+  case EX_ELEM_BLOCK:
+    dnumnodent = DIM_NUM_NOD_PER_EL(blk_id_ndx);
+    dnumedgent = DIM_NUM_EDG_PER_EL(blk_id_ndx);
+    dnumfacent = DIM_NUM_FAC_PER_EL(blk_id_ndx);
+    vnodeconn = VAR_CONN(blk_id_ndx);
+    vedgeconn = VAR_ECONN(blk_id_ndx);
+    vfaceconn = VAR_FCONN(blk_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized block type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_get_conn",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+  /* inquire id's of previously defined dimensions  */
+
+  num_nodes_per_entry = 0;
+  if ((status = nc_inq_dimid (exoid, dnumnodent, &numnodperentdim)) != NC_NOERR) {
+    numnodperentdim = -1;
+  } else {
+    if ((status = nc_inq_dimlen(exoid, numnodperentdim, &num_nodes_per_entry)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of nodes/entity for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+  }
+
+  if ( dnumedgent ) {
+    num_edges_per_entry = 0;
+    if ((status = nc_inq_dimid(exoid, dnumedgent, &numedgperentdim)) != NC_NOERR) {
+      numedgperentdim = -1;
+    } else {
+      if ((status = nc_inq_dimlen(exoid, numedgperentdim, &num_edges_per_entry)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of edges/entry for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+    }
+  }
+
+  if ( dnumfacent ) {
+    num_faces_per_entry = 0;
+    if ((status = nc_inq_dimid(exoid, dnumfacent, &numfacperentdim)) != NC_NOERR) {
+      numfacperentdim = -1;
+    } else {
+      if ((status = nc_inq_dimlen(exoid, numfacperentdim, &num_faces_per_entry)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of faces/entry for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+    }
+  }
+
+
+  status = 0;
+  if (nodeconn && (numnodperentdim >= 0) &&
+      ((status = nc_inq_varid(exoid, vnodeconn, &connid)) != NC_NOERR))
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate node connectivity array for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+  status = 0;
+  if (edgeconn && (numedgperentdim >= 0) &&
+      ((status = nc_inq_varid (exoid, vedgeconn, &econnid)) != NC_NOERR))
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate edge connectivity array for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+  if (faceconn && (numfacperentdim >= 0) &&
+      ((status = nc_inq_varid (exoid, vfaceconn, &fconnid)) != NC_NOERR))
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate face connectivity array for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+
+  /* read in the connectivity array */
+  if ( edgeconn && num_edges_per_entry > 0) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, econnid, edgeconn);
+    } else {
+      status = nc_get_var_int(exoid, econnid, edgeconn);
+    }
+
+    if (status != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get edge connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+  }
+
+  if ( faceconn && num_faces_per_entry > 0) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, fconnid, faceconn);
+    } else {
+      status = nc_get_var_int(exoid, fconnid, faceconn);
+    }
+     
+    if (status != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get face connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+  }
+
+  if ( nodeconn && num_nodes_per_entry > 0) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, connid, nodeconn);
+    } else {
+      status = nc_get_var_int(exoid, connid, nodeconn);
+    }
+
+    if (status != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get node connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+  }
+
+  return iexit;
+}
diff --git a/exodus/cbind/src/ex_get_coord.c b/exodus/cbind/src/ex_get_coord.c
new file mode 100644
index 0000000..6dcd17f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_coord.c
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+The function ex_get_coord() reads the nodal coordinates of the
+nodes. Memory must be allocated for the coordinate arrays (\c x_coor,
+\c y_coor, and \c z_coor) before this call is made. The length of each
+of these arrays is the number of nodes in the mesh.
+
+Because the coordinates are floating point values, the application
+code must declare the arrays passed to be the appropriate type
+(\c float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return
+In case of an error, ex_get_coord() returns a negative number;
+a warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if nodal coordinates were not stored.
+
+\param[in]   exoid    exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  x_coor   Returned X coordinates of the nodes. If this is \c NULL, the
+                      X-coordinates will not be read.
+\param[out]  y_coor   Returned Y coordinates of the nodes. These are returned only if
+                      \c num_dim > 1; otherwise, pass in \c NULL. If this
+		      is \c NULL, the Y-coordinates will not be read.
+\param[out]  z_coor   Returned Z coordinates of the nodes. These are returned only if
+                      \c num_dim > 2; otherwise, pass in \c NULL. If this
+                      is \c NULL, the Z-coordinates will not be read.
+
+The following code segment will read the nodal coordinates 
+from an open exodus file :
+
+\code
+int error, exoid;
+
+double *x, *y, *z;
+
+\comment{read nodal coordinates values from database}
+x = (double *)calloc(num_nodes, sizeof(double));
+y = (double *)calloc(num_nodes, sizeof(double));
+if (num_dim >= 3)
+   z = (double *)calloc(num_nodes, sizeof(double));
+else
+   z = 0;
+
+error = ex_get_coord(exoid, x, y, z);
+
+\comment{Do the same as the previous call in three separate calls}
+error = ex_get_coord(exoid, x,    NULL, NULL);
+error = ex_get_coord(exoid, NULL, y,    NULL);
+if (num_dim >= 3)
+   error = ex_get_coord(exoid, NULL, NULL, z);
+\endcode
+
+*/
+
+int ex_get_coord (int exoid,
+                  void *x_coor,
+                  void *y_coor,
+                  void *z_coor)
+{
+  int status;
+  int coordid;
+  int coordidx, coordidy, coordidz;
+
+  int numnoddim, ndimdim;
+  size_t num_nod, num_dim, start[2], count[2], i;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;
+
+  /* inquire id's of previously defined dimensions  */
+
+  if (ex_get_dimension(exoid, DIM_NUM_DIM, "dimensions",
+		       &num_dim, &ndimdim, "ex_get_coord") != NC_NOERR) {
+    return(EX_FATAL);
+  }
+      
+  if (nc_inq_dimid (exoid, DIM_NUM_NODES, &numnoddim) != NC_NOERR)
+    {
+      /* If not found, then this file is storing 0 nodes.
+         Return immediately */
+      return (EX_NOERR);
+    }
+
+  if ((status = nc_inq_dimlen(exoid, numnoddim, &num_nod)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get number of nodes in file id %d",
+              exoid);
+      ex_err("ex_get_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  /* read in the coordinates  */
+  if (ex_large_model(exoid) == 0) {
+    if ((status = nc_inq_varid (exoid, VAR_COORD, &coordid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to locate nodal coordinates in file id %d", exoid);
+      ex_err("ex_get_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    } 
+
+    for (i=0; i<num_dim; i++) {
+      char *which;
+      start[0] = i;
+      start[1] = 0;
+
+      count[0] = 1;
+      count[1] = num_nod;
+
+      if (i == 0 && x_coor != NULL) {
+	which = "X";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_get_vara_float(exoid, coordid, start, count, x_coor);
+	} else {
+	  status = nc_get_vara_double(exoid, coordid, start, count, x_coor);
+	}
+      } 
+      else if (i == 1 && y_coor != NULL) {
+	which = "Y";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_get_vara_float(exoid, coordid, start, count, y_coor);
+	} else {
+	  status = nc_get_vara_double(exoid, coordid, start, count, y_coor);
+	}
+      } 
+      else if (i == 2 && z_coor != NULL) {
+	which = "Z";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_get_vara_float(exoid, coordid, start, count, z_coor);
+	} else {
+	  status = nc_get_vara_double(exoid, coordid, start, count, z_coor);
+	}
+      }
+
+      if (status != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get %s coord array in file id %d", which, exoid);
+	ex_err("ex_get_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+
+  } else {
+    if ((status = nc_inq_varid (exoid, VAR_COORD_X, &coordidx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate x nodal coordinates in file id %d", exoid);
+      ex_err("ex_get_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (num_dim > 1) {
+      if ((status = nc_inq_varid (exoid, VAR_COORD_Y, &coordidy)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate y nodal coordinates in file id %d", exoid);
+	ex_err("ex_get_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidy = 0;
+    }
+
+    if (num_dim > 2) {
+      if ((status = nc_inq_varid (exoid, VAR_COORD_Z, &coordidz)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate z nodal coordinates in file id %d", exoid);
+	ex_err("ex_get_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidz = 0;
+    }
+
+    /* write out the coordinates  */
+    for (i=0; i<num_dim; i++)
+      {
+        void *coor = NULL;
+        char *which = NULL;
+       
+        if (i == 0) {
+          coor = x_coor;
+          which = "X";
+          coordid = coordidx;
+        } else if (i == 1) {
+          coor = y_coor;
+          which = "Y";
+          coordid = coordidy;
+        } else if (i == 2) {
+          coor = z_coor;
+          which = "Z";
+          coordid = coordidz;
+        }
+
+        if (coor != NULL && coordid != 0) {
+          if (ex_comp_ws(exoid) == 4) {
+            status = nc_get_var_float(exoid, coordid, coor); 
+          } else {
+            status = nc_get_var_double(exoid, coordid, coor);
+          }
+          
+          if (status != NC_NOERR) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to get %s coord array in file id %d", which, exoid);
+	    ex_err("ex_get_coord",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+        }
+      }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_coord_names.c b/exodus/cbind/src/ex_get_coord_names.c
new file mode 100644
index 0000000..072b68a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_coord_names.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+
+The function ex_get_coord_names() reads the names (\p MAX_STR_LENGTH
+-characters in length) of the coordinate arrays from the
+database. Memory must be allocated for the character strings before
+this function is invoked.
+
+\return In case of an error, ex_get_coord_names() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if coordinate names were not stored.
+
+\param[in]   exoid        exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  coord_names  Returned pointer to a vector containing \c num_dim names of the nodal
+                          coordinate arrays.
+
+The following code segment will read the coordinate names from an open
+exodus file :
+
+\code
+int error, exoid;
+char *coord_names[3];
+
+for (i=0; i < num_dim; i++) {
+   coord_names[i] = (char *)calloc((MAX_STR_LENGTH+1), sizeof(char));
+}
+
+error = ex_get_coord_names (exoid, coord_names);
+\endcode
+
+*/
+
+int ex_get_coord_names (int    exoid,
+                        char **coord_names)
+{
+  int status;
+  int ndimdim, varid;
+  size_t num_dim;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;
+
+  /* inquire previously defined dimensions and variables  */
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_DIM, &ndimdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_get_coord_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, ndimdim, &num_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_get_coord_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_NAME_COOR, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: failed to locate coordinate names in file id %d",
+	    exoid);
+    ex_err("ex_get_coord_names",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+
+  /* read the coordinate names */
+  status = ex_get_names_internal(exoid, varid, num_dim, coord_names, EX_COORDINATE, "ex_get_coord_names");
+  if (status != NC_NOERR) {
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_coordinate_frames.c b/exodus/cbind/src/ex_get_coordinate_frames.c
new file mode 100644
index 0000000..ce975fd
--- /dev/null
+++ b/exodus/cbind/src/ex_get_coordinate_frames.c
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgfrm - ex_get_coordinate_frames: read coordinate frames
+*
+* entry conditions - 
+*   input parameters:
+*       int         exoid               exodus file id
+*
+* NOTE:
+*    cf_ids, pt_coordinates and tags may all be NULL, otherwise, they
+*    must have sufficient memory to store the output data. Two calls
+*    to this routine are anticipated (one to get nframes, the second
+*    to fill the data. i.e.
+*      ex_get_coordinate_frames(exoid,&nframes,0,0,0);
+*        ... allocate memory ...
+*      ex_get_coordinate_frames(exoid,&nframe,id,coords,tags);
+*
+*
+* output conditions -
+*       int*         nframes             number of coordinate frames in model
+*       const int*   cf_ids             coordinate ids
+*                                       dimension int[nframes]
+*       const void*  pt_coordinates     pointer to coordinates. 9 values per
+*                                       coordinate frame
+*                                       dimension float[9*nframes]
+*       const char*  tags               character tag for each frame.
+*                                        'r' - rectangular
+*                                        'c' - cylindrical
+*                                        's' - spherical
+*                                        dimension char[nframes]
+*
+* returns -
+*      EX_NOERR         for no error
+*      EX_FATAL         for fatal errors
+* 
+*****************************************************************************/
+
+#include <assert.h>                     // for assert
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/* -------------------- local defines --------------------------- */
+#define PROCNAME "ex_get_coordinate_frames"
+/* -------------------- end of local defines -------------------- */
+/*!
+ * Coordinate frames are stored in the database as a series of three
+ * points (defined in the basic cartesian coordinate system). The
+ * first of these points describes the origin of the new system.  The
+ * second point lies on the 3 axis (or Z axis) of the frame. The third
+ * point is in the 1-3 (xz) plane. Each coordinate frame is identified
+ * by a unique, integer coordinate ID, and by a character tag
+ * indicating whether the frame is rectangular cartesian
+ * "R", cylindrical "C, or spherical "S".
+ * Because the coordinates are floating point values,
+ * the application code must declare the arrays passed to be the
+ * appropriate type "float" or "double" to match the
+ * compute word size passed in ex_create() or
+ * ex_open().
+ * \param        exoid    exodus file id
+ * \param[in,out] nframes  if 'cf_ids' is NULL, then nframes is returned with the number
+ *                        of defined coordinate frames. Else it is the number of coordinate
+ *                        frames to read.
+ * \param[out] cf_ids The (nframes) coordinate frame Ids. If cf_ids is
+ *                    NULL, no data will be returned in this or any other array. Only
+ *                    nframes will be modified. Otherwise, space must be allocated to
+ *                    store 'nframes' integers before making this call.
+ * \param[out] pt_coordinates The (9*nframes) coordinates of the three
+ *                            points defining each coordinate axis. The first three values are
+ *                            the origin of the first frame. The next three values are the
+ *                            coordinates of a point on the 3rd axis of the first frame. The next
+ *                            three values are the coordinates of a point in the plane of the 1-3
+ *                            axis. The pattern is repeated for each frame. If 'cf_ids'
+ *                            is null, no data will be returned in this array. Otherwise, space
+ *                            must be allocated for 9*nframes floating point values. The size of
+ *                            the allocation depends upon the compute word size.
+ * \param[out] tags The (nframes) character tags associated with each
+ *                  coordinate frame. If 'cf_ids' is NULL, no data will be
+ *                  returned in this array. Otherwise, space must be allocated for
+ *                  'nframes' characters.
+ */
+
+ int ex_get_coordinate_frames( int exoid,
+			       int *nframes,
+			       void_int *cf_ids,
+			       void* pt_coordinates,
+			       char* tags)
+
+{
+  int status;
+  int dimid; /* ID of the dimension of # frames */
+  char errmsg[MAX_ERR_LENGTH];
+  int varids;                    /* variable id for the frame ids  */
+  size_t start=0;                /* start value for varputs        */
+  size_t count=0;                /* number vars to put in varput   */
+
+  /* get the dimensions */
+  assert( nframes !=NULL );
+  status = nc_inq_dimid(exoid, DIM_NUM_CFRAMES, &dimid);
+  if (status != NC_NOERR){
+    *nframes=0;
+    return EX_NOERR;
+  }
+
+  (void)nc_inq_dimlen(exoid,dimid,&count);
+  *nframes=(int)count;
+
+  if ( count==0 )
+    return (EX_NOERR);
+
+  if ( cf_ids ) {
+    if ((status = nc_inq_varid(exoid,VAR_FRAME_IDS, &varids))!= NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to read number coordinate ids from file id %d",
+              exoid);
+      ex_err(PROCNAME,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      status = nc_get_var_longlong(exoid,varids,cf_ids);
+    } else {
+      status = nc_get_var_int(exoid,varids,cf_ids);
+    }
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to read coordinate frame ids from file id %d",
+              exoid);
+      ex_err(PROCNAME,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ( tags )
+    if ( (status = nc_inq_varid(exoid,VAR_FRAME_TAGS,&varids))!= NC_NOERR  ||
+         (nc_get_vara_text(exoid,varids,&start,&count,tags) != NC_NOERR)) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to read number coordinate tags from file id %d",
+              exoid);
+      ex_err(PROCNAME,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  if (pt_coordinates ){
+    if ( (status = nc_inq_varid(exoid,VAR_FRAME_COORDS,&varids))!= NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to read number coordinate tags from file id %d",
+              exoid);
+      ex_err(PROCNAME,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (ex_comp_ws(exoid) == 4) {
+      status = nc_get_var_float(exoid,varids,pt_coordinates);
+    } else {
+      status = nc_get_var_double(exoid,varids,pt_coordinates);
+    }
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to read number coordinate tags from file id %d",
+              exoid);
+      ex_err(PROCNAME,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_eb_info_global.c b/exodus/cbind/src/ex_get_eb_info_global.c
new file mode 100644
index 0000000..b4a60ad
--- /dev/null
+++ b/exodus/cbind/src/ex_get_eb_info_global.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_eb_info_global()
+ *****************************************************************************
+ * This function retrieves the global parameters of all the element blocks
+ * associated with a geometry.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      el_blk_ids      - Pointer to vector of global element block IDs.
+ *      el_blk_cnts     - Pointer to vector of global element block counts.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_get_var_int, etc
+#include <stdio.h>                      // for sprintf
+
+
+
+int ex_get_eb_info_global(int exoid,
+                          void_int *el_blk_ids,
+                          void_int *el_blk_cnts)
+{
+  const char   *func_name="ex_get_eb_info_global";
+
+  int     varid, status;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Find the variable ID for the element block IDs */
+  if ((status = nc_inq_varid(exoid, VAR_ELBLK_IDS_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_ELBLK_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the global element block IDs */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_get_var_longlong(exoid, varid, el_blk_ids);
+  } else {
+    status = nc_get_var_int(exoid, varid, el_blk_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_ELBLK_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Find the variable ID for the element block counts */
+  if ((status = nc_inq_varid(exoid, VAR_ELBLK_CNT_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_ELBLK_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the global element block counts */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_var_longlong(exoid, varid, el_blk_cnts);
+  } else {
+    status = nc_get_var_int(exoid, varid, el_blk_cnts);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_ELBLK_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_elem_attr.c b/exodus/cbind/src/ex_get_elem_attr.c
new file mode 100644
index 0000000..22afc0e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_attr.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_attr()(exoid, EX_ELEM_BLOCK, elem_blk_id, attrib) instead
+
+The function ex_get_elem_attr() reads the attributes for an element
+block. Memory must be allocated for(\c num_attr x \c num_elem_this_blk)
+attributes before this routine is called.
+
+Because the attributes are floating point values, the application code
+must declare the array passed to be the appropriate type (\c float or
+\c double) to match the compute word size passed in ex_create() or
+ex_open().
+
+\return In case of an error, ex_get_elem_attr() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  invalid element block ID.
+  -  a warning value is returned if no attributes are stored in the file.
+
+\param[in]  exoid         exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  elem_blk_id   The element block ID.
+\param[out] attrib        Size [num_elem_this_blk*num_attr].
+                          Returned list of(\c num_attr x num_elem_this_blk) attributes for
+			  the element block, with the \c num_attr index cycling faster.
+
+
+Refer to the code example in ex_get_elem_block() for an example
+of reading the element attributes for an element block.
+ */
+
+int ex_get_elem_attr (int   exoid,
+                      ex_entity_id   elem_blk_id,
+                      void *attrib)
+{
+  return ex_get_attr( exoid, EX_ELEM_BLOCK, elem_blk_id, attrib );
+}
diff --git a/exodus/cbind/src/ex_get_elem_attr_names.c b/exodus/cbind/src/ex_get_elem_attr_names.c
new file mode 100644
index 0000000..267777c
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_attr_names.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgeat - ex_get_elem_attr_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     elem_blk_id             element block id
+*
+* exit conditions - 
+*       char*   names[]                 ptr array of attribute names
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_attr_names, etc
+
+/*!
+ * reads the attribute names for an element block
+ * \deprecated Use ex_get_attr_names()(exoid, EX_ELEM_BLOCK, elem_blk_id, names) instead
+ */
+int ex_get_elem_attr_names (int   exoid,
+                            ex_entity_id   elem_blk_id,
+                            char **names)
+{
+  return ex_get_attr_names( exoid, EX_ELEM_BLOCK,  elem_blk_id, names );
+}
diff --git a/exodus/cbind/src/ex_get_elem_blk_ids.c b/exodus/cbind/src/ex_get_elem_blk_ids.c
new file mode 100644
index 0000000..68102cf
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_blk_ids.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_ids()(exoid, EX_ELEM_BLOCK, ids) instead
+
+The function ex_get_elem_blk_ids() reads the IDs of all of the element
+blocks. Memory must be allocated for the returned array of
+({num_elem_blk}) IDs before this function is invoked. The required
+size(\c num_elem_blk) can be determined via a call to ex_inquire() or
+ex_inquire_int().
+
+\return In case of an error, ex_get_elem_blk_ids() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+
+
+\param[in]   exoid         exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  ids           Returned array of the element blocks IDs. The order of the IDs in this
+                           array reflects the sequence that the element blocks were introduced
+                           into the file.
+
+The following code segment reads all the element block IDs:
+
+\code
+int error, exoid, *idelbs, num_elem_blk;
+idelbs = (int *) calloc(num_elem_blk, sizeof(int));
+
+error = ex_get_elem_blk_ids (exoid, idelbs);
+
+\comment{Same result using non-deprecated functions}
+error = ex_get_ids (exoid, EX_ELEM_BLOCK, idelbs);
+
+\endcode
+
+
+ */
+
+int ex_get_elem_blk_ids (int  exoid,
+                         void_int *ids)
+{
+  /* ex_get_elem_blk_ids should be deprecated. */
+  return ex_get_ids( exoid, EX_ELEM_BLOCK, ids );
+}
diff --git a/exodus/cbind/src/ex_get_elem_block.c b/exodus/cbind/src/ex_get_elem_block.c
new file mode 100644
index 0000000..7ca0c08
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_block.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include "exodusII.h"
+
+/**
+\deprecated Use ex_get_block()(exoid, EX_ELEM_BLOCK, elem_blk_id, elem_type, num_elem_this_blk, num_nodes_per_elem, num_attr) instead
+
+The function ex_get_elem_block() reads the parameters used to describe
+an element block. IDs of all element blocks stored can be determined
+by calling ex_get_elem_blk_ids().
+
+\return In case of an error, ex_get_elem_block() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  element block with specified ID is not stored in the data file.
+
+\param[in]  exoid              exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  elem_blk_id        The element block ID.
+\param[out] elem_type          Returned element typetype of elements in the element block. 
+                               The maximum length of this string is \p MAX_STR_LENGTH .
+\param[out] num_elem_this_blk  Returned number of elements in the element block.
+\param[out] num_nodes_per_elem Returned number of nodes per element in the element block.
+\param[out] num_attr           Returned number of attributes per element in the element block.
+
+As an example, the following code segment will read the parameters for
+the element block with an ID of 10 and read the connectivity and
+element attributes arrays from an open exodus file :
+
+\code
+#include "exodusII.h"
+int id, error, exoid, num_el_in_blk, num_nod_per_el, num_attr, 
+    *connect;
+float *attrib;
+char elem_type[MAX_STR_LENGTH+1];
+
+\comment{read element block parameters}
+id = 10;
+
+error = ex_get_elem_block(exoid, id, elem_type, &num_el_in_blk, 
+                          &num_nod_per_elem, &num_attr);
+
+\comment{read element connectivity}
+connect = (int *) calloc(num_nod_per_el*num_el_in_blk, 
+                         sizeof(int));
+
+error = ex_get_elem_conn(exoid, id, connect);
+
+\comment{read element block attributes}
+attrib = (float *) calloc (num_attr * num_el_in_blk, sizeof(float));
+error = ex_get_elem_attr (exoid, id, attrib);
+
+\comment{Same result using non-deprecated functions}
+error = ex_get_block(exoid, EX_ELEM_BLOCK, id, elem_type, &num_el_in_blk, 
+                     &num_nod_per_elem, 0, 0, &num_attr);
+error = ex_get_conn (exoid, EX_ELEM_BLOCK, id, connect);
+error = ex_get_attr (exoid, EX_ELEM_BLOCK, id, attrib);
+
+\endcode
+
+ */
+
+int ex_get_elem_block (int   exoid,
+                       ex_entity_id   elem_blk_id,
+                       char *elem_type,
+                       void_int  *num_elem_this_blk, 
+                       void_int  *num_nodes_per_elem,
+                       void_int  *num_attr)
+
+{
+  return ex_get_block( exoid, EX_ELEM_BLOCK, elem_blk_id, elem_type,
+    num_elem_this_blk, num_nodes_per_elem, 0, 0, num_attr );
+}
diff --git a/exodus/cbind/src/ex_get_elem_cmap.c b/exodus/cbind/src/ex_get_elem_cmap.c
new file mode 100644
index 0000000..74ef3e4
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_cmap.c
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/****************************************************************************/
+/****************************************************************************/
+/* Function(s) in this file:
+ *     ex_get_elem_cmap()
+ ****************************************************************************
+ * This function retrieves an elemental communication map.
+ ****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      map_id          - The ID of the nodal communication map to retrieve.
+ *      elem_ids        - Pointer to vector for retrieval of FEM element IDs
+ *                        that make up this communication map.
+ *      side_ids        - Pointer to vector for retrieval of FEM element
+ *                        side IDs that make up this communication map.
+ *      proc_ids        - Pointer to vector for retrieval of the processors
+ *                        associated with each of the elements in this
+ *                        elemental communication map.
+ *      processor       - The processor the file being read was written for.
+ */
+/****************************************************************************/
+/****************************************************************************/
+/****************************************************************************/
+
+#include <exodusII.h>                   // for ex_err, exerrval, etc
+#include <exodusII_int.h>               // for EX_FATAL, DIM_ECNT_CMAP, etc
+#include <inttypes.h>                   // for PRId64
+#include <netcdf.h>                     // for NC_NOERR, nc_get_vara_int, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_get_elem_cmap(int  exoid,
+                     ex_entity_id  map_id,
+                     void_int *elem_ids,
+                     void_int *side_ids,
+                     void_int *proc_ids,
+                     int  processor
+                     )
+{
+  const char   *func_name="ex_get_elem_cmap";
+
+  int     map_idx, dimid, varid[3], status;
+  size_t  start[1], count[1];
+  int64_t varidx[2];
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* get the cmap information variables index */
+  if (ex_get_idx(exoid, VAR_E_COMM_INFO_IDX, varidx, processor) == -1) {
+    exerrval = -1;
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_E_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /*
+   * no need to check if the second index is -1 that is handled
+   * in ne_id_lkup, where the dimension must be looked up anyways
+   */
+
+  /* Get the index of the elemental comm map with the given ID */
+  if ((map_idx=ne_id_lkup(exoid, VAR_E_COMM_IDS, varidx, map_id)) < 0) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: failed to find elemental comm map with ID %"PRId64" in file \
+ID %d",
+            map_id, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* get the cmap data variables index for this map */
+  if (ex_get_idx(exoid, VAR_E_COMM_DATA_IDX, varidx, map_idx) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_E_COMM_DATA_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (varidx[1] == -1) {
+    /* Get the dimension of this elemental communication map */
+    if ((status = nc_inq_dimid(exoid, DIM_ECNT_CMAP, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find dimension ID for \"%s\" in file ID %d",
+              DIM_ECNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+              DIM_ECNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    varidx[1] = count[0];
+  }
+
+  /* Get the variable ID for the elemental comm map node IDs */
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_EIDS, &varid[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_EIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the elemental side set IDs */
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_SIDS, &varid[1])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_SIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the elemental comm map processor IDs */
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_PROC, &varid[2])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the elemental comm map element IDs */
+  start[0] = varidx[0];
+  count[0] = varidx[1] - varidx[0];
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, varid[0], start, count, elem_ids);
+  } else {
+    status = nc_get_vara_int(exoid, varid[0], start, count, elem_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_E_COMM_EIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the elemental comm map side IDs */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, varid[1], start, count, side_ids);
+  } else {
+    status = nc_get_vara_int(exoid, varid[1], start, count, side_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_E_COMM_SIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the elemental comm map processor IDs */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, varid[2], start, count, proc_ids);
+  } else {
+    status = nc_get_vara_int(exoid, varid[2], start, count, proc_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_E_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_elem_conn.c b/exodus/cbind/src/ex_get_elem_conn.c
new file mode 100644
index 0000000..521320a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_conn.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_conn()(exoid, EX_ELEM_BLOCK, elem_blk_id, connect, 0, 0) instead
+
+The function ex_get_elem_conn() reads the connectivity array for an
+element block. Memory must be allocated for the connectivity array(\c
+num_elem_this_blk * \c num_nodes_per_elem in length) before
+this routine is called.
+
+\return In case of an error, ex_get_elem_conn() returns a negative number; a
+warning will return a positive number.  Possible causes of errors
+include:
+  -  an element block with the specified ID is not stored in the file.
+
+\param[in]  exoid        exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  elem_blk_id  The element block ID.
+\param[out] connect      Size [num_elem_this_blk,num_nodes_per_elem].
+                         Returned connectivity array; a list of nodes (internal node 
+			 IDs; See Section LocalNodeIds) that define each element. The 
+			 node index cycles faster than the element index.
+
+Refer to the code example in ex_get_elem_block() for an example of
+reading the connectivity for an element block.
+
+ */
+
+int ex_get_elem_conn (int   exoid,
+                      ex_entity_id   elem_blk_id,
+                      void_int  *connect)
+{
+  return ex_get_conn( exoid, EX_ELEM_BLOCK, elem_blk_id, connect, 0, 0 );
+}
diff --git a/exodus/cbind/src/ex_get_elem_map.c b/exodus/cbind/src/ex_get_elem_map.c
new file mode 100644
index 0000000..7a7d29e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_map.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgem - ex_get_elem_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  element map id
+*
+* exit conditions - 
+*       int*    elem_map                element map
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_num_map, etc
+
+/*!
+ * reads the element map with specified ID
+ * \deprecated Use ex_get_num_map()(exoid, EX_ELEM_MAP, map_id, elem_map) instead
+ */
+
+int ex_get_elem_map (int   exoid,
+                     ex_entity_id   map_id,
+                     void_int  *elem_map)
+{
+  return ex_get_num_map( exoid, EX_ELEM_MAP, map_id, elem_map );
+}
diff --git a/exodus/cbind/src/ex_get_elem_num_map.c b/exodus/cbind/src/ex_get_elem_num_map.c
new file mode 100644
index 0000000..2f4abbd
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_num_map.c
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgenm - ex_get_elem_num_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*       int*    elem_map                element number map array
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_id_map()(exoid, EX_ELEM_MAP, elem_map)
+
+The function ex_get_elem_num_map() reads the optional element number
+map from the database. See Section LocalElementIds for a description of
+the element number map. If an element number map is not stored in the
+data file, a default array (1,2,3,. .. \c num_elem) is
+returned. Memory must be allocated for the element number map array
+({num_elem} in length) before this call is made.
+
+\return In case of an error, ex_get_elem_num_map() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  if an element number map is not stored, a default map and a warning value are returned.
+
+\param[in]   exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  elem_map  Returned element number map.
+
+The following code will read an element number map from an 
+open exodus file :
+\code
+int *elem_map, error, exoid;
+
+\comment{read element number map}
+elem_map = (int *) calloc(num_elem, sizeof(int));
+error = ex_get_elem_num_map (exoid, elem_map);
+
+\comment{Equivalent using non-deprecated function}
+error = ex_get_id_map(exoid, EX_ELEM_MAP, elem_map);
+\endcode
+ */
+
+int ex_get_elem_num_map (int  exoid,
+			 void_int *elem_map)
+{
+  return ex_get_id_map(exoid, EX_ELEM_MAP, elem_map);
+}
diff --git a/exodus/cbind/src/ex_get_elem_type.c b/exodus/cbind/src/ex_get_elem_type.c
new file mode 100644
index 0000000..84cbc07
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_type.c
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_elem_type()
+ *
+ *****************************************************************************
+ *   
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID to find the element type
+ *                           for.
+ *      elem_type          - The returned name of the element.
+ *
+ */    
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ATT_NAME_ELB, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_att_text, etc
+
+
+int ex_get_elem_type (int exoid,
+		      ex_entity_id elem_blk_id,
+		      char *elem_type)
+/*
+ *      Reads the element type for a specific element block
+ *           elem_type is assumed to have a length of MAX_STR_LENGTH+1
+ */
+{
+  const char   *func_name="ex_get_elem_type";
+
+  int     connid, el_blk_id_ndx, status;
+  size_t  len;
+  char    errmsg[MAX_ERR_LENGTH];
+
+/*****************************************************************************/
+
+  /* inquire id's of previously defined dimensions */
+  if ((el_blk_id_ndx=ex_id_lkup(exoid, EX_ELEM_BLOCK, elem_blk_id)) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find element block ID %"PRId64" in file %d",
+            elem_blk_id, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+  
+  if ((status = nc_inq_varid(exoid, VAR_CONN(el_blk_id_ndx), &connid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find connectivity variable in file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+   }
+  
+  /* get the element type name */
+  if ((status = nc_inq_attlen(exoid, connid, ATT_NAME_ELB, &len)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find attribute in file ID %d", exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (len > (MAX_STR_LENGTH+1)) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: Element type must be of length %d in file ID %d",
+            (int)len, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+  
+  /* Make sure the end of the string is terminated with a null character */
+  elem_type[MAX_STR_LENGTH] = '\0';
+  
+  if ((status = nc_get_att_text(exoid, connid, ATT_NAME_ELB, elem_type)) != NC_NOERR ) {
+    exerrval = status;
+    sprintf(errmsg, 
+            "Error: failed to get attribute \"%s\" in file ID %d",
+            ATT_NAME_ELB, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_elem_var.c b/exodus/cbind/src/ex_get_elem_var.c
new file mode 100644
index 0000000..a15c4e1
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_var.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_var, ex_entity_id, etc
+
+/*!
+\deprecated Use ex_get_var()(exoid, time_step, EX_ELEM_BLOCK, elem_var_index, elem_blk_id, num_elem_this_blk, elem_var_vals) instead
+
+The function ex_get_elem_var() reads the values of a single element
+variable for one element block at one time step. Memory must be
+allocated for the element variable values array before this function
+is invoked.
+
+Because element variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_get_elem_var() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  variable does not exist for the desired element block.
+  -  invalid element block.
+
+
+\param[in] exoid            exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] time_step        The time step number, as described under ex_put_time(), at
+                            which the element variable values are desired. This is essentially an
+			    index (in the time dimension) into the element variable values array
+			    stored in the database. The first time step is 1.
+
+\param[in] elem_var_index   The index of the desired element variable. The first variable 
+                            has an index of 1.
+
+\param[in] elem_blk_id      The desired element block ID.
+
+\param[in] num_elem_this_blk  The number of elements in this element block.
+
+\param[out] elem_var_vals   Returned array of \c num_elem_this_blk values of the \c elem_var_index 
+                            element variable for the element block with ID of \c elem_blk_id 
+			    at the \c time_step time step.
+
+
+As an example, the following code segment will read the \c
+var_index-th element variable at one time step stored in an exodus
+file :
+
+\code
+int *ids, num_elem_blk, error, exoid, *num_elem_in_block, 
+    step, var_ind;
+
+float *var_vals;
+
+ids = (int *) calloc(num_elem_blk, sizeof(int));
+error = ex_get_elem_blk_ids (exoid, ids);
+
+step = 1; \comment{read at the first time step}
+for (i=0; i < num_elem_blk; i++) {
+   var_vals = (float *) calloc (num_elem_in_block[i], sizeof(float));
+   error = ex_get_elem_var (exoid, step, var_ind, ids[i], 
+                            num_elem_in_block[i], var_vals);
+
+\comment{Using non-deprecated function:}
+   error = ex_get_var (exoid, step, EX_ELEM_BLOCK, var_ind, ids[i], 
+                            num_elem_in_block[i], var_vals);
+
+   free (var_values); 
+}
+\endcode
+
+*/
+
+int ex_get_elem_var (int   exoid,
+                     int   time_step,
+                     int   elem_var_index,
+                     ex_entity_id   elem_blk_id, 
+                     int64_t   num_elem_this_blk,
+                     void *elem_var_vals)
+{
+  return ex_get_var( exoid, time_step, EX_ELEM_BLOCK, elem_var_index, elem_blk_id, num_elem_this_blk, elem_var_vals );
+}
diff --git a/exodus/cbind/src/ex_get_elem_var_tab.c b/exodus/cbind/src/ex_get_elem_var_tab.c
new file mode 100644
index 0000000..31fe72b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_var_tab.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvtt - ex_get_elem_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_elem_blk            number of element blocks
+*       int     num_elem_var            number of element variables
+*
+* exit conditions - 
+*       int*    elem_var_tab            element variable truth table array
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_truth_table, etc
+
+/*!
+\deprecated Use ex_get_truth_table()(exoid, EX_ELEM_BLOCK, num_elem_blk, num_elem_var, elem_var_tab)
+
+The function ex_get_elem_var_tab() reads the exodus element variable
+truth table from the database. For a description of the truth table,
+see the usage of the function ex_put_elem_var_tab(). Memory must be
+allocated for the truth table(\c num_elem_blk \b x \c
+num_elem_var in length) before this function is invoked. If the truth
+table is not stored in the file, it will be created based on
+information in the file and then returned.
+
+\return In case of an error, ex_get_elem_var_tab() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file not initialized properly with call to ex_put_init().
+  -  the specified number of element blocks is different than the
+     number specified in a call to ex_put_init().
+  -  there are no element variables stored in the file or the
+     specified number of element variables doesn't match the number
+     specified in a call to ex_put_variable_param().
+
+\param[in]   exoid         exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]   num_elem_blk  The number of element blocks.
+\param[in]   num_elem_var  The number of element variables.
+\param[out]  elem_var_tab  Size [num_elem_blk,num_elem_var]. 
+                           Returned 2-dimensional array (with the \c num_elem_var index cycling
+			   faster) containing the element variable truth table.
+
+As an example, the following coding will read the element 
+variable truth table from an opened exodus file :
+
+\code
+int *truth_tab, num_elem_blk, num_ele_vars, error, exoid;
+
+truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), 
+                            sizeof(int));
+
+error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, 
+                             truth_tab);
+\endcode
+
+ */
+
+int ex_get_elem_var_tab (int  exoid,
+                         int  num_elem_blk,
+                         int  num_elem_var,
+                         int *elem_var_tab)
+{
+  return ex_get_truth_table(exoid, EX_ELEM_BLOCK, num_elem_blk, num_elem_var, elem_var_tab);
+}
diff --git a/exodus/cbind/src/ex_get_elem_var_time.c b/exodus/cbind/src/ex_get_elem_var_time.c
new file mode 100644
index 0000000..26c9a0a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_elem_var_time.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgevt - ex_get_elem_var_time
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     elem_var_index          element variable index
+*       int     elem_number             element number
+*       int     beg_time_step           time step number
+*       int     end_time_step           time step number
+*
+* exit conditions - 
+*       float*  elem_var_vals           array of element variable values
+*
+* revision history - 
+*   20061002 - David Thompson - Moved to ex_get_var_time.
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_var_time, etc
+
+/*!
+\deprecated Use ex_get_var_time()(exoid, EX_ELEM_BLOCK, elem_var_index, elem_number, beg_time_step, end_time_step, elem_var_vals)
+
+The function ex_get_elem_var_time() reads the values of an element
+variable for a single element through a specified number of time
+steps. Memory must be allocated for the element variable values array
+before this function is invoked.
+
+Because element variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_get_elem_var_time() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file not initialized properly with call to ex_put_init().
+  -  ex_put_elem_block() not called previously to specify
+     parameters for all element blocks.
+  -  variable does not exist for the desired element or results
+      haven't been written.
+
+\param[in] exoid             exodus file ID returned from a previous call to ex_create()
+                             or ex_open().
+\param[in] elem_var_index    The index of the desired element variable. The first variable has an
+                             index of 1.
+\param[in] elem_number       The internal ID (see Section LocalElementIds) of the desired
+                             element. The first element is 1.
+\param[in] beg_time_step     The beginning time step for which an element variable value is
+                             desired. This is not a time value but rather a time step number, as
+			     described under ex_put_time(). The first time step is 1.
+\param[in] end_time_step     The last time step for which an element variable value is desired. If
+                             negative, the last time step in the database will be used. The first
+			     time step is 1.
+\param[out]  elem_var_vals   returned array of(\c end_time_step {-} \c beg_time_step + 
+                             1) values of the \c elem_number-th element for the
+			     \c elem_var_index-th element variable.
+
+
+For example, the following coding will read the values of the \c
+var_index-th element variable for element number 2 from the first
+time step to the last time step:
+
+\code
+
+int error, exoid, num_time_steps, var_index, elem_num, 
+    beg_time, end_time;
+
+float *var_values;
+
+\comment{determine how many time steps are stored}
+num_time_steps = ex_inquire_int(exoid, EX_INQ_TIME);
+
+\comment{read an element variable through time}
+var_values = (float *) calloc (num_time_steps, sizeof(float));
+var_index = 2;
+
+elem_num = 2;
+
+beg_time =  1;
+end_time = -1;
+
+error = ex_get_elem_var_time (exoid, var_index, elem_num, 
+                              beg_time, end_time, var_values);
+
+\comment{Using non-deprecated function:}
+error = ex_get_elem_var_time (exoid, EX_ELEM_BLOCK, var_index, elem_num, 
+                              beg_time, end_time, var_values);
+\endcode
+
+ */
+
+int ex_get_elem_var_time (int   exoid,
+                          int   elem_var_index,
+                          int64_t   elem_number,
+                          int   beg_time_step, 
+                          int   end_time_step,
+                          void *elem_var_vals)
+{
+  return ex_get_var_time( exoid, EX_ELEM_BLOCK, elem_var_index, elem_number, beg_time_step, end_time_step, elem_var_vals );
+}
diff --git a/exodus/cbind/src/ex_get_entity_count_per_polyhedra.c b/exodus/cbind/src/ex_get_entity_count_per_polyhedra.c
new file mode 100644
index 0000000..525644d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_entity_count_per_polyhedra.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgecpp - ex_get_entity_count_per_polyhedra
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+ * reads in the number of entities (nodes/faces) per polyhedra
+ * (nsided/nfaced) in this element block.
+ * \param  exoid                exodus file id
+ * \param  blk_type             type of block (face, or element)
+ * \param  blk_id               block identifer
+ * \param  entity_counts        entity_per_polyhedra count array
+ */
+
+int ex_get_entity_count_per_polyhedra (int            exoid,
+				       ex_entity_type blk_type,
+				       ex_entity_id   blk_id,
+				       int     *entity_counts)
+{
+   int npeid=-1, blk_id_ndx, status;
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0; /* clear error code */
+
+   blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+   if (exerrval != 0) 
+     {
+     if (exerrval == EX_NULLENTITY)
+       {
+       sprintf(errmsg,
+         "Warning: entity_counts array not allowed for NULL %s block %"PRId64" in file id %d",
+	       ex_name_of_object(blk_type),blk_id,exoid);
+       ex_err("ex_get_entity_count_per_polyhedra",errmsg,EX_NULLENTITY);
+       return (EX_WARN);
+       }
+     else
+       {
+       sprintf(errmsg,
+         "Error: failed to locate %s block id %"PRId64" in id array in file id %d",
+         ex_name_of_object(blk_type),blk_id, exoid);
+       ex_err("ex_get_entity_count_per_polyhedra",errmsg,exerrval);
+       return (EX_FATAL);
+       }
+     }
+
+/* inquire id's of previously defined dimensions  */
+   switch (blk_type) {
+   case EX_ELEM_BLOCK:
+     status = nc_inq_varid (exoid, VAR_EBEPEC(blk_id_ndx), &npeid);
+     break;
+   case EX_FACE_BLOCK:
+     status = nc_inq_varid (exoid, VAR_FBEPEC(blk_id_ndx), &npeid);
+     break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized block type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_get_entity_count_per_polyhedra",errmsg,EX_MSG);
+    return (EX_FATAL);
+   }
+   if (status != NC_NOERR)
+   {
+     exerrval = status;
+     sprintf(errmsg,
+	     "Error: failed to locate entity_counts array for %s block %"PRId64" in file id %d",
+             ex_name_of_object(blk_type),blk_id,exoid);
+     ex_err("ex_get_entity_count_per_polyhedra",errmsg, exerrval);
+     return(EX_FATAL);
+   }
+
+   status = nc_get_var_int(exoid, npeid, entity_counts); 
+   if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+      "Error: failed to read node counts array for %s block %"PRId64" in file id %d",
+                ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_entity_count_per_polyhedra",errmsg, exerrval);
+      return(EX_FATAL);
+   }
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_glob_var_time.c b/exodus/cbind/src/ex_get_glob_var_time.c
new file mode 100644
index 0000000..0eaec26
--- /dev/null
+++ b/exodus/cbind/src/ex_get_glob_var_time.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for ex_comp_ws, EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+ The function ex_get_glob_var_time() reads the values of a
+ single global variable through a specified number of time
+ steps. Memory must be allocated for the global variable values array
+ before this function is invoked.
+
+ Because global variables are floating point values, the application
+ code must declare the array passed to be the appropriate type
+ (float or double) to match the compute word size passed in
+ ex_create() or ex_open().
+
+\return In case of an error, ex_get_glob_var_time() returns a
+ negative number; a warning will return a positive number. Possible
+ causes of errors include:
+  - data file not properly opened with call to ex_create() or ex_open()
+  - specified global variable does not exist.
+  - a warning value is returned if no global variables are stored in the file.
+
+ \param exoid           exodus file ID returned from a previous call to ex_create() or ex_open().
+
+ \param glob_var_index  The index of the desired global variable. The first variable has an index of 1.
+
+ \param beg_time_step   The beginning time step for which a global variable value is desired.
+                        This is not a time value but rather a time step number, as
+                        described under ex_put_time(). The first time step is 1.
+
+ \param end_time_step   The last time step for which a global variable value is desired. If
+                        negative, the last time step in the database will be used. The first
+                        time step is 1.
+
+ \param[out] glob_var_vals Returned array of (end_time_step - beg_time_step + 1) values
+                           for the glob_var_index$^{th}$ global variable.
+
+The following is an example of using this function:
+
+\code
+int error, exoid, num_time_steps, var_index;
+int beg_time, end_time;
+
+float *var_values;
+
+num_time_steps = ex_inquire_int(exoid, EX_INQ_TIME);
+
+var_index = 1;
+beg_time = 1;
+end_time = -1;
+
+var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+error = ex_get_glob_var_time(exoid, var_index, beg_time, 
+                             end_time, var_values);
+\endcode
+
+*/
+
+int ex_get_glob_var_time (int   exoid,
+                          int   glob_var_index,
+                          int   beg_time_step,
+                          int   end_time_step,
+                          void *glob_var_vals)
+{
+  int status;
+   int varid;
+   size_t start[2], count[2];
+   char  errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0; /* clear error code */
+
+   if (end_time_step < 0) {
+     /* user is requesting the maximum time step;  we find this out using the
+      * database inquire function to get the number of time steps
+      */
+     end_time_step = ex_inquire_int(exoid, EX_INQ_TIME);
+   }
+
+   end_time_step--;
+
+   /* read values of global variables */
+   start[0] = --beg_time_step;
+   start[1] = --glob_var_index;
+
+   count[0] = end_time_step - beg_time_step + 1;
+   count[1] = 1;
+
+   /* inquire previously defined variable */
+   if ((status = nc_inq_varid (exoid, VAR_GLO_VAR, &varid)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to locate global variables in file id %d",
+             exoid);
+     ex_err("ex_get_glob_var_time",errmsg,exerrval);
+     return (EX_WARN);
+   }
+
+   if (ex_comp_ws(exoid) == 4) {
+     status = nc_get_vara_float(exoid, varid, start, count, glob_var_vals);
+   } else {
+     status = nc_get_vara_double(exoid, varid, start, count, glob_var_vals);
+   }
+
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to get global variable %d values from file id %d",
+            glob_var_index, exoid);
+     ex_err("ex_get_glob_var_time",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_glob_vars.c b/exodus/cbind/src/ex_get_glob_vars.c
new file mode 100644
index 0000000..f2b3f51
--- /dev/null
+++ b/exodus/cbind/src/ex_get_glob_vars.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exggv - ex_get_glob_vars
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     num_glob_vars           number of global vars in file
+*
+* exit conditions - 
+*       float*  glob_var_vals           array of global variable values
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for ex_comp_ws, EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+\ingroup ResultsData 
+
+The function ex_get_glob_vars() reads the values of all the
+global variables for a single time step. Memory must be allocated for
+the global variables values array before this function is invoked.
+
+Because global variables are floating point values, the application
+code must declare the array passed to be the appropriate type
+(float or double) to match the compute word size passed in
+ex_create() or ex_open().
+
+In case of an error, ex_get_glob_vars() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+
+ - data file not properly opened with call to ex_create() or ex_open()
+ - no global variables stored in the file.
+ - a warning value is returned if no global variables are stored in the file.
+
+\param[in] exoid        exodus file ID returned from a previous call to ex_create() or ex_open().
+
+\param[in] time_step    The time step, as described under ex_put_time(), at 
+                        which the global variable values are desired. This is essentially 
+                        an index (in the time dimension) into the global variable values 
+                        array stored in the database. The first time step is 1.
+
+\param[in]  num_glob_vars The number of global variables stored in the database.
+\param[out] glob_var_vals Returned array of num_glob_vars global variable values 
+                          for the time_step'th time step.
+
+The following is an example code segment that reads all the global
+variables at one time step:
+
+\verbatim
+int num_glo_vars, error, time_step;
+float *var_values;
+
+error = ex_get_variable_param (idexo, EX_GLOBAL, &num_glo_vars);
+var_values = (float *) calloc (num_glo_vars, sizeof(float));
+error = ex_get_glob_vars (idexo, time_step, num_glo_vars, 
+                          var_values);
+\endverbatim
+ */
+
+int ex_get_glob_vars (int   exoid,
+                      int   time_step,
+                      int   num_glob_vars,
+                      void *glob_var_vals)
+{
+   int varid;
+   int status;
+   size_t start[2], count[2];
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0; /* clear error code */
+
+   /* inquire previously defined variable */
+   if ((status = nc_inq_varid (exoid, VAR_GLO_VAR, &varid)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Warning: failed to locate global variables in file id %d",
+            exoid);
+     ex_err("ex_get_glob_vars",errmsg,exerrval);
+     return (EX_WARN);
+   }
+
+   /* read values of global variables */
+   start[0] = --time_step;
+   start[1] = 0;
+
+   count[0] = 1;
+   count[1] = num_glob_vars;
+
+   if (ex_comp_ws(exoid) == 4) {
+     status = nc_get_vara_float(exoid, varid, start, count, glob_var_vals);
+   } else {
+     status = nc_get_vara_double(exoid, varid, start, count, glob_var_vals);
+   }
+
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to get global variable values from file id %d",
+            exoid);
+     ex_err("ex_get_glob_vars",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_group_id.c b/exodus/cbind/src/ex_get_group_id.c
new file mode 100644
index 0000000..83516e1
--- /dev/null
+++ b/exodus/cbind/src/ex_get_group_id.c
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2013 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include <string.h>                     // for strchr
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_FILE_ID_MASK, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/**
+ * Given an exoid and group name (NULL gets root group), return id of that group.
+ * If the name is NULL, return the root group.
+ * If the name contains "/", then the name is assumed to be a full path name
+ * and all groups in the file are searched.
+ * Otherwise, the name is assumed to be the name of a child group of exoid
+ */
+int ex_get_group_id (int parent_id, const char *group_name, int *group_id)
+{
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+   
+  exerrval = 0; /* clear error code */
+
+#if defined(NOT_NETCDF4)
+  exerrval = NC_ENOTNC4;
+  sprintf(errmsg,
+	  "Error: Group capabilities are not available in this netcdf version--not netcdf4");
+  ex_err("ex_get_group_id",errmsg,exerrval);
+  return (EX_FATAL);
+#else
+  /* See if name contains "/" indicating it is a full path name... */
+  if (group_name == NULL) {
+    /* Return root */
+    *group_id = (unsigned)parent_id & EX_FILE_ID_MASK;
+  }
+  else if (strchr(group_name, '/') == NULL) {
+    /* Local child */
+    status = nc_inq_grp_ncid(parent_id, group_name, group_id);
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: Failed to locate group with name %s as child group in file id %d",
+	      group_name, parent_id);
+      ex_err("ex_get_group_id",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else {
+    /* Full path name */
+    status = nc_inq_grp_full_ncid(parent_id, group_name, group_id);
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: Failed to locate group with full path name %s in file id %d",
+	      group_name, parent_id);
+      ex_err("ex_get_group_id",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  return (EX_NOERR);
+#endif
+}
diff --git a/exodus/cbind/src/ex_get_group_ids.c b/exodus/cbind/src/ex_get_group_ids.c
new file mode 100644
index 0000000..745b57c
--- /dev/null
+++ b/exodus/cbind/src/ex_get_group_ids.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2013 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR
+#include "netcdf.h"                     // for nc_inq_grps, NC_NOERR
+
+/**
+ * Given a file or group 'parent' id, return the number of child groups and the ids
+ * of the child groups below the parent.  If num_groups is NULL, do not return
+ * count; if group_ids is NULL, do not return ids.
+ */
+int ex_get_group_ids (int parent_id, int *num_groups, int *group_ids)
+{
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+   
+  exerrval = 0; /* clear error code */
+
+#if defined(NOT_NETCDF4)
+  exerrval = NC_ENOTNC4;
+  sprintf(errmsg,
+	  "Error: Group capabilities are not available in this netcdf version--not netcdf4");
+  ex_err("ex_get_group_ids",errmsg,exerrval);
+  return (EX_FATAL);
+#else
+  status = nc_inq_grps(parent_id, num_groups, group_ids);
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: Failed to get child group ids in file id %d",
+	    parent_id);
+    ex_err("ex_get_group_ids",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+#endif
+}
diff --git a/exodus/cbind/src/ex_get_id_map.c b/exodus/cbind/src/ex_get_id_map.c
new file mode 100644
index 0000000..30ded4f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_id_map.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2007 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnm - ex_get_id_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_type                type of map (node, edge, face, element)
+*
+* exit conditions - 
+*       int*    map                     map
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_int, etc
+
+/*
+ * reads the id map
+ */
+
+int ex_get_id_map ( int   exoid,
+		    ex_entity_type map_type,
+		    void_int*  map )
+{
+  int dimid, mapid, status;
+  size_t i;
+  size_t num_entries;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumentries;
+  const char* vmap;
+  const char* tname;
+
+  switch (map_type) {
+  case EX_NODE_MAP:
+    tname = "node";
+    dnumentries = DIM_NUM_NODES;
+    vmap = VAR_NODE_NUM_MAP;
+    break;
+  case EX_EDGE_MAP:
+    tname = "edge";
+    dnumentries = DIM_NUM_EDGE;
+    vmap = VAR_EDGE_NUM_MAP;
+    break;
+  case EX_FACE_MAP:
+    tname = "face";
+    dnumentries = DIM_NUM_FACE;
+    vmap = VAR_FACE_NUM_MAP;
+    break;
+  case EX_ELEM_MAP:
+    tname = "element";
+    dnumentries = DIM_NUM_ELEM;
+    vmap = VAR_ELEM_NUM_MAP;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg,
+	     "Error: Bad map type (%d) specified for file id %d",
+	     map_type, exoid );
+    ex_err( "ex_get_id_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+  exerrval = 0; /* clear error code */
+
+  /* See if any entries are stored in this file */
+  if (nc_inq_dimid(exoid, dnumentries,&dimid) != NC_NOERR) {
+    return (EX_NOERR);
+  }
+
+  if (nc_inq_varid (exoid, vmap, &mapid) != NC_NOERR) {
+    if ((status = nc_inq_dimlen(exoid, dimid, &num_entries)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of %ss in file id %d", tname, exoid);
+      ex_err("ex_get_id_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    
+    /* generate default map of 1..n, where n is num_entries */
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      int64_t *lmap = (int64_t*)map;
+      for (i=0; i<num_entries; i++) {
+	lmap[i] = i+1;
+      }
+    } else {
+      int *lmap = (int*)map;
+      for (i=0; i<num_entries; i++) {
+	lmap[i] = i+1;
+      }
+    }
+
+    return (EX_NOERR);
+  }
+
+  /* read in the id map  */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_var_longlong(exoid, mapid, map);
+  } else {
+    status = nc_get_var_int(exoid, mapid, map);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get %s id map in file id %d",
+	    tname, exoid);
+    ex_err("ex_get_id_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_ids.c b/exodus/cbind/src/ex_get_ids.c
new file mode 100644
index 0000000..924c9ff
--- /dev/null
+++ b/exodus/cbind/src/ex_get_ids.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*
+ *
+ *****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_int, etc
+
+/*
+ *  reads the element block ids from the database
+ */
+
+int ex_get_ids (int  exoid,
+		ex_entity_type obj_type, 
+		void_int *ids)
+{
+  int varid, status;
+  char errmsg[MAX_ERR_LENGTH];
+
+  const char* varidobj;
+
+  exerrval = 0; /* clear error code */
+
+  switch (obj_type) {
+  case EX_EDGE_BLOCK:
+    varidobj = VAR_ID_ED_BLK;
+    break;
+  case EX_FACE_BLOCK:
+    varidobj = VAR_ID_FA_BLK;
+    break;
+  case EX_ELEM_BLOCK:
+    varidobj = VAR_ID_EL_BLK;
+    break;
+  case EX_NODE_SET:
+    varidobj = VAR_NS_IDS;
+    break;
+  case EX_EDGE_SET:
+    varidobj = VAR_ES_IDS;
+    break;
+  case EX_FACE_SET:
+    varidobj = VAR_FS_IDS;
+    break;
+  case EX_SIDE_SET:
+    varidobj = VAR_SS_IDS;
+    break;
+  case EX_ELEM_SET:
+    varidobj = VAR_ELS_IDS;
+    break;
+  case EX_NODE_MAP:
+    varidobj = VAR_NM_PROP(1);
+    break;
+  case EX_EDGE_MAP:
+    varidobj = VAR_EDM_PROP(1);
+    break;
+  case EX_FACE_MAP:
+    varidobj = VAR_FAM_PROP(1);
+    break;
+  case EX_ELEM_MAP:
+    varidobj = VAR_EM_PROP(1);
+    break;
+  default:/* invalid variable type */
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid type specified in file id %d", exoid);
+    ex_err("ex_get_ids",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* Determine if there are any 'obj-type' objects */
+  if ((status = nc_inq_dimid (exoid, ex_dim_num_objects(obj_type), &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no %s defined in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_get_ids",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+
+  /* inquire id's of previously defined dimensions and variables  */
+  if ((status = nc_inq_varid(exoid, varidobj, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s ids variable in file id %d",
+	    ex_name_of_object(obj_type),exoid);
+    ex_err("ex_get_ids",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  /* read in the element block ids  */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_get_var_longlong(exoid, varid, ids);
+  } else {
+    status = nc_get_var_int(exoid, varid, ids);
+  }
+  
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to return %s ids in file id %d",
+	    ex_name_of_object(obj_type),exoid);
+    ex_err("ex_get_ids",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_info.c b/exodus/cbind/src/ex_get_info.c
new file mode 100644
index 0000000..62a666a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_info.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_trim_internal, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_text, etc
+
+/*!
+
+The function ex_get_info() reads information records from the
+database. The records are \c MAX_LINE_LENGTH-character
+strings. Memory must be allocated for the information records before
+this call is made. The number of records can be determined by invoking
+ex_inquire() or ex_inquire_int().
+
+\returns In case of an error, ex_get_info() returns a negative number;
+         a warning will return a positive number. Possible causes of errors
+         include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if no information records were stored.
+
+\param[in]  exoid   exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out] info    Returned array containing the information records.
+
+The following code segment will determine the number of information 
+records and read them from an open exodus file :
+
+\code
+int error, exoid, num_info;
+char *info[MAXINFO];
+
+\comment{read information records}
+num_info = ex_inquire_int (exoid,EX_INQ_INFO);
+for (i=0; i < num_info; i++) {
+   info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+}
+error = ex_get_info (exoid, info);
+\endcode
+
+ */
+
+int ex_get_info (int    exoid,
+                 char **info)
+{
+  int status;
+  size_t i;
+  int dimid, varid;
+  size_t num_info, start[2], count[2];
+  char  errmsg[MAX_ERR_LENGTH];
+
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined dimensions and variables  */
+  if ((status = nc_inq_dimid (rootid, DIM_NUM_INFO, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: failed to locate number of info records in file id %d",
+	    rootid);
+    ex_err("ex_get_info",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  if ((status = nc_inq_dimlen(rootid, dimid, &num_info)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of info records in file id %d",
+	    rootid);
+    ex_err("ex_get_info",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* do this only if there are any information records */
+  if (num_info > 0) {
+    if ((status = nc_inq_varid(rootid, VAR_INFO, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to locate info record data in file id %d", rootid);
+      ex_err("ex_get_info",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* read the information records */
+    for (i=0; i<num_info; i++) {
+      start[0] = i; count[0] = 1;
+      start[1] = 0; count[1] = MAX_LINE_LENGTH+1;
+
+      if ((status = nc_get_vara_text(rootid, varid, start, count, info[i])) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get info record data in file id %d", rootid);
+	ex_err("ex_get_info",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+      info[i][MAX_LINE_LENGTH] = '\0';
+      ex_trim_internal(info[i]);
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_init.c b/exodus/cbind/src/ex_get_init.c
new file mode 100644
index 0000000..28b823d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_init.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgini - ex_get_init
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*       char*   title                   title of file
+*       int*    num_dim                 number of dimensions (per node)
+*       int*    num_nodes               number of nodes
+*       int*    num_elem                number of elements
+*       int*    num_elem_blk            number of element blocks
+*       int*    num_node_sets           number of node sets
+*       int*    num_side_sets           numver of side sets
+*
+* revision history - 
+*          David Thompson  - Moved to exginix.c (exgini.c now a special case)
+*
+*
+*****************************************************************************/
+
+#include <string.h>                     // for strcpy
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_init_params, void_int, etc
+#include "exodusII_int.h"               // for EX_NOERR
+
+/*!
+
+The function ex_get_init() reads the initializationinitialization
+parameters from an opened exodus file.
+
+\return In case of an error, ex_get_init() returns a negative number;
+a warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open().
+
+\param exoid              exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out] title         Returned database title. String length may be up to \c MAX_LINE_LENGTH bytes.
+\param[out] num_dim       Returned dimensionality of the database. This is the number of coordinates per node.
+\param[out] num_nodes     Returned number of nodal points.
+\param[out] num_elem      Returned number of elements
+\param[out] num_elem_blk  Returned number of element blocks
+\param[out] num_node_sets Returned number of node sets
+\param[out] num_side_sets Returned number of side sets
+
+\sa ex_get_init_ext()
+
+The following code segment will read the initialization parameters
+from the open exodus file:
+
+\code
+int num_dim, num_nodes, num_elem, num_elem_blk,
+    num_node_sets, num_side_sets, error, exoid;
+
+char title[MAX_LINE_LENGTH+1];
+
+\comment{read database parameters}
+error = ex_get_init (exoid, title, &num_dim, &num_nodes, 
+                     &num_elem, &num_elem_blk, &num_node_sets, &num_side_sets);
+\endcode
+
+*/
+
+int ex_get_init (int   exoid,
+                 char *title,
+                 void_int  *num_dim,
+                 void_int  *num_nodes,
+                 void_int  *num_elem, 
+                 void_int  *num_elem_blk,
+                 void_int  *num_node_sets,
+                 void_int  *num_side_sets)
+{
+  ex_init_params info;
+  int errval;
+
+  info.title[0] = '\0';
+  errval = ex_get_init_ext( exoid, &info );
+  if ( errval < 0 ) {
+    return errval;
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    int64_t *n_dim 	 = num_dim;
+    int64_t *n_nodes 	 = num_nodes;
+    int64_t *n_elem  	 = num_elem;
+    int64_t *n_elem_blk  = num_elem_blk;
+    int64_t *n_node_sets = num_node_sets;
+    int64_t *n_side_sets = num_side_sets;
+
+    *n_dim       = info.num_dim;
+    *n_nodes     = info.num_nodes;
+    *n_elem      = info.num_elem;
+    *n_elem_blk  = info.num_elem_blk;
+    *n_node_sets = info.num_node_sets;
+    *n_side_sets = info.num_side_sets;
+  } else {
+    int *n_dim 	     = num_dim;
+    int *n_nodes     = num_nodes;
+    int *n_elem      = num_elem;
+    int *n_elem_blk  = num_elem_blk;
+    int *n_node_sets = num_node_sets;
+    int *n_side_sets = num_side_sets;
+
+    *n_dim       = info.num_dim;
+    *n_nodes     = info.num_nodes;
+    *n_elem      = info.num_elem;
+    *n_elem_blk  = info.num_elem_blk;
+    *n_node_sets = info.num_node_sets;
+    *n_side_sets = info.num_side_sets;
+  }
+  strcpy( title, info.title );
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_init_ext.c b/exodus/cbind/src/ex_get_init_ext.c
new file mode 100644
index 0000000..b9aa49a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_init_ext.c
@@ -0,0 +1,189 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/*****************************************************************************
+ *
+ * exgini - ex_get_init
+ *
+ * entry conditions -
+ *   input parameters:
+ *       int             exoid           exodus file id
+ *
+ * exit conditions -
+ *       ex_init_params* info            parameter information
+ *
+ * revision history -
+ *
+ *
+ *****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <string.h>                     // for strncpy
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_init_params, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_att_text, etc
+
+/* Used to reduce repeated code below */
+static int64_t ex_get_dim_value(int exoid, const char *name, const char *dimension_name,
+				int dimension, int64_t *value)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+
+  if ((status = nc_inq_dimid (exoid, dimension_name, &dimension)) != NC_NOERR) {
+    /* optional and default to zero. */
+    *value = 0;
+  } else {
+    size_t tmp;
+    if ((status = nc_inq_dimlen(exoid, dimension, &tmp)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg, "Error: failed to get number of %s in file id %d",
+	      name, exoid);
+      ex_err("ex_get_init",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    *value = tmp;
+  }
+  return EX_NOERR;
+}
+
+/*!
+ * reads the initialization parameters from an opened EXODUS II file
+ * \param exoid exodus file id
+ * \param[out] info #ex_init_params structure containing metadata for mesh.
+ * \sa ex_get_init()
+ */
+
+int ex_get_init_ext (int   exoid,
+                     ex_init_params *info)
+{
+  int dimid;
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+  size_t title_len;
+  nc_type title_type;
+
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  exerrval = 0; /* clear error code */
+
+  info->num_dim = 0;
+  info->num_nodes = 0;
+  info->num_edge = 0;
+  info->num_edge_blk = 0;
+  info->num_face = 0;
+  info->num_face_blk = 0;
+  info->num_elem = 0;
+  info->num_elem_blk = 0;
+  info->num_node_sets = 0;
+  info->num_edge_sets = 0;
+  info->num_face_sets = 0;
+  info->num_side_sets = 0;
+  info->num_elem_sets = 0;
+  info->num_node_maps = 0;
+  info->num_edge_maps = 0;
+  info->num_face_maps = 0;
+  info->num_elem_maps = 0;
+
+  {
+    size_t tmp;
+    status = ex_get_dimension(exoid, DIM_NUM_DIM, "dimensions", &tmp, &dimid, "ex_get_init_ext");
+    if (status != NC_NOERR) return status;
+    info->num_dim = tmp;
+  }
+
+  /* Handle case with zero-nodes */
+  if (ex_get_dim_value(exoid,   "nodes",DIM_NUM_NODES,dimid,&info->num_nodes) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,   "edges", DIM_NUM_EDGE,dimid,&info->num_edge) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,   "faces", DIM_NUM_FACE,dimid,&info->num_face) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"elements", DIM_NUM_ELEM,dimid,&info->num_elem) != EX_NOERR) return EX_FATAL;
+
+  if (ex_get_dim_value(exoid,"element blocks", DIM_NUM_EL_BLK,dimid,&info->num_elem_blk) != EX_NOERR) return EX_FATAL;
+  if (info->num_elem_blk == 0 && info->num_elem > 0) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate number of element blocks in file id %d",
+            exoid);
+    ex_err("ex_get_init_ext",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_get_dim_value(exoid,"node sets", DIM_NUM_NS,dimid,&info->num_node_sets) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"edge sets", DIM_NUM_ES,dimid,&info->num_edge_sets) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"face sets", DIM_NUM_FS,dimid,&info->num_face_sets) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"side sets", DIM_NUM_SS,dimid,&info->num_side_sets) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"elem sets",DIM_NUM_ELS,dimid,&info->num_elem_sets) != EX_NOERR) return EX_FATAL;
+
+  if (ex_get_dim_value(exoid,"node maps", DIM_NUM_NM,dimid,&info->num_node_maps) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"edge maps",DIM_NUM_EDM,dimid,&info->num_edge_maps) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"face maps",DIM_NUM_FAM,dimid,&info->num_face_maps) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"elem maps", DIM_NUM_EM,dimid,&info->num_elem_maps) != EX_NOERR) return EX_FATAL;
+
+  /* Edge and face blocks are also optional (for backwards compatability) */
+  if (ex_get_dim_value(exoid,"edge blocks",DIM_NUM_ED_BLK,dimid,&info->num_edge_blk) != EX_NOERR) return EX_FATAL;
+  if (ex_get_dim_value(exoid,"face blocks",DIM_NUM_FA_BLK,dimid,&info->num_face_blk) != EX_NOERR) return EX_FATAL;
+
+  if ((status = nc_inq_att(rootid, NC_GLOBAL, ATT_TITLE, &title_type, &title_len)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to inquire title in file id %d", rootid);
+    ex_err("ex_get_init_ext",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check title length to avoid overrunning clients memory space; include trailing null */
+  if (title_len > MAX_LINE_LENGTH) {
+    char *title = malloc(title_len+1);
+    if ((status = nc_get_att_text(rootid, NC_GLOBAL, ATT_TITLE, title)) == NC_NOERR) {
+      strncpy(info->title, title, MAX_LINE_LENGTH+1);
+      info->title[MAX_LINE_LENGTH] = '\0';
+    }
+    free(title);
+  } else {
+    status = nc_get_att_text(rootid, NC_GLOBAL, ATT_TITLE, info->title);
+    info->title[title_len] = '\0';
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get title in file id %d", rootid);
+    ex_err("ex_get_init_ext",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_init_global.c b/exodus/cbind/src/ex_get_init_global.c
new file mode 100644
index 0000000..ac7f2ef
--- /dev/null
+++ b/exodus/cbind/src/ex_get_init_global.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_init_global()
+ *****************************************************************************
+ * This function reads the global initial information.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      num_nodes_g     - The number of global FEM nodes. This is output as
+ *                        a NetCDF variable.
+ *      num_elems_g     - The number of global FEM elements. This is output
+ *                        as a NetCDF variable.
+ *      num_elem_blks_g - The number of global element blocks. This is output
+ *                        as a NetCDF dimension.
+ *      num_node_sets_g - The number of global node sets. This is output as
+ *                        a NetCDF dimension.
+ *      num_side_sets_g - The number of global side sets. This is output as
+ *                        a NetCDF dimension.
+ */    
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_dimid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, void_int, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+
+
+
+int ex_get_init_global(int   exoid,
+                       void_int  *num_nodes_g,
+                       void_int  *num_elems_g,
+                       void_int  *num_elem_blks_g,
+                       void_int  *num_node_sets_g,
+                       void_int  *num_side_sets_g
+                       )
+{
+  const char  *func_name="ex_get_init_global";
+  int    dimid, status;
+  size_t nng, neg, nebg, nnsg, nssg;
+
+  char    errmsg[MAX_ERR_LENGTH];
+  /*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error flag */
+
+  /* Check the file version information */
+  if ((dimid=ne_check_file_version(exoid)) != EX_NOERR) return (dimid);
+
+  /* Get the dimension ID for the number of global FEM nodes */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_NODES_GLOBAL, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_NODES_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    
+    return (EX_FATAL);
+  }
+
+  /* Get the value of the number of global FEM nodes */
+  if ((status = nc_inq_dimlen(exoid, dimid, &nng)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find length of dimension \"%s\" in file ID %d",
+            DIM_NUM_NODES_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    
+    return (EX_FATAL);
+  }
+
+  /* Get the dimension ID for the number of global FEM elements */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_ELEMS_GLOBAL, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_ELEMS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    
+    return (EX_FATAL);
+  }
+
+  /* Get the value of the number of global FEM elements */
+  if ((status = nc_inq_dimlen(exoid, dimid, &neg)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find length of dimension \"%s\" in file ID %d",
+            DIM_NUM_ELEMS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    
+    return (EX_FATAL);
+  }
+
+  /* Get the dimension ID for the number of global element blocks */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_ELBLK_GLOBAL, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_ELBLK_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    
+    return (EX_FATAL);
+  }
+
+  /* Get the value of the number of global element blocks */
+  if ((status = nc_inq_dimlen(exoid, dimid, &nebg)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find length of dimension \"%s\" in file ID %d",
+	    DIM_NUM_ELBLK_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    
+    return (EX_FATAL);
+  }
+
+  /* Get the dimension ID for the number of global node sets */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_NS_GLOBAL, &dimid)) != NC_NOERR) {
+    nnsg = 0;
+  }
+  else {
+    /* Get the value of the number of global node sets */
+    if ((status = nc_inq_dimlen(exoid, dimid, &nnsg)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find length of dimension \"%s\" in file ID %d",
+	      DIM_NUM_NS_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+    
+      return (EX_FATAL);
+    }
+  }
+
+  /* Get the dimension ID for the number of global side sets */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_SS_GLOBAL, &dimid)) != NC_NOERR) {
+    nssg = 0;
+  }
+  else {
+    /* Get the value of the number of global side sets */
+    if ((status = nc_inq_dimlen(exoid, dimid, &nssg)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find length of dimension \"%s\" in file ID %d",
+	      DIM_NUM_SS_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      
+      return (EX_FATAL);
+    }
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    *(int64_t*)num_nodes_g = nng;
+    *(int64_t*)num_elems_g = neg;
+    *(int64_t*)num_elem_blks_g = nebg;
+    *(int64_t*)num_node_sets_g = nnsg;
+    *(int64_t*)num_side_sets_g = nssg;
+  } else {
+    *(int*)num_nodes_g = nng;
+    *(int*)num_elems_g = neg;
+    *(int*)num_elem_blks_g = nebg;
+    *(int*)num_node_sets_g = nnsg;
+    *(int*)num_side_sets_g = nssg;
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_init_info.c b/exodus/cbind/src/ex_get_init_info.c
new file mode 100644
index 0000000..202768a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_init_info.c
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ * 	ex_get_init_info()
+ *****************************************************************************
+ * This function reads information about the processors for which the
+ * decomposition was performed.
+ *****************************************************************************
+ * Variable Index:
+ *	exoid		  - The NetCDF ID of an already open NemesisI file.
+ *	num_proc	  - The number of processors in the decomposition.
+ *	num_proc_in_f	  - The number of processors the file contains
+ *			    information for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, EX_MSG, etc
+#include <exodusII_int.h>               // for EX_FATAL, DIM_NUM_PROCS, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_dimid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+
+
+
+int ex_get_init_info(int   exoid,
+                     int  *num_proc,
+                     int  *num_proc_in_f,
+                     char *ftype
+		     )
+{
+  const char *func_name="ex_get_init_info";
+
+  int   dimid, status;
+  size_t ltempsv;
+
+  char   errmsg[MAX_ERR_LENGTH];
+  /*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: failed to get file type for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_PROCS, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_PROCS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the value of the number of processors */
+  if ((status = nc_inq_dimlen(exoid, dimid, &ltempsv)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find length of dimension \"%s\" in file ID %d",
+            DIM_NUM_PROCS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+  *num_proc = ltempsv;
+
+  /* Get the dimension ID of processors that have info in this file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_PROCS_F, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_PROCS_F, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the value of the number of processors that have info in this file */
+  if ((status = nc_inq_dimlen(exoid, dimid, &ltempsv)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find length of dimension \"%s\" in file ID %d",
+            DIM_NUM_PROCS_F, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+  *num_proc_in_f = ltempsv;
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_loadbal_param.c b/exodus/cbind/src/ex_get_loadbal_param.c
new file mode 100644
index 0000000..fb92b7b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_loadbal_param.c
@@ -0,0 +1,564 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *      ex_get_loadbal_param()
+ *****************************************************************************
+ * This function retrieves the load balance parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid             - The NetCDF ID of an already open NemesisI file.
+ *      num_int_nodes    - The number of internal FEM nodes.
+ *      num_bor_nodes    - The number of border FEM nodes.
+ *      num_ext_nodes    - The number of external FEM nodes.
+ *      num_int_elems    - The number of internal FEM elements.
+ *      num_bor_elems    - The number of border FEM elements.
+ *      num_node_cmaps   - The number of nodal communication maps.
+ *      num_elem_cmaps   - The number of elemental communication maps.
+ *      processor        - The processor the file being read was written for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_dimid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_BOR_ELEMS, etc
+
+
+
+int ex_get_loadbal_param(int   exoid,
+                         void_int  *num_int_nodes,
+                         void_int  *num_bor_nodes,
+                         void_int  *num_ext_nodes,
+                         void_int  *num_int_elems,
+                         void_int  *num_bor_elems,
+                         void_int  *num_node_cmaps,
+                         void_int  *num_elem_cmaps,
+                         int   processor
+                         )
+{
+  const char  *func_name="ex_get_loadbal_param";
+
+  int     dimid, varid, status;
+  size_t  start[1];
+  size_t  nin, nbn, nen, nie, nbe, nncm, necm;
+  int64_t varidx[2];
+  char    ftype[2];
+  int     nmstat;
+
+  char   errmsg[MAX_ERR_LENGTH];
+  /*-----------------------------Execution begins-----------------------------*/
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    *(int64_t*)num_int_nodes = 0;
+    *(int64_t*)num_bor_nodes = 0;
+    *(int64_t*)num_ext_nodes = 0;
+    *(int64_t*)num_int_elems = 0;
+    *(int64_t*)num_bor_elems = 0;
+    *(int64_t*)num_node_cmaps = 0;
+    *(int64_t*)num_elem_cmaps = 0;
+  } else {
+    *(int*)num_int_nodes = 0;
+    *(int*)num_bor_nodes = 0;
+    *(int*)num_ext_nodes = 0;
+    *(int*)num_int_elems = 0;
+    *(int*)num_bor_elems = 0;
+    *(int*)num_node_cmaps = 0;
+    *(int*)num_elem_cmaps = 0;
+  }
+
+  exerrval = 0; /* clear error code */
+
+  /* Check the file version information */
+  if ((dimid=ne_check_file_version(exoid)) != EX_NOERR) return (dimid);
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: unable to find file type for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the status for this node map */
+  if ((status = nc_inq_varid(exoid, VAR_INT_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get status for \"%s\" from file ID %d",
+	    VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    if (ex_get_idx(exoid, VAR_NODE_MAP_INT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find index variable, \"%s\", in file ID %d",
+	      VAR_NODE_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension of the internal node map */
+    if (varidx[1] == -1) {
+      /* Get the dimension ID for the number of internal nodes */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_INT_NODES, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find dimension ID for \"%s\" in file ID %d",
+		DIM_NUM_INT_NODES, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /*
+       * Get the value of the dimension representing the total number of
+       * internal FEM nodes.
+       */
+      if ((status = nc_inq_dimlen(exoid, dimid, &nin)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+		DIM_NUM_INT_NODES, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      varidx[1] = nin;
+    }  /* End "if (varidx[1] = -1)" */
+
+    /* now get the number of nodes */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      *(int64_t*)num_int_nodes = varidx[1] - varidx[0];
+    } else {
+      *(int*)num_int_nodes = varidx[1] - varidx[0];
+    }
+  }
+
+  /* Get the status for this node map */
+  if ((status = nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find variable ID for \"%s\" from file ID %d",
+	    VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get status for \"%s\" from file ID %d",
+	    VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    if (ex_get_idx(exoid, VAR_NODE_MAP_BOR_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find index variable, \"%s\", in file ID %d",
+	      VAR_NODE_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension of the border node map */
+    if (varidx[1] == -1) {
+      /* Get the dimension ID for the number of border nodes */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_BOR_NODES, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find dimension ID for \"%s\" in file ID %d",
+		DIM_NUM_BOR_NODES, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /*
+       * Get the value of the dimension representing the number of border
+       * FEM nodes.
+       */
+      if ((status = nc_inq_dimlen(exoid, dimid, &nbn)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+		DIM_NUM_BOR_NODES, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      varidx[1] = nbn;
+    }  /* End "if (varidx[1] == -1)" */
+
+    /* now calculate the number of nodes */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      *(int64_t*)num_bor_nodes = varidx[1] - varidx[0];
+    } else {
+      *(int*)num_bor_nodes = varidx[1] - varidx[0];
+    }
+  }
+
+  /* Get the status for this node map */
+  if ((status = nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find variable ID for \"%s\" from file ID %d",
+	    VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get status for \"%s\" from file ID %d",
+	    VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    if (ex_get_idx(exoid, VAR_NODE_MAP_EXT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find index variable, \"%s\", in file ID %d",
+	      VAR_NODE_MAP_EXT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension of the external node map */
+    if (varidx[1] == -1) {
+      /* Get the dimension ID for the number of external nodes */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_EXT_NODES, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find dimension ID for \"%s\" in file ID %d",
+		DIM_NUM_EXT_NODES, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /*
+       * Get the value of the dimension representing the number of external
+       * FEM nodes.
+       */
+      if ((status = nc_inq_dimlen(exoid, dimid, &nen)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+		DIM_NUM_EXT_NODES, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+      /* set the end value for the node map */
+      varidx[1] = nen;
+    }  /* End "if (varidx[1] == -1)" */
+
+    /* now get the number of nodes */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      *(int64_t*)num_ext_nodes = varidx[1] - varidx[0];
+    } else {
+      *(int*)num_ext_nodes = varidx[1] - varidx[0];
+    }
+  }
+
+  /* Get the status for this element map */
+  if ((status = nc_inq_varid(exoid, VAR_INT_E_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find variable ID for \"%s\" from file ID %d",
+	    VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get status for \"%s\" from file ID %d",
+	    VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    if (ex_get_idx(exoid, VAR_ELEM_MAP_INT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find index variable, \"%s\", in file ID %d",
+	      VAR_ELEM_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension of the internal element map */
+    if (varidx[1] == -1) {
+      /* Get the dimension ID for the number of internal elements */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_INT_ELEMS, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find dimension ID for \"%s\" from file ID %d",
+		DIM_NUM_INT_ELEMS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /*
+       * Get the value of the dimension representing the number of internal
+       * FEM elements.
+       */
+      if ((status = nc_inq_dimlen(exoid, dimid, &nie)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimesion \"%s\" in file ID %d",
+		DIM_NUM_INT_ELEMS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      varidx[1] = nie;
+    }  /* End "if (varidx[1] == -1)" */
+
+    /* now get the number of elements */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      *(int64_t*)num_int_elems = varidx[1] - varidx[0];
+    } else {
+      *(int*)num_int_elems = varidx[1] - varidx[0];
+    }
+  }
+
+  /* Get the status for this element map */
+  if ((status = nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find variable ID for \"%s\" from file ID %d",
+	    VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get status for \"%s\" from file ID %d",
+	    VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    if (ex_get_idx(exoid, VAR_ELEM_MAP_BOR_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find index variable, \"%s\", in file ID %d",
+	      VAR_ELEM_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension of the border element map */
+    if (varidx[1] == -1) {
+      /* Get the dimension ID for the number of border elements */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_BOR_ELEMS, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find dimension ID for \"%s\" from file ID %d",
+		DIM_NUM_BOR_ELEMS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+
+	return (EX_FATAL);
+      }
+
+      /*
+       * Get the value of the dimension representing the number of border
+       * FEM elements.
+       */
+      if ((status = nc_inq_dimlen(exoid, dimid, &nbe)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimesion \"%s\" in file ID %d",
+		DIM_NUM_BOR_ELEMS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      varidx[1] = nbe;
+    }  /* End "if (varidx[1] == -1)" */
+
+    /* now get the number of nodes */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      *(int64_t*)num_bor_elems = varidx[1] - varidx[0];
+    } else {
+      *(int*)num_bor_elems = varidx[1] - varidx[0];
+    }
+  } /* End "if (nmstat == 1)" */
+
+  if (ex_get_idx(exoid, VAR_N_COMM_INFO_IDX, varidx, processor) == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find index variable, \"%s\", in file ID %d",
+	    VAR_N_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* check if I need to get the dimension of the nodal comm map */
+  if (varidx[1] == -1) {
+    /* Get the nodal comm map information */
+    if ((status = nc_inq_dimid(exoid, DIM_NUM_N_CMAPS, &dimid)) != NC_NOERR)
+      varidx[1] = 0;
+    else {
+      if ((status = nc_inq_dimlen(exoid, dimid, &nncm)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+		DIM_NUM_N_CMAPS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+	return (EX_FATAL);
+      }
+      /* set the end value for the node map */
+      varidx[1] = nncm;
+    }
+  }  /* End "if (varidx[1] == -1)" */
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      *(int64_t*)num_node_cmaps = varidx[1] - varidx[0];
+    } else {
+      *(int*)num_node_cmaps = varidx[1] - varidx[0];
+    }
+
+  if (ex_get_idx(exoid, VAR_E_COMM_INFO_IDX, varidx, processor) == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find index variable, \"%s\", in file ID %d",
+	    VAR_E_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* check if I need to get the dimension of the elemental comm map */
+  if (varidx[1] == -1) {
+    /* Get the elemental comm map information */
+    if ((status = nc_inq_dimid(exoid, DIM_NUM_E_CMAPS, &dimid)) != NC_NOERR)
+      varidx[1] = 0;
+    else {
+      if ((status = nc_inq_dimlen(exoid, dimid, &necm)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+		DIM_NUM_E_CMAPS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      /* set the end value for the node map */
+      varidx[1] = necm;
+    }
+  }  /* End "if (varidx[1] == -1)" */
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    *(int64_t*)num_elem_cmaps = varidx[1] - varidx[0];
+  } else {
+    *(int*)num_elem_cmaps = varidx[1] - varidx[0];
+  }
+  
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_map.c b/exodus/cbind/src/ex_get_map.c
new file mode 100644
index 0000000..7976630
--- /dev/null
+++ b/exodus/cbind/src/ex_get_map.c
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_NOERR, EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_int, etc
+
+/*!
+\deprecated Use ex_get_num_map() instead.
+
+The function ex_get_map() reads the element order map
+from the database. See #ElementOrderMap for a description of the
+element order map. If an element order map is not stored in the data
+file, a default array (1,2,3,. .. \c num_elem) is returned. Memory
+must be allocated for the element map array ({num_elem} in length)
+before this call is made.
+
+\return In case of an error, ex_get_map() returns a negative number; a
+warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  if an element order map is not stored, a default map and a
+     warning value are returned.
+
+\param[in]  exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out] elem_map   Returned element order map.
+
+The following code will read an element order map from an open exodus
+file :
+
+\code
+int *elem_map, error, exoid;
+
+\comment{read element order map}
+elem_map = (int *)calloc(num_elem, sizeof(int));
+
+error = ex_get_map(exoid, elem_map);
+\endcode
+
+ */
+
+int ex_get_map (int  exoid,
+                void_int *elem_map)
+{
+   int numelemdim, mapid, status;
+   size_t num_elem, i;
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0; /* clear error code */
+
+/* inquire id's of previously defined dimensions and variables  */
+
+   /* See if file contains any elements...*/
+   if ((status = nc_inq_dimid (exoid, DIM_NUM_ELEM, &numelemdim)) != NC_NOERR) {
+     return (EX_NOERR);
+   }
+
+   if ((status = nc_inq_dimlen(exoid, numelemdim, &num_elem)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to get number of elements in file id %d",
+             exoid);
+     ex_err("ex_get_map",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+
+   if (nc_inq_varid(exoid, VAR_MAP, &mapid) != NC_NOERR) {
+     /* generate default map of 1..n, where n is num_elem */
+     if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+       int64_t *lmap = (int64_t*)elem_map;
+       for (i=0; i<num_elem; i++) {
+	 lmap[i] = i+1;
+       }
+     } else {
+       int *lmap = (int*)elem_map;
+       for (i=0; i<num_elem; i++) {
+	 lmap[i] = i+1;
+       }
+     }
+
+     return (EX_NOERR);
+   }
+
+   /* read in the element order map  */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_var_longlong(exoid, mapid, elem_map);
+  } else {
+    status = nc_get_var_int(exoid, mapid, elem_map);
+  }
+
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to get element order map in file id %d",
+             exoid);
+     ex_err("ex_get_map",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   return(EX_NOERR);
+
+}
diff --git a/exodus/cbind/src/ex_get_map_param.c b/exodus/cbind/src/ex_get_map_param.c
new file mode 100644
index 0000000..c8e86fb
--- /dev/null
+++ b/exodus/cbind/src/ex_get_map_param.c
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgmp - ex_get_map_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*       int*    num_node_maps           number of node maps
+*       int*    num_elem_maps           number of element maps
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_EM, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*
+ * reads the number of node and element maps
+ */
+
+int ex_get_map_param (int   exoid,
+                      int  *num_node_maps,
+                      int  *num_elem_maps)
+{
+  int status;
+  int dimid;
+  size_t lnum_node_maps, lnum_elem_maps;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+
+  /* node maps are optional */
+  if (nc_inq_dimid(exoid, DIM_NUM_NM, &dimid) != NC_NOERR) {
+    *num_node_maps = 0;
+  } else {
+    if ((status = nc_inq_dimlen(exoid, dimid, &lnum_node_maps)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get number of node maps in file id %d",
+		  exoid);
+	  ex_err("ex_get_map_param",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+	*num_node_maps = lnum_node_maps;
+	}
+
+    /* element maps are optional */
+    if (nc_inq_dimid(exoid, DIM_NUM_EM, &dimid) != NC_NOERR) {
+    *num_elem_maps = 0;
+  } else {
+    if ((status = nc_inq_dimlen(exoid, dimid, &lnum_elem_maps)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get number of element maps in file id %d",
+	      exoid);
+      ex_err("ex_get_map_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    *num_elem_maps = lnum_elem_maps;
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_n_attr.c b/exodus/cbind/src/ex_get_n_attr.c
new file mode 100644
index 0000000..c640fee
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_attr.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_attr, etc
+
+/*!
+ * \deprecated Use ex_get_partial_attr() instead
+ * reads the specified attribute for a subsect of a block
+ * \param      exoid         exodus file id
+ * \param      obj_type      object type (edge, face, elem block)
+ * \param      obj_id        object id (edge, face, elem block ID)
+ * \param      start_num     the starting index of the attributes to be returned.
+ * \param      num_ent       the number of entities to read attributes for.
+ * \param      attrib_index  index of attribute to write
+ * \param      attrib         array of attributes
+ */
+/*
+ */
+int ex_get_n_attr( int   exoid,
+		   ex_entity_type obj_type,
+		   ex_entity_id   obj_id,
+		   int64_t   start_num,
+		   int64_t   num_ent,
+		   void* attrib )
+
+{
+  return ex_get_partial_attr(exoid, obj_type, obj_id, start_num, num_ent, attrib);
+}
diff --git a/exodus/cbind/src/ex_get_n_conn.c b/exodus/cbind/src/ex_get_n_conn.c
new file mode 100644
index 0000000..a6ca1a7
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_conn.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for void_int, etc
+
+/*!
+ * \deprecated Use ex_get_partial_conn() instead.
+ */
+
+int ex_get_n_conn( int   exoid,
+		   ex_entity_type blk_type,
+		   ex_entity_id   blk_id,
+		   int64_t   start_num,
+		   int64_t   num_ent,
+		   void_int*  nodeconn,
+		   void_int*  edgeconn,
+		   void_int*  faceconn )
+{
+  return ex_get_partial_conn(exoid, blk_type, blk_id, start_num, num_ent, nodeconn, edgeconn, faceconn);
+}
diff --git a/exodus/cbind/src/ex_get_n_coord.c b/exodus/cbind/src/ex_get_n_coord.c
new file mode 100644
index 0000000..e2af4e8
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_coord.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgcor - ex_get_n_coord
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     start_node_num          starting index of coordinates to be returned.
+*       int     num_nodes               number of nodes to read coordinates for.
+*
+* exit conditions - 
+*       float*  x_coord                 X coord array
+*       float*  y_coord                 y coord array
+*       float*  z_coord                 z coord array
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_coord
+
+/*!
+ *       \deprecated Use ex_get_partial_coord() instead
+ * reads the coordinates of the nodes.
+ * Memory must be allocated for the coordinate arrays (x_coor, y_coor,
+ * and z_coor) before this call is made. The length of each of these
+ * arrays is the number of nodes in the mesh.  Because the coordinates
+ * are floating point values, the application code must declare the
+ * arrays passed to be the appropriate type "float" or "double"
+ * to match the compute word size passed in ex_create() or ex_open()
+ * \param      exoid  exodus file id
+ * \param      start_node_num  the starting index of the coordinates to be returned.
+ * \param      num_nodes  the number of nodes to read coordinates for.
+ * \param[out] x_coor Returned X coordinates of the nodes. These are
+ *                    returned only if x_coor is non-NULL.
+ * \param[out] y_coor Returned Y coordinates of the nodes. These are
+ *                    returned only if y_coor is non-NULL.
+ * \param[out] z_coor Returned Z coordinates of the nodes. These are
+ *                    returned only if z_coor is non-NULL.
+ */
+
+int ex_get_n_coord (int exoid,
+                    int64_t start_node_num,
+                    int64_t num_nodes,
+		    void *x_coor,
+		    void *y_coor,
+		    void *z_coor)
+{
+  return ex_get_partial_coord(exoid, start_node_num, num_nodes, x_coor, y_coor, z_coor);
+}
diff --git a/exodus/cbind/src/ex_get_n_elem_attr.c b/exodus/cbind/src/ex_get_n_elem_attr.c
new file mode 100644
index 0000000..f9a9d61
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_elem_attr.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_n_elem_attr()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      attrib             - Pointer to the attribute vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_attr, etc
+
+
+/*!
+ * \deprecated Use ex_get_partial_attr() instead.
+ */
+
+int ex_get_n_elem_attr (int   exoid,
+                        ex_entity_id   elem_blk_id,
+                        int64_t   start_elem_num,
+                        int64_t   num_elems,
+                        void *attrib)
+
+{
+  return ex_get_partial_attr(exoid, EX_ELEM_BLOCK, elem_blk_id, start_elem_num, num_elems, attrib);
+}
diff --git a/exodus/cbind/src/ex_get_n_elem_conn.c b/exodus/cbind/src/ex_get_n_elem_conn.c
new file mode 100644
index 0000000..4dea2e9
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_elem_conn.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_n_elem_conn()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      connect            - Pointer to the connectivity vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stddef.h>                     // for NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_conn, etc
+
+/*!
+ * \deprecated use ex_get_partial_conn()
+ * reads the connectivity array for an element block 
+ */
+
+int ex_get_n_elem_conn (int   exoid,
+                        ex_entity_id   elem_blk_id,
+                        int64_t   start_elem_num,
+                        int64_t   num_elems,
+                        void_int  *connect)
+{
+  return ex_get_partial_conn(exoid, EX_ELEM_BLOCK, elem_blk_id,
+			     start_elem_num, num_elems, connect, NULL, NULL);
+}
diff --git a/exodus/cbind/src/ex_get_n_elem_num_map.c b/exodus/cbind/src/ex_get_n_elem_num_map.c
new file mode 100644
index 0000000..36db01e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_elem_num_map.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* ne_gennm - ex_get_n_elem_num_map
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	start_ent		starting location for read
+*	int	num_ents		number of elemental points
+*
+* exit conditions - 
+*	int*	elem_map		element number map array
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_id_map, etc
+
+/*!
+ * \deprecated Use ex_get_partial_id_map() instead
+ */
+
+int ex_get_n_elem_num_map (int  exoid,
+			   int64_t  start_ent,
+			   int64_t  num_ents,
+			   void_int *elem_map)
+{
+  return ex_get_partial_id_map(exoid, EX_ELEM_MAP, start_ent, num_ents, elem_map);
+}
diff --git a/exodus/cbind/src/ex_get_n_elem_var.c b/exodus/cbind/src/ex_get_n_elem_var.c
new file mode 100644
index 0000000..ed2653e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_elem_var.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_var, etc
+
+/*!
+ * \deprecated Use ex_get_partial_var() instead
+ */
+
+int ex_get_n_elem_var (int   exoid,
+		       int   time_step,
+		       int   elem_var_index,
+		       ex_entity_id elem_blk_id,
+		       int64_t num_elem_this_blk,
+		       int64_t start_elem_num,
+		       int64_t num_elem,
+		       void *elem_var_vals)
+{
+  return ex_get_partial_var(exoid, time_step, EX_ELEM_BLOCK,
+			    elem_var_index, elem_blk_id,
+			    start_elem_num, num_elem,
+			    elem_var_vals);
+}
diff --git a/exodus/cbind/src/ex_get_n_nodal_var.c b/exodus/cbind/src/ex_get_n_nodal_var.c
new file mode 100644
index 0000000..664fea5
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_nodal_var.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <exodusII.h>                   // for ex_get_partial_nodal_var
+#include <sys/types.h>                  // for int64_t
+
+/*!
+ * \deprecated Use ex_get_partial_nodal_var() instead
+ */
+
+int ex_get_n_nodal_var (int   exoid,
+		        int   time_step,
+		        int   nodal_var_index,
+                        int64_t   start_node,
+		        int64_t   num_nodes,
+		        void *var_vals)
+{
+  return ex_get_partial_nodal_var(exoid, time_step, nodal_var_index, start_node, num_nodes, var_vals);
+}
diff --git a/exodus/cbind/src/ex_get_n_node_num_map.c b/exodus/cbind/src/ex_get_n_node_num_map.c
new file mode 100644
index 0000000..a3b5d0f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_node_num_map.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* ne_gnnnm - ex_get_n_node_num_map
+*
+* environment - UNIX
+*
+* entry conditions -
+*   input parameters:
+*	int	exoid			nemesis file id
+*
+* exit conditions -
+*	int*	node_map		node numbering map array
+*
+* revision history -
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_id_map, etc
+
+/*!
+ *  \deprecated Use ex_get_partial_num_map() instead
+ */
+
+int ex_get_n_node_num_map (int  exoid,
+                           int64_t  start_ent,
+                           int64_t  num_ents,
+                           void_int *node_map)
+{
+  return ex_get_partial_id_map(exoid, EX_NODE_MAP, start_ent, num_ents, node_map);
+}
diff --git a/exodus/cbind/src/ex_get_n_node_set.c b/exodus/cbind/src/ex_get_n_node_set.c
new file mode 100644
index 0000000..3aef799
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_node_set.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_n_node_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to read.
+ *      start_node_num     - The starting index of the nodes to be read.
+ *      num_nodes          - The number of nodes to read in.
+ *      node_set_node_list - List of node IDs in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_node_set, etc
+
+/*!
+ * \deprecated Use ex_get_partial_node_set() instead
+ */
+
+int ex_get_n_node_set (int   exoid,
+                       ex_entity_id node_set_id,
+                       int64_t   start_node_num,
+                       int64_t   num_nodes,
+                       void_int  *node_set_node_list)
+{
+  return ex_get_partial_node_set(exoid, node_set_id, start_node_num, num_nodes, node_set_node_list);
+}
diff --git a/exodus/cbind/src/ex_get_n_node_set_df.c b/exodus/cbind/src/ex_get_n_node_set_df.c
new file mode 100644
index 0000000..96edba8
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_node_set_df.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"
+
+/*!
+ * \deprecated Use ex_get_partial_set_dist_fact() instead
+ */
+
+int ex_get_n_node_set_df  (int   exoid,
+                           ex_entity_id node_set_id,
+                           int64_t   start_num,
+                           int64_t   num_df_to_get,
+                           void *node_set_dist_fact)
+{
+  return ex_get_partial_set_dist_fact(exoid, EX_NODE_SET, node_set_id,
+				      start_num, num_df_to_get, node_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_get_n_one_attr.c b/exodus/cbind/src/ex_get_n_one_attr.c
new file mode 100644
index 0000000..6e2c976
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_one_attr.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_one_attr, etc
+
+/*!
+ * \deprecated Use ex_get_partial_one_attr() instead.
+ *
+ * reads the specified attribute for a subsect of a block
+ * \param      exoid         exodus file id
+ * \param      obj_type      object type (edge, face, elem block)
+ * \param      obj_id        object id (edge, face, elem block ID)
+ * \param      start_num     the starting index of the attributes to be returned.
+ * \param      num_ent       the number of entities to read attributes for.
+ * \param      attrib_index  index of attribute to write
+ * \param      attrib         array of attributes
+ */
+/*
+ */
+int ex_get_n_one_attr( int   exoid,
+		       ex_entity_type obj_type,
+		       ex_entity_id   obj_id,
+		       int64_t   start_num,
+		       int64_t   num_ent,
+		       int   attrib_index,
+		       void* attrib )
+
+{
+  return ex_get_partial_one_attr(exoid, obj_type, obj_id, start_num, num_ent, attrib_index, attrib);
+}
diff --git a/exodus/cbind/src/ex_get_n_side_set.c b/exodus/cbind/src/ex_get_n_side_set.c
new file mode 100644
index 0000000..476f8ee
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_side_set.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_side_set, etc
+
+/*!
+ * \deprecated Use ex_get_partial_side_set() instead
+ */
+
+int ex_get_n_side_set (int   exoid,
+                       ex_entity_id   side_set_id,
+                       int64_t   start_side_num,
+                       int64_t   num_sides,
+                       void_int  *side_set_elem_list,
+                       void_int  *side_set_side_list)
+{
+  return ex_get_partial_side_set(exoid, side_set_id, start_side_num, num_sides,
+				 side_set_elem_list, side_set_side_list);
+}
diff --git a/exodus/cbind/src/ex_get_n_side_set_df.c b/exodus/cbind/src/ex_get_n_side_set_df.c
new file mode 100644
index 0000000..bb0b9ba
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_side_set_df.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_n_side_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to read.
+ *      start_side_num     - The starting index of the sides to be read.
+ *      num_sides          - The number of sides to read in.
+ *      side_set_dist_fact - List of side IDs in side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"
+
+
+/*!
+ * \deprecated Use ex_get_partial_set_dist_fact() instead
+ */
+int ex_get_n_side_set_df (int   exoid,
+                          ex_entity_id   side_set_id,
+                          int64_t   start_num,
+                          int64_t   num_df_to_get,
+                          void *side_set_dist_fact)
+{
+  return ex_get_partial_set_dist_fact(exoid, EX_SIDE_SET, side_set_id, start_num, num_df_to_get,
+				      side_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_get_n_var.c b/exodus/cbind/src/ex_get_n_var.c
new file mode 100644
index 0000000..ddcfb68
--- /dev/null
+++ b/exodus/cbind/src/ex_get_n_var.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_var, etc
+
+/*
+ * reads the values of a single element variable for one element block at 
+ * one time step in the database; assume the first time step and
+ * element variable index is 1
+ */
+
+/*!
+ * \deprecated Use ex_get_partial_var() instead.
+ *
+ * reads the values of a single variable for a partial block at one time
+ * step from the database; assume the first time step and variable index
+ * and start_index are 1
+ * \param      exoid           exodus file id
+ * \param      time_step       time step number
+ * \param      var_type        type (edge block, face block, edge set, ... )
+ * \param      var_index       element variable index
+ * \param      obj_id          element block id
+ * \param      start_index     index of first entity in block to read (1-based)
+ * \param      num_entities    number of entries to read in this block/set
+ * \param      var_vals        the values to read
+ */
+
+int ex_get_n_var( int   exoid,
+		  int   time_step,
+		  ex_entity_type var_type,
+		  int   var_index,
+		  ex_entity_id   obj_id, 
+		  int64_t   start_index,
+		  int64_t   num_entities,
+		  void* var_vals )
+{
+  return ex_get_partial_var(exoid, time_step, var_type, var_index, obj_id,
+			    start_index, num_entities, var_vals);
+}
diff --git a/exodus/cbind/src/ex_get_name.c b/exodus/cbind/src/ex_get_name.c
new file mode 100644
index 0000000..fc4a454
--- /dev/null
+++ b/exodus/cbind/src/ex_get_name.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnam - ex_get_name
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid          exodus file id
+*       const char *type       entity type - M, E, S   
+*       int     entity_id      id of entity name to read 
+*
+* exit conditions - 
+*       char*   name           ptr to name
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf, NULL
+#include "exodusII.h"                   // for ex_inquire_int, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid
+
+/*
+ * reads the specified entity name from the database
+ */
+
+int ex_get_name (int   exoid,
+		 ex_entity_type obj_type,
+		 ex_entity_id   entity_id, 
+		 char *name)
+{
+  int status;
+  int varid, ent_ndx;
+  char errmsg[MAX_ERR_LENGTH];
+  char *vobj = NULL;
+  const char *routine = "ex_get_name";
+   
+  exerrval = 0;
+
+  switch(obj_type) {
+  case EX_ELEM_BLOCK:
+    vobj = VAR_NAME_EL_BLK;
+    break;
+  case EX_EDGE_BLOCK:
+    vobj = VAR_NAME_ED_BLK;
+    break;
+  case EX_FACE_BLOCK:
+    vobj = VAR_NAME_FA_BLK;
+    break;
+  case EX_NODE_SET:
+    vobj = VAR_NAME_NS;
+    break;
+  case EX_SIDE_SET:
+    vobj = VAR_NAME_SS;
+    break;
+  case EX_EDGE_SET:
+    vobj = VAR_NAME_ES;
+    break;
+  case EX_FACE_SET:
+    vobj = VAR_NAME_FS;
+    break;
+  case EX_ELEM_SET:
+    vobj = VAR_NAME_ELS;
+    break;
+  case EX_NODE_MAP:
+    vobj = VAR_NAME_NM;
+    break;
+  case EX_EDGE_MAP:
+    vobj = VAR_NAME_EDM;
+    break;
+  case EX_FACE_MAP:
+    vobj = VAR_NAME_FAM;
+    break;
+  case EX_ELEM_MAP:
+    vobj = VAR_NAME_EM;
+    break;
+  default:
+    /* invalid variable type */
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid type specified in file id %d", exoid);
+    ex_err(routine,errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  if ((status = nc_inq_varid(exoid, vobj, &varid)) == NC_NOERR) {
+    /* If this is a null entity, then 'ent_ndx' will be negative.
+     * We don't care in this routine, so make it positive and continue...
+     */
+    ent_ndx = ex_id_lkup(exoid, obj_type, entity_id);
+    if (ent_ndx < 0) ent_ndx = -ent_ndx;
+    
+    /* read the name */
+    {
+      int db_name_size = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);
+      int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
+      int name_size = db_name_size < api_name_size ? db_name_size : api_name_size;
+
+      status = ex_get_name_internal(exoid, varid, ent_ndx-1, name, name_size, obj_type, routine);
+      if (status != NC_NOERR) {
+	return (EX_FATAL);
+      }
+    }
+  } else {
+    /* Name variable does not exist on the database; probably since this is an
+     * older version of the database.  Return an empty array...
+     */
+    name[0] = '\0';
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_names.c b/exodus/cbind/src/ex_get_names.c
new file mode 100644
index 0000000..777b12e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_names.c
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnam - ex_get_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid          exodus file id
+*       int    obj_type,
+*
+* exit conditions - 
+*       char*   names[]           ptr array of names
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for ex_get_dimension, EX_NOERR, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR
+
+/*
+ * reads the entity names from the database
+ */
+
+int ex_get_names (int exoid,
+                  ex_entity_type obj_type,
+                  char **names)
+{
+  int status;
+  int varid, temp;
+  size_t num_entity, i;
+  char errmsg[MAX_ERR_LENGTH];
+  const char *routine = "ex_get_names";
+   
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined dimensions and variables  */
+
+  switch (obj_type) {
+    /*  ======== BLOCKS ========= */
+  case EX_EDGE_BLOCK:
+    ex_get_dimension(exoid, DIM_NUM_ED_BLK, "edge block", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_ED_BLK, &varid);
+    break;
+  case EX_FACE_BLOCK:
+    ex_get_dimension(exoid, DIM_NUM_FA_BLK, "face block", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_FA_BLK, &varid);
+    break;
+  case EX_ELEM_BLOCK:
+    ex_get_dimension(exoid, DIM_NUM_EL_BLK, "element block", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_EL_BLK, &varid);
+    break;
+
+    /*  ======== SETS ========= */
+  case EX_NODE_SET:
+    ex_get_dimension(exoid, DIM_NUM_NS, "nodeset", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_NS, &varid);
+    break;
+  case EX_EDGE_SET:
+    ex_get_dimension(exoid, DIM_NUM_ES, "edgeset", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_ES, &varid);
+    break;
+  case EX_FACE_SET:
+    ex_get_dimension(exoid, DIM_NUM_FS, "faceset", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_FS, &varid);
+    break;
+  case EX_SIDE_SET:
+    ex_get_dimension(exoid, DIM_NUM_SS, "sideset", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_SS, &varid);
+    break;
+  case EX_ELEM_SET:
+    ex_get_dimension(exoid, DIM_NUM_ELS, "elemset", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_ELS, &varid);
+    break;
+
+    /*  ======== MAPS ========= */
+  case EX_NODE_MAP:
+    ex_get_dimension(exoid, DIM_NUM_NM, "node map", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_NM, &varid);
+    break;
+  case EX_EDGE_MAP:
+    ex_get_dimension(exoid, DIM_NUM_EDM, "edge map", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_EDM, &varid);
+    break;
+  case EX_FACE_MAP:
+    ex_get_dimension(exoid, DIM_NUM_FAM, "face map", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_FAM, &varid);
+    break;
+  case EX_ELEM_MAP:
+    ex_get_dimension(exoid, DIM_NUM_EM, "element map", &num_entity, &temp, routine);
+    status = nc_inq_varid(exoid, VAR_NAME_EM, &varid);
+    break;
+
+    /* invalid variable type */
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid type specified in file id %d",
+	    exoid);
+    ex_err(routine,errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  if (status == NC_NOERR) {
+    if ((status = ex_get_names_internal(exoid, varid, num_entity, names,
+					obj_type, "ex_get_names")) != EX_NOERR) {
+      return status;
+    }					
+  } else {
+    /* Names variable does not exist on the database; probably since this is an
+     * older version of the database.  Return an empty array...
+     */
+    for (i=0; i<num_entity; i++) {
+      names[i][0] = '\0';
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_nodal_var.c b/exodus/cbind/src/ex_get_nodal_var.c
new file mode 100644
index 0000000..2588903
--- /dev/null
+++ b/exodus/cbind/src/ex_get_nodal_var.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_NOERR, EX_WARN, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+The function ex_get_nodal_var() reads the values of a single nodal
+variable for a single time step. Memory must be allocated for the
+nodal variable values array before this function is invoked.
+
+Because nodal variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_get_nodal_var() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  specified nodal variable does not exist.
+  -  a warning value is returned if no nodal variables are stored in the file.
+
+\param[in] exoid                exodus file ID returned from a previous call to ex_create() 
+                                or ex_open().
+
+\param[in] time_step            The time step, as described under ex_put_time(), at which the
+                                nodal variable values are desired. This is essentially an index (in
+				the time dimension) into the nodal variable values array stored in
+				the database. The first time step is 1.
+
+\param[in] nodal_var_index      The index of the desired nodal variable. The first variable 
+                                has an index of 1.
+
+\param[in] num_nodes            The number of nodal points.
+
+\param[out]  nodal_var_vals     Returned array of \c num_nodes values of the \c nodal_var_index-th
+                                nodal variable for the \c time_step-th time step.
+
+
+For example, the following demonstrates how this function would be
+used:
+
+\code
+int num_nodes, time_step, var_index;
+float *var_values;
+
+\comment{read the second nodal variable at the first time step}
+time_step = 1;
+var_index = 2;
+
+var_values = (float *) calloc (num_nodes, sizeof(float));
+error = ex_get_nodal_var(exoid, time_step, var_index, num_nodes,
+                         var_values);
+\endcode
+
+*/
+
+int ex_get_nodal_var (int   exoid,
+                      int   time_step,
+                      int   nodal_var_index,
+                      int64_t   num_nodes, 
+                      void *nodal_var_vals)
+{
+  int varid;
+  int status;
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined variable */
+
+  /* Need to see how this works in the parallel-aware exodus... */
+  if (num_nodes == 0)
+    return EX_NOERR;
+  
+  if (ex_large_model(exoid) == 0) {
+    /* read values of the nodal variable */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variables in file id %d",
+              exoid);
+      ex_err("ex_get_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = --nodal_var_index;
+    start[2] = 0;
+
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = num_nodes;
+
+  } else {
+    /* read values of the nodal variable  -- stored as separate variables... */
+    /* Get the varid.... */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR_NEW(nodal_var_index), &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_get_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = 0;
+
+    count[0] = 1;
+    count[1] = num_nodes;
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, varid, start, count, nodal_var_vals);
+  } else {
+    status = nc_get_vara_double(exoid, varid, start, count, nodal_var_vals);
+  }
+
+  if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get nodal variables in file id %d",
+              exoid);
+      ex_err("ex_get_nodal_var",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_nodal_var_time.c b/exodus/cbind/src/ex_get_nodal_var_time.c
new file mode 100644
index 0000000..a3aed23
--- /dev/null
+++ b/exodus/cbind/src/ex_get_nodal_var_time.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_WARN, ex_comp_ws, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+The function ex_get_nodal_var_time() reads the values of a nodal
+variable for a single node through a specified number of time
+steps. Memory must be allocated for the nodal variable values array
+before this function is invoked.
+
+Because nodal variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or ``double'') to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_get_nodal_var_time() returns a
+negative number; a warning will return a positive number. Possible
+causes of errors include:
+  -  specified nodal variable does not exist.
+  -  a warning value is returned if no nodal variables are stored in the file.
+
+\param[in] exoid             exodus file ID returned from a previous call to ex_create() or
+                             ex_open().
+
+\param[in] nodal_var_index   The index of the desired nodal variable. The first variable has an
+                             index of 1.
+
+\param[in] node_number       The internal ID (see  Section LocalNodeIds) of the desired 
+                             node. The first node is 1.
+
+\param[in] beg_time_step     The beginning time step for which a nodal variable value 
+                             is desired. This is not a time value but rather a time step number, 
+			     as described under ex_put_time(). The first time step is 1.
+
+\param[in] end_time_step     The last time step for which a nodal variable value is desired. If
+                             negative, the last time step in the database will be used. The first
+			     time step is 1.
+
+\param[out]  nodal_var_vals  Returned array of(\c end_time_step {-} \c beg_time_step +1) values
+                             of the \c node_number-th node for the \c nodal_var_index-th nodal
+			     variable.
+
+
+For example, the following code segment will read the values of the
+first nodal variable for node number one for all time steps stored in
+the data file:
+
+\code
+int num_time_steps, var_index, node_num, beg_time, end_time, error, exoid;
+float *var_values;
+
+\comment{determine how many time steps are stored}
+num_time_steps = ex_inquire_int(exoid, EX_INQ_TIME);
+
+\comment{read a nodal variable through time}
+var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+var_index = 1; node_num = 1; beg_time = 1; end_time = -1;
+error = ex_get_nodal_var_time(exoid, var_index, node_num, beg_time,
+                              end_time, var_values);
+
+\endcode
+*/
+
+int ex_get_nodal_var_time (int   exoid,
+                           int   nodal_var_index,
+                           int64_t   node_number,
+                           int   beg_time_step, 
+                           int   end_time_step,
+                           void *nodal_var_vals)
+{
+  int status;
+  int varid;
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  beg_time_step--;
+  node_number--;
+  
+  /* inquire previously defined variable */
+  if (end_time_step < 0) {
+    /* user is requesting the maximum time step;  we find this out using the
+     * database inquire function to get the number of time steps;  the ending
+     * time step number is 1 less due to 0 based array indexing in C
+     */
+    end_time_step = ex_inquire_int (exoid, EX_INQ_TIME);
+  }
+
+  end_time_step--;
+
+  if (ex_large_model(exoid) == 0) {
+    /* read values of the nodal variable;
+     * assume node number is 1-based (first node is numbered 1);  adjust
+     * so it is 0-based
+     */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_get_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = beg_time_step;
+    start[1] = --nodal_var_index;
+    start[2] = node_number;
+
+    count[0] = end_time_step - beg_time_step + 1;
+    count[1] = 1;
+    count[2] = 1;
+  } else {
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR_NEW(nodal_var_index), &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_get_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    /* read values of the nodal variable;
+     * assume node number is 1-based (first node is numbered 1);  adjust
+     * so it is 0-based
+     */
+
+    start[0] = beg_time_step;
+    start[1] = node_number;
+
+    count[0] = end_time_step - beg_time_step + 1;
+    count[1] = 1;
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, varid, start, count, nodal_var_vals);
+  } else {
+    status = nc_get_vara_double(exoid, varid, start, count, nodal_var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get nodal variables in file id %d",
+	    exoid);
+    ex_err("ex_get_nodal_var_time",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_node_cmap.c b/exodus/cbind/src/ex_get_node_cmap.c
new file mode 100644
index 0000000..3b651a9
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_cmap.c
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/****************************************************************************/
+/****************************************************************************/
+/* Function(s) in this file:
+ *     ex_get_node_cmap()
+ *
+ ****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      map_id          - The ID of the nodal communication map to retrieve.
+ *      node_ids        - Pointer to vector for retrieval of FEM node IDs
+ *                        that make up this communication map.
+ *      proc_ids        - Pointer to vector for retrieval of the processors
+ *                        associated with each of the nodes in this nodal
+ *                        communication map.
+ *      processor         - The processor the file being read was written for.
+ */
+/****************************************************************************/
+/****************************************************************************/
+/****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <netcdf.h>                     // for NC_NOERR, nc_get_vara_int, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NCNT_CMAP, etc
+
+
+
+int ex_get_node_cmap(int  exoid,
+                     ex_entity_id  map_id,
+                     void_int *node_ids,
+                     void_int *proc_ids,
+                     int  processor
+                     )
+{
+  const char   *func_name="ex_get_node_cmap";
+
+  int     map_idx, dimid, varid[2], status;
+  size_t  start[1], count[1];
+  int64_t varidx[2];
+
+  char    errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* get the cmap information variables index */
+  if (ex_get_idx(exoid, VAR_N_COMM_INFO_IDX, varidx, processor) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_N_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /*
+   * no need to check if the second index is -1 that is handled
+   * in ne_id_lkup, where the dimension must be looked up anyways
+   */
+
+  /* Get the index of the nodal comm map with the given ID */
+  if ((map_idx=ne_id_lkup(exoid, VAR_N_COMM_IDS, varidx, map_id)) < 0) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: failed to find nodal comm map with ID %"PRId64" in file ID %d",
+            map_id, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* get the cmap data variables index for this map */
+  if (ex_get_idx(exoid, VAR_N_COMM_DATA_IDX, varidx, map_idx) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_N_COMM_DATA_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (varidx[1] == -1) {
+    /* Get the dimension of this nodal communication map */
+    if ((status = nc_inq_dimid(exoid, DIM_NCNT_CMAP, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find dimension ID for \"%s\" in file ID %d",
+              DIM_NCNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_inq_dimlen(exoid, dimid,count)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+              DIM_NCNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+    varidx[1] = count[0];
+  }
+
+  /* Get the variable ID for the nodal comm map node IDs */
+  if ((status = nc_inq_varid(exoid, VAR_N_COMM_NIDS, &varid[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_N_COMM_NIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the nodal comm map processor IDs */
+  if ((status = nc_inq_varid(exoid, VAR_N_COMM_PROC, &varid[1])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_N_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the nodal comm map node IDs */
+  start[0] = varidx[0];
+  count[0] = varidx[1] - varidx[0];
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, varid[0], start, count, node_ids);
+  } else {
+    status = nc_get_vara_int(exoid, varid[0], start, count, node_ids);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_N_COMM_NIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get the nodal comm map processor IDs */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, varid[1], start, count, proc_ids);
+  } else {
+    status = nc_get_vara_int(exoid, varid[1], start, count, proc_ids);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_N_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_node_map.c b/exodus/cbind/src/ex_get_node_map.c
new file mode 100644
index 0000000..38b5ebc
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_map.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnm - ex_get_node_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  node map id
+*
+* exit conditions - 
+*       int*    node_map                node map
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_num_map, etc
+
+/*!
+ * reads the node map with specified ID
+ * \deprecated Use ex_get_num_map()(exoid, EX_NODE_MAP, map_id, node_map
+ */
+
+int ex_get_node_map( int   exoid,
+                     ex_entity_id   map_id,
+                     void_int  *node_map )
+{
+  return ex_get_num_map( exoid, EX_NODE_MAP, map_id, node_map );
+}
diff --git a/exodus/cbind/src/ex_get_node_num_map.c b/exodus/cbind/src/ex_get_node_num_map.c
new file mode 100644
index 0000000..06a4214
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_num_map.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnnm - ex_get_node_num_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*       int*    node_map                node numbering map array
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_id_map()(exoid, EX_NODE_MAP, node_map)
+
+The function ex_get_node_num_map() reads the optional node number
+mapnode number map from the database. See Section LocalNodeIds for a
+description of the node number map. If a node number map is not stored
+in the data file, a default array (1,2,3,. .. \c num_nodes) is
+returned. Memory must be allocated for the node number map array
+(\c num_nodes in length) before this call is made.
+
+\return In case of an error, ex_get_node_num_map() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  if a node number map is not stored, a default map and a warning value are returned.
+
+\param[in]   exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  node_map   Returned node number map.
+
+The following code will read a node number map from an open exodus
+file :
+
+\code
+int *node_map, error, exoid;
+
+\comment{read node number map}
+node_map = (int *)calloc(num_nodes, sizeof(int));
+error = ex_get_node_num_map(exoid, node_map);
+
+\comment{Equivalent using non-deprecated function}
+error = ex_get_id_map(exoid, EX_NODE_MAP, node_map);
+\endcode
+
+*/
+
+int ex_get_node_num_map (int  exoid,
+			 void_int *node_map)
+{
+  return ex_get_id_map(exoid, EX_NODE_MAP, node_map);
+}
diff --git a/exodus/cbind/src/ex_get_node_set.c b/exodus/cbind/src/ex_get_node_set.c
new file mode 100644
index 0000000..d96439f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_set.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgns - ex_get_node_set
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     node_set_id             node set id
+*
+* exit conditions - 
+*       int*    node_set_node_list      node list array for the node set
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for ex_get_set, ex_entity_id, etc
+
+/*!
+ * reads the node list for a single node set
+ * \deprecated Use ex_get_set()(exoid, EX_NODE_SET, node_set_id, node_set_node_list, NULL)
+ */
+
+int ex_get_node_set (int   exoid,
+                     ex_entity_id   node_set_id,
+                     void_int  *node_set_node_list)
+{
+  return ex_get_set(exoid, EX_NODE_SET, node_set_id, node_set_node_list,
+		    NULL);
+}
diff --git a/exodus/cbind/src/ex_get_node_set_dist_fact.c b/exodus/cbind/src/ex_get_node_set_dist_fact.c
new file mode 100644
index 0000000..a6b5660
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_set_dist_fact.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_set_dist_fact()(exoid, EX_NODE_SET, node_set_id, node_set_dist_fact)
+
+The function ex_get_node_set_dist_fact() returns the node set
+distribution factors for a single node set. Memory must be allocated
+for the list of distribution factors(\c num_dist_in_set in length)
+before this function is invoked.
+
+Because the distribution factors are floating point values, the
+application code must declare the array passed to be the appropriate
+type (\c float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_get_node_set_dist_fact() returns a
+negative number; a warning will return a positive number. Possible
+causes of errors include:
+  -  a warning value is returned if no distribution factors were stored.
+
+\param[in]  exoid               exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  node_set_id         The node set ID.
+\param[out] node_set_dist_fact  Returned array containing the distribution factors in the node set.
+
+Refer to the description of ex_get_node_set_param() for a sample code
+segment to read a node set's distribution factors.
+*/
+
+int ex_get_node_set_dist_fact  (int   exoid,
+                                ex_entity_id   node_set_id,
+                                void *node_set_dist_fact)
+{
+  return ex_get_set_dist_fact(exoid, EX_NODE_SET, node_set_id,
+			      node_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_get_node_set_ids.c b/exodus/cbind/src/ex_get_node_set_ids.c
new file mode 100644
index 0000000..7b101de
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_set_ids.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_ids()(exoid, EX_NODE_SET, ids)
+
+The function ex_get_node_set_ids() reads the IDs of all of the node
+sets. Memory must be allocated for the returned array of
+({num_node_sets}) IDs before this function is invoked.
+
+\return In case of an error, ex_get_node_set_ids() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if no node sets are stored in the file.
+
+\param[in]  exoid    exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out] ids      Returned array of the node sets IDs. The order of the IDs in this array
+                     reflects the sequence the node sets were introduced into the file.
+
+As an example, the following code will read all of the node set IDs
+from an open data file:
+
+\code
+int *ids, num_node_sets, error, exoid;
+
+\comment{read node sets IDs}
+ids = (int *) calloc(num_node_sets, sizeof(int));
+
+error = ex_get_node_set_ids (exoid, ids);
+
+\comment{Same result using non-deprecated functions.}
+error = ex_get_ids (exoid, EX_NODE_SET, ids);
+\endcode
+ */
+
+int ex_get_node_set_ids (int  exoid,
+                         void_int *ids)
+{
+  return ex_get_ids( exoid, EX_NODE_SET, ids );
+}
diff --git a/exodus/cbind/src/ex_get_node_set_param.c b/exodus/cbind/src/ex_get_node_set_param.c
new file mode 100644
index 0000000..f27de40
--- /dev/null
+++ b/exodus/cbind/src/ex_get_node_set_param.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_get_set_param()(exoid, EX_NODE_SET, node_set_id, num_nodes_in_set, num_df_in_set)
+
+The function ex_get_node_set_param() reads the number of nodes which
+describe a single node set and the number of distribution factors for
+the node set.
+
+\return In case of an error, ex_get_node_set_param() returns a
+negative number; a warning will return a positive number. Possible
+causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if no node sets are stored in the file.
+  -  incorrect node set ID.
+
+\param[in]  exoid            exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  node_set_id      The node set ID.
+\param[out] num_nodes_in_set Returned number of nodes in the node set.
+\param[out] num_df_in_set    Returned number of distribution factors in the node set.
+
+The following code segment will read a node set from an open exodus
+file :
+\code
+int error, exoid, id, num_nodes_in_set, num_df_in_set, *node_list;
+float *dist_fact;
+
+\comment{read node set parameters}
+id = 100;
+
+error = ex_get_node_set_param(exoid, id, &num_nodes_in_set, 
+                              &num_df_in_set);
+
+\comment{read node set node list}
+node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+error = ex_get_node_set(exoid, id, node_list);
+
+\comment{read node set distribution factors}
+if (num_df_in_set > 0) {
+   dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+   error = ex_get_node_set_dist_fact(exoid, id, dist_fact); 
+}
+
+\comment{Same result using non-deprecated functions}
+error = ex_get_set_param(exoid, EX_NODE_SET, id, &num_nodes_in_set, &num_df_in_set);
+error = ex_get_set(exoid, EX_NODE_SET, id, node_list);
+if (num_df_in_set > 0) {
+   error = ex_get_set_dist_fact(exoid, EX_NODE_SET, id, dist_fact); 
+}
+
+\endcode
+
+ */
+
+int ex_get_node_set_param (int  exoid,
+                           ex_entity_id  node_set_id,
+                           void_int *num_nodes_in_set,
+                           void_int *num_df_in_set)
+{
+  return ex_get_set_param(exoid, EX_NODE_SET, node_set_id,
+			  num_nodes_in_set, num_df_in_set);
+}
diff --git a/exodus/cbind/src/ex_get_ns_param_global.c b/exodus/cbind/src/ex_get_ns_param_global.c
new file mode 100644
index 0000000..cf85161
--- /dev/null
+++ b/exodus/cbind/src/ex_get_ns_param_global.c
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_ns_param_global()
+ *****************************************************************************
+ * This function retrieves the global node-set parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      global_ids      - Pointer to a vector of global node-set IDs.
+ *      node_cnts       - Pointer to a vector of global node counts in
+ *                        each global node set.
+ *      df_cnts         - Pointer to a vector of global distribution
+ *                        factors in each global node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_get_var_int, etc
+#include <stdio.h>                      // for sprintf, NULL
+
+
+
+int ex_get_ns_param_global(int exoid,
+                           void_int *global_ids,
+                           void_int *node_cnts,
+                           void_int *df_cnts
+                           )
+{
+  const char   *func_name="ex_get_ns_param_global";
+  int     varid, status;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the variable ID for the vector of global node set IDs */
+  if ((status = nc_inq_varid(exoid, VAR_NS_IDS_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_NS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the vector of node set IDs */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_get_var_longlong(exoid, varid, global_ids);
+  } else {
+    status = nc_get_var_int(exoid, varid, global_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_NS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the vector of global node set node count */
+  if (node_cnts != NULL) {
+    if ((status = nc_inq_varid(exoid, VAR_NS_NODE_CNT_GLOBAL, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NS_NODE_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* Get the vector of node set node counts */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, varid, node_cnts);
+    } else {
+      status = nc_get_var_int(exoid, varid, node_cnts);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_NS_NODE_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (node_cnts != NULL)" */
+
+  /* Get the variable ID for the vector of global node set dist. fact count */
+  if (df_cnts != NULL) {
+    if ((status = nc_inq_varid(exoid, VAR_NS_DF_CNT_GLOBAL, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NS_DF_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* Get the vector of node set dist. fact counts */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, varid, df_cnts);
+    } else {
+      status = nc_get_var_int(exoid, varid, df_cnts);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_NS_DF_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+  } /* End "if (df_cnts != NULL)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_nset_var.c b/exodus/cbind/src/ex_get_nset_var.c
new file mode 100644
index 0000000..5eee0ef
--- /dev/null
+++ b/exodus/cbind/src/ex_get_nset_var.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssv - ex_get_nset_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     nset_var_index          nodeset variable index
+*       int     nset_blk_id             nodeset id
+*       int     num_node_this_nset      number of nodes in this nodeset
+*       
+*
+* exit conditions - 
+*       float*  nset_var_vals           array of nodeset variable values
+*
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_var, ex_entity_id, etc
+
+/*!
+ * reads the values of a single nodeset variable for one nodeset at 
+ * one time step in the database; assume the first time step and
+ * nodeset variable index is 1
+ * \deprecated Use ex_get_var()(exoid, time_step, EX_NODE_SET, nset_var_index, nset_id, num_node_this_nset, nset_var_vals) instead
+ */
+
+int ex_get_nset_var (int   exoid,
+                     int   time_step,
+                     int   nset_var_index,
+                     ex_entity_id   nset_id, 
+                     int64_t   num_node_this_nset,
+                     void *nset_var_vals)
+{
+  return ex_get_var(exoid, time_step, EX_NODE_SET, nset_var_index,
+		    nset_id, num_node_this_nset, nset_var_vals);
+}
diff --git a/exodus/cbind/src/ex_get_nset_var_tab.c b/exodus/cbind/src/ex_get_nset_var_tab.c
new file mode 100644
index 0000000..7d8a1f1
--- /dev/null
+++ b/exodus/cbind/src/ex_get_nset_var_tab.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvtt - ex_get_nset_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_nodesets            number of nodesets
+*       int     num_nset_var            number of nodeset variables
+*
+* exit conditions - 
+*       int*    nset_var_tab            nodeset variable truth table array
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_truth_table, etc
+
+/*!
+ * reads the EXODUS II nodeset variable truth table from the database
+ * \deprecated Use ex_get_truth_table()(exoid, EX_NODE_SET, num_nodesets, num_nset_var, nset_var_tab)
+ */
+
+int ex_get_nset_var_tab (int  exoid,
+                         int  num_nodesets,
+                         int  num_nset_var,
+                         int *nset_var_tab)
+{
+  return ex_get_truth_table(exoid, EX_NODE_SET, num_nodesets, num_nset_var, nset_var_tab);
+}
diff --git a/exodus/cbind/src/ex_get_num_map.c b/exodus/cbind/src/ex_get_num_map.c
new file mode 100644
index 0000000..f906d3c
--- /dev/null
+++ b/exodus/cbind/src/ex_get_num_map.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnm - ex_get_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_type                type of map (node, edge, face, element)
+*       int     map_id                  map id
+*
+* exit conditions - 
+*       int*    map                     map
+*
+* revision history - 
+*   20060930 - David Thompson - Adapted from ex_get_node_map
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*
+ * reads the map with specified ID
+ */
+
+int ex_get_num_map ( int   exoid,
+                     ex_entity_type map_type,
+                     ex_entity_id   map_id,
+                     void_int*  map )
+{
+   int dimid, var_id, id_ndx, status;
+   char errmsg[MAX_ERR_LENGTH];
+   const char* dim_map_size;
+   const char* dim_num_maps;
+
+   switch (map_type) {
+   case EX_NODE_MAP:
+     dim_map_size = DIM_NUM_NODES;
+     dim_num_maps = DIM_NUM_NM;
+     break;
+   case EX_EDGE_MAP:
+     dim_map_size = DIM_NUM_EDGE;
+     dim_num_maps = DIM_NUM_EDM;
+     break;
+   case EX_FACE_MAP:
+     dim_map_size = DIM_NUM_FACE;
+     dim_num_maps = DIM_NUM_FAM;
+     break;
+   case EX_ELEM_MAP:
+     dim_map_size = DIM_NUM_ELEM;
+     dim_num_maps = DIM_NUM_EM;
+     break;
+   default:
+     exerrval = EX_BADPARAM;
+     sprintf( errmsg, "Bad map type (%d) specified", map_type );
+     ex_err( "ex_get_num_map", errmsg, exerrval );
+     return (EX_FATAL);
+   }
+
+   exerrval = 0; /* clear error code */
+
+   /* See if any entries are stored in this file */
+   if (nc_inq_dimid (exoid, dim_map_size, &dimid) != NC_NOERR) {
+     return (EX_NOERR);
+   }
+
+   /* first check if any maps have been defined */
+   if ((status = nc_inq_dimid(exoid, dim_num_maps, &dimid)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Warning: no %ss defined in file id %d",
+             ex_name_of_object(map_type),exoid);
+     ex_err("ex_get_map",errmsg,exerrval);
+     return (EX_WARN);
+   }
+
+   /* Lookup index of map id property array */
+   id_ndx = ex_id_lkup(exoid,map_type,map_id);
+   if (exerrval != 0) {
+      sprintf(errmsg,
+              "Error: failed to locate %s id %"PRId64" in id variable in file id %d",
+               ex_name_of_object(map_type),map_id,exoid);
+      ex_err("ex_get_map",errmsg,exerrval);
+      return (EX_FATAL);
+   }
+
+   /* inquire id's of previously defined dimensions and variables */
+   if ((status = nc_inq_varid(exoid, ex_name_of_map(map_type,id_ndx), &var_id)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to locate %s %"PRId64" in file id %d",
+             ex_name_of_object(map_type),map_id,exoid);
+     ex_err("ex_get_map",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   /* read in the map */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_var_longlong(exoid, var_id, map);
+  } else {
+    status = nc_get_var_int(exoid, var_id, map);
+  }
+   
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to get %s in file id %d",
+             ex_name_of_object(map_type),exoid);
+     ex_err("ex_get_map",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_object_truth_vector.c b/exodus/cbind/src/ex_get_object_truth_vector.c
new file mode 100644
index 0000000..817d45b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_object_truth_vector.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgotv - ex_get_object_truth_vector
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for ex_get_dimension, EX_FATAL, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+ * reads the EXODUS II specified variable truth vector from the database
+ */
+
+int ex_get_object_truth_vector (int  exoid,
+				ex_entity_type obj_type,
+				ex_entity_id  entity_id,
+				int  num_var,
+				int *var_vec)
+{
+  int statust;
+  int varid, tabid, i, status, ent_ndx;
+  size_t num_var_db = 0;
+  size_t start[2], count[2]; 
+  char errmsg[MAX_ERR_LENGTH];
+  const char* routine = "ex_get_object_truth_vector";
+
+  /*
+   * The ent_type and the var_name are used to build the netcdf
+   * variables name.  Normally this is done via a macro defined in
+   * exodusII_int.h
+   */
+  const char* ent_type = NULL;
+  const char* var_name = NULL;
+
+  exerrval = 0; /* clear error code */
+   
+  switch (obj_type) {
+  case EX_EDGE_BLOCK:
+    status = ex_get_dimension(exoid, DIM_NUM_EDG_VAR,  "edge variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid(exoid, VAR_EBLK_TAB, &tabid);
+    var_name = "vals_edge_var";
+    ent_type = "eb";
+    break;
+  case EX_FACE_BLOCK:
+    status = ex_get_dimension(exoid, DIM_NUM_FAC_VAR,  "face variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_FBLK_TAB, &tabid);
+    var_name = "vals_face_var";
+    ent_type = "fb";
+    break;
+  case EX_ELEM_BLOCK:
+    status = ex_get_dimension(exoid, DIM_NUM_ELE_VAR,  "element variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_ELEM_TAB, &tabid);
+    var_name = "vals_elem_var";
+    ent_type = "eb";
+    break;
+  case EX_NODE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_NSET_VAR, "nodeset variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_NSET_TAB, &tabid);
+    var_name = "vals_nset_var";
+    ent_type = "ns";
+    break;
+  case EX_EDGE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_ESET_VAR, "edgeset variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_ESET_TAB, &tabid);
+    var_name = "vals_eset_var";
+    ent_type = "es";
+    break;
+  case EX_FACE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_FSET_VAR, "faceset variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_FSET_TAB, &tabid);
+    var_name = "vals_fset_var";
+    ent_type = "fs";
+    break;
+  case EX_SIDE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_SSET_VAR, "sideset variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_SSET_TAB, &tabid);
+    var_name = "vals_sset_var";
+    ent_type = "ss";
+    break;
+  case EX_ELEM_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_ELSET_VAR, "elemset variables", &num_var_db, &varid, routine);
+    statust = nc_inq_varid (exoid, VAR_ELSET_TAB, &tabid);
+    var_name = "vals_elset_var";
+    ent_type = "es";
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: Invalid variable type %d specified in file id %d",
+	    obj_type, exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    return (EX_WARN);
+  }
+
+  /* Determine index of entity_id in id array */
+  ent_ndx = ex_id_lkup(exoid,obj_type,entity_id);
+  if (exerrval != 0) {
+    if (exerrval != EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in id variable in file id %d",
+	      ex_name_of_object(obj_type), entity_id, exoid);
+      ex_err(routine,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* If this is a null entity, then 'ent_ndx' will be negative.
+   * We don't care in this routine, so make it positive and continue...
+   */
+  if (ent_ndx < 0) ent_ndx = -ent_ndx;
+  
+  if ((int)num_var_db != num_var) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: # of variables doesn't match those defined in file id %d", exoid);
+    ex_err("ex_get_object_truth_vector",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (statust != NC_NOERR) {
+    /* since truth vector isn't stored in the data file, derive it dynamically */
+    for (i=0; i<num_var; i++) {
+      /* NOTE: names are 1-based */
+      if (nc_inq_varid(exoid, ex_catstr2(var_name, i+1, ent_type, ent_ndx), &tabid) != NC_NOERR) {
+	/* variable doesn't exist; put a 0 in the truth vector */
+	var_vec[i] = 0;
+      } else {
+	/* variable exists; put a 1 in the truth vector */
+	var_vec[i] = 1;
+      }
+    }
+  } else {
+
+    /* read in the truth vector */
+
+    start[0] = ent_ndx-1;
+    start[1] = 0;
+
+    count[0] = 1;
+    count[1] = num_var;
+
+    status = nc_get_vara_int(exoid, tabid, start, count, var_vec);
+     
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get truth vector from file id %d", exoid);
+      ex_err("ex_get_object_truth_vector",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  } 
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_one_attr.c b/exodus/cbind/src/ex_get_one_attr.c
new file mode 100644
index 0000000..b51f8a5
--- /dev/null
+++ b/exodus/cbind/src/ex_get_one_attr.c
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgeat - ex_get_one_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge, face, elem block)
+*       int     obj_id                  object id (edge face, elem block ID)
+*
+* exit conditions - 
+*       float*  attrib                  array of attributes
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t, ptrdiff_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*
+ * reads the attributes for an edge, face, or element block
+ */
+int ex_get_one_attr( int   exoid,
+                     ex_entity_type obj_type,
+                     ex_entity_id   obj_id,
+                     int   attrib_index,
+                     void* attrib )
+
+{
+  int status;
+  int attrid, obj_id_ndx;
+  int temp;
+  size_t num_entries_this_obj, num_attr;
+  size_t start[2], count[2];
+  ptrdiff_t stride[2];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumobjent;
+  const char* dnumobjatt;
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in vobjids array */
+  if (obj_type != EX_NODAL) {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_get_one_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id, exoid);
+	ex_err("ex_get_one_attr",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vattrbname = VAR_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vattrbname = VAR_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vattrbname = VAR_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vattrbname = VAR_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vattrbname = VAR_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vattrbname = VAR_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vattrbname = VAR_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vattrbname = VAR_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vattrbname = VAR_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_get_one_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if (ex_get_dimension(exoid, dnumobjent,"entries", &num_entries_this_obj, &temp, "ex_get_one_attr") != NC_NOERR)
+    return EX_FATAL;
+  
+  if (ex_get_dimension(exoid, dnumobjatt,"attributes", &num_attr, &temp, "ex_get_one_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if (attrib_index < 1 || attrib_index > (int)num_attr) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+            "Error: Invalid attribute index specified: %d.  Valid range is 1 to %d for %s %"PRId64" in file id %d",
+            attrib_index, (int)num_attr, ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_get_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, vattrbname, &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_get_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* read in the attributes */
+  start[0] = 0;
+  start[1] = attrib_index-1;
+
+  count[0] = num_entries_this_obj;
+  count[1] = 1;
+
+  stride[0] = 1;
+  stride[1] = num_attr;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vars_float(exoid, attrid, start, count, stride, attrib);
+  } else {
+    status = nc_get_vars_double(exoid, attrid, start, count, stride, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get attribute %d for %s %"PRId64" in file id %d",
+            attrib_index, ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_get_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_one_elem_attr.c b/exodus/cbind/src/ex_get_one_elem_attr.c
new file mode 100644
index 0000000..2add484
--- /dev/null
+++ b/exodus/cbind/src/ex_get_one_elem_attr.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgeat - ex_get_one_elem_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     elem_blk_id             element block id
+*
+* exit conditions - 
+*       float*  attrib                  array of attributes
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_one_attr, etc
+
+/*!
+ * reads the attributes for an element block
+ * \deprecated Use ex_get_one_attr()(exoid, EX_ELEM_BLOCK, elem_blk_id, attrib_index, attrib)
+ */
+int ex_get_one_elem_attr (int   exoid,
+                          ex_entity_id   elem_blk_id,
+                          int   attrib_index,
+                          void *attrib)
+
+{
+  return ex_get_one_attr( exoid, EX_ELEM_BLOCK, elem_blk_id, attrib_index, attrib );
+}
diff --git a/exodus/cbind/src/ex_get_partial_attr.c b/exodus/cbind/src/ex_get_partial_attr.c
new file mode 100644
index 0000000..a281577
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_attr.c
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgeat - ex_get_partial_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge, face, elem block)
+*       int     obj_id                  object id (edge face, elem block ID)
+*       int     start_num               starting index of attributes to be returned.
+*       int     num_ent                 number of entities to read attributes for.
+*
+* exit conditions - 
+*       float*  attrib                  array of attributes
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+ * reads the specified attribute for a subsect of a block
+ * \param      exoid         exodus file id
+ * \param      obj_type      object type (edge, face, elem block)
+ * \param      obj_id        object id (edge, face, elem block ID)
+ * \param      start_num     the starting index of the attributes to be returned.
+ * \param      num_ent       the number of entities to read attributes for.
+ * \param      attrib_index  index of attribute to write
+ * \param      attrib         array of attributes
+ */
+/*
+ */
+int ex_get_partial_attr( int   exoid,
+		   ex_entity_type obj_type,
+		   ex_entity_id   obj_id,
+		   int64_t   start_num,
+		   int64_t   num_ent,
+		   void* attrib )
+
+{
+  int status;
+  int attrid, obj_id_ndx;
+  int temp;
+  size_t num_entries_this_obj, num_attr;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumobjent;
+  const char* dnumobjatt;
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  if (num_ent == 0)
+    return 0;
+  /* Determine index of obj_id in vobjids array */
+  if (obj_type != EX_NODAL) {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_get_partial_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id%"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id, exoid);
+	ex_err("ex_get_partial_attr",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vattrbname = VAR_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vattrbname = VAR_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vattrbname = VAR_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vattrbname = VAR_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vattrbname = VAR_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vattrbname = VAR_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vattrbname = VAR_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vattrbname = VAR_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vattrbname = VAR_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_get_partial_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if (ex_get_dimension(exoid, dnumobjent,"entries", &num_entries_this_obj, &temp, "ex_get_partial_attr") != NC_NOERR)
+    return EX_FATAL;
+  
+  if (start_num + num_ent -1 > num_entries_this_obj) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: start index (%"PRId64") + count (%"PRId64") is larger than total number of entities (%"ST_ZU") in file id %d",
+	    start_num, num_ent, num_entries_this_obj, exoid);
+    ex_err("ex_get_partial_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  if (ex_get_dimension(exoid, dnumobjatt,"attributes", &num_attr, &temp, "ex_get_partial_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if ((status = nc_inq_varid(exoid, vattrbname, &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_get_partial_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+    
+  /* read in the attributes */
+  start[0] = start_num-1;
+  start[1] = 0;
+
+  count[0] = num_ent;
+  count[1] = num_attr;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, attrid, start, count, attrib);
+  } else {
+    status = nc_get_vara_double(exoid, attrid, start, count, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get attributes for %s %"PRId64" in file id %d",
+            ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_get_partial_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_conn.c b/exodus/cbind/src/ex_get_partial_conn.c
new file mode 100644
index 0000000..3f82ea8
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_conn.c
@@ -0,0 +1,337 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnconn - exodusII read partial edge/face/element block connectivity
+*
+* entry conditions - 
+*   expelb must be called first to establish element block parameters.
+*   input parameters:
+*       int     exoid           exodus file id
+*       int     blk_type        block type (edge, face, element)
+*       int     blk_id          block id
+*       int     start_num       The starting index (1-based) of entities to read
+*       int     num_ent         The number of entities to read connectivity info for.
+* 
+* exit conditions - 
+*       int*    nodeconn        nodal connectivity array
+*       int*    edgeconn        edge connectivity array (where applicable)
+*       int*    faceconn        face connectivity array (where applicable)
+*
+* revision history - 
+*
+*/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_int, etc
+
+/*
+ * reads the connectivity array for an element block
+ */
+
+int ex_get_partial_conn( int   exoid,
+		   ex_entity_type blk_type,
+		   ex_entity_id   blk_id,
+		   int64_t   start_num,
+		   int64_t   num_ent,
+		   void_int*  nodeconn,
+		   void_int*  edgeconn,
+		   void_int*  faceconn )
+{
+  int connid = -1;
+  int econnid = -1;
+  int fconnid = -1;
+
+  int blk_id_ndx, status;
+
+  int numnodperentdim = -1;
+  int numedgperentdim = -1;
+  int numfacperentdim = -1;
+
+  int iexit = (EX_NOERR); /* exit status */
+
+  size_t num_nodes_per_entry = 0;
+  size_t num_edges_per_entry = 0;
+  size_t num_faces_per_entry = 0;
+  char errmsg[MAX_ERR_LENGTH];
+
+  const char* dnumnodent = NULL;
+  const char* dnumedgent = NULL;
+  const char* dnumfacent = NULL;
+  const char* vnodeconn = NULL;
+  const char* vedgeconn = NULL;
+  const char* vfaceconn = NULL;
+
+  /* The partial connectivity input function can currently only handle nodal
+   * connectivity.  Print a warning if edgeconn or faceconn is non-NULL
+   */
+  if (edgeconn != NULL || faceconn != NULL) {
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Warning: ex_get_partial_conn only supports nodal connectivity at this time. %s %"PRId64" in file id %d",
+	    ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_get_partial_conn",errmsg,EX_MSG);
+  }
+
+  exerrval = 0; /* clear error code */
+
+  /* Locate index of element block id in VAR_ID_EL_BLK array */
+
+  blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+  if (exerrval != 0) 
+    {
+      if (exerrval == EX_NULLENTITY)
+	{
+	  sprintf(errmsg,
+		  "Warning: no connectivity array for NULL %s %"PRId64" in file id %d",
+		  ex_name_of_object(blk_type),blk_id,exoid);
+	  ex_err("ex_get_partial_conn",errmsg,EX_NULLENTITY);
+	  return (EX_WARN); /* no connectivity array for this element block */
+	}
+      else
+	{
+	  sprintf(errmsg,
+		  "Error: failed to locate %s id %"PRId64" in id array in file id %d",
+		  ex_name_of_object(blk_type),blk_id,exoid);
+	  ex_err("ex_get_partial_conn",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+    }
+
+  switch (blk_type) {
+  case EX_EDGE_BLOCK:
+    dnumnodent = DIM_NUM_NOD_PER_ED(blk_id_ndx);
+    dnumedgent = 0;
+    dnumfacent = 0;
+    vnodeconn = VAR_EBCONN(blk_id_ndx);
+    vedgeconn = 0;
+    vfaceconn = 0;
+    break;
+  case EX_FACE_BLOCK:
+    dnumnodent = DIM_NUM_NOD_PER_FA(blk_id_ndx);
+    dnumedgent = 0;
+    dnumfacent = 0;
+    vnodeconn = VAR_FBCONN(blk_id_ndx);
+    vedgeconn = 0;
+    vfaceconn = 0;
+    break;
+  case EX_ELEM_BLOCK:
+    dnumnodent = DIM_NUM_NOD_PER_EL(blk_id_ndx);
+    dnumedgent = DIM_NUM_EDG_PER_EL(blk_id_ndx);
+    dnumfacent = DIM_NUM_FAC_PER_EL(blk_id_ndx);
+    vnodeconn = VAR_CONN(blk_id_ndx);
+    vedgeconn = VAR_ECONN(blk_id_ndx);
+    vfaceconn = VAR_FCONN(blk_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized block type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_get_partial_conn",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid (exoid, dnumnodent, &numnodperentdim)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate number of nodes/entity for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_partial_conn",errmsg,exerrval);
+      return(EX_FATAL);
+    }
+
+  if (nc_inq_dimlen(exoid, numnodperentdim, &num_nodes_per_entry) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of nodes/entity for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_partial_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+  if ( edgeconn && dnumedgent ) {
+    num_edges_per_entry = 0;
+    if ((status = nc_inq_dimid(exoid, dnumedgent, &numedgperentdim)) != NC_NOERR) {
+      numedgperentdim = -1;
+    } else {
+      if ((status = nc_inq_dimlen(exoid, numedgperentdim, &num_edges_per_entry)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of edges/entry for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_partial_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+    }
+  }
+
+  if ( faceconn && dnumfacent ) {
+    num_faces_per_entry = 0;
+    if ((status = nc_inq_dimid(exoid, dnumfacent, &numfacperentdim)) != NC_NOERR) {
+      numfacperentdim = -1;
+    } else {
+      if ((status = nc_inq_dimlen(exoid, numfacperentdim, &num_faces_per_entry)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of faces/entry for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_partial_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+    }
+  }
+
+
+  if ((status = nc_inq_varid(exoid, vnodeconn, &connid)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate connectivity array for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_partial_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+  status = 0;
+  if (edgeconn && (numedgperentdim > 0) &&
+      ((status = nc_inq_varid (exoid, vedgeconn, &econnid)) != NC_NOERR))
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate edge connectivity array for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_partial_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+  if (faceconn && (numfacperentdim > 0) &&
+      ((status = nc_inq_varid (exoid, vfaceconn, &fconnid)) != NC_NOERR))
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate face connectivity array for %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_get_partial_conn",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+
+  /* read in the connectivity array */
+  if ( edgeconn && num_edges_per_entry > 0) {
+    size_t start[2], count[2];
+    
+    start[0] = (start_num-1);
+    start[1] = 0;
+    count[0] = num_ent;
+    count[1] = num_edges_per_entry;
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_vara_longlong(exoid, econnid, start, count, edgeconn);
+    } else {
+      status = nc_get_vara_int(exoid, econnid, start, count, edgeconn);
+    }
+
+    if (status != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get edge connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_partial_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+  }
+
+  if ( faceconn && num_faces_per_entry > 0) {
+    size_t start[2], count[2];
+    
+    start[0] = start_num-1;
+    start[1] = 0;
+    count[0] = num_ent;
+    count[1] = num_faces_per_entry;
+     
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_vara_longlong(exoid, fconnid, start, count, faceconn);
+    } else {
+      status = nc_get_vara_int(exoid, fconnid, start, count, faceconn);
+    }
+     
+    if (status != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get face connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_partial_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+  }
+
+  if ( nodeconn && num_nodes_per_entry > 0) {
+    size_t start[2], count[2];
+     
+    start[0] = start_num-1;
+    start[1] = 0;
+    count[0] = num_ent;
+    count[1] = num_nodes_per_entry;
+     
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_vara_longlong(exoid, connid, start, count, nodeconn);
+    } else {
+      status = nc_get_vara_int(exoid, connid, start, count, nodeconn);
+    }
+
+    if (status != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blk_type),blk_id,exoid);
+	ex_err("ex_get_partial_conn",errmsg, exerrval);
+	return(EX_FATAL);
+      }
+  }
+
+  return iexit;
+}
diff --git a/exodus/cbind/src/ex_get_partial_coord.c b/exodus/cbind/src/ex_get_partial_coord.c
new file mode 100644
index 0000000..60cf41f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_coord.c
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgcor - ex_get_partial_coord
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     start_node_num          starting index of coordinates to be returned.
+*       int     num_nodes               number of nodes to read coordinates for.
+*
+* exit conditions - 
+*       float*  x_coord                 X coord array
+*       float*  y_coord                 y coord array
+*       float*  z_coord                 z coord array
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+ * reads the coordinates of the nodes.
+ * Memory must be allocated for the coordinate arrays (x_coor, y_coor,
+ * and z_coor) before this call is made. The length of each of these
+ * arrays is the number of nodes in the mesh.  Because the coordinates
+ * are floating point values, the application code must declare the
+ * arrays passed to be the appropriate type "float" or "double"
+ * to match the compute word size passed in ex_create() or ex_open()
+ * \param      exoid  exodus file id
+ * \param      start_node_num  the starting index of the coordinates to be returned.
+ * \param      num_nodes  the number of nodes to read coordinates for.
+ * \param[out] x_coor Returned X coordinates of the nodes. These are
+ *                    returned only if x_coor is non-NULL.
+ * \param[out] y_coor Returned Y coordinates of the nodes. These are
+ *                    returned only if y_coor is non-NULL.
+ * \param[out] z_coor Returned Z coordinates of the nodes. These are
+ *                    returned only if z_coor is non-NULL.
+ */
+
+int ex_get_partial_coord (int exoid,
+                    int64_t start_node_num,
+                    int64_t num_nodes,
+		    void *x_coor,
+		    void *y_coor,
+		    void *z_coor)
+{
+  int status;
+  int coordid;
+  int coordidx, coordidy, coordidz;
+
+  int numnoddim, ndimdim;
+  size_t num_nod;
+  size_t num_dim, start[2], count[2], i;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;
+
+  /* inquire id's of previously defined dimensions  */
+
+  if (nc_inq_dimid (exoid, DIM_NUM_NODES, &numnoddim) != NC_NOERR)
+    {
+      /* If not found, then this file is storing 0 nodes.
+         Return immediately */
+      return (EX_NOERR);
+    }
+
+  if ((status = nc_inq_dimlen(exoid, numnoddim, &num_nod)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get number of nodes in file id %d",
+              exoid);
+      ex_err("ex_get_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  if (start_node_num + num_nodes -1 > num_nod) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: start index (%"PRId64") + node count (%"PRId64") is larger than total number of nodes (%"ST_ZU") in file id %d",
+	    start_node_num, num_nodes, num_nod, exoid);
+    ex_err("ex_get_partial_coord",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_get_dimension(exoid, DIM_NUM_DIM, "dimensions",
+		       &num_dim, &ndimdim, "ex_get_partial_coord") != NC_NOERR) {
+    return(EX_FATAL);
+  }
+      
+  --start_node_num;
+
+  /* read in the coordinates  */
+  if (ex_large_model(exoid) == 0) {
+    if ((status = nc_inq_varid (exoid, VAR_COORD, &coordid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to locate nodal coordinates in file id %d", exoid);
+      ex_err("ex_get_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    } 
+
+    for (i=0; i<num_dim; i++) {
+      char *which;
+      start[0] = i;
+      start[1] = start_node_num;
+
+      count[0] = 1;
+      count[1] = num_nodes;
+
+      if (i == 0 && x_coor != NULL) {
+	which = "X";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_get_vara_float(exoid, coordid, start, count, x_coor);
+	} else {
+	  status = nc_get_vara_double(exoid, coordid, start, count, x_coor);
+	}
+      } 
+      else if (i == 1 && y_coor != NULL) {
+	which = "Y";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_get_vara_float(exoid, coordid, start, count, y_coor);
+	} else {
+	  status = nc_get_vara_double(exoid, coordid, start, count, y_coor);
+	}
+      } 
+      else if (i == 2 && z_coor != NULL) {
+	which = "Z";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_get_vara_float(exoid, coordid, start, count, z_coor);
+	} else {
+	  status = nc_get_vara_double(exoid, coordid, start, count, z_coor);
+	}
+      }
+
+      if (status != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get %s coord array in file id %d", which, exoid);
+	ex_err("ex_get_partial_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+
+  } else {
+    if ((status = nc_inq_varid (exoid, VAR_COORD_X, &coordidx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate x nodal coordinates in file id %d", exoid);
+      ex_err("ex_get_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (num_dim > 1) {
+      if ((status = nc_inq_varid (exoid, VAR_COORD_Y, &coordidy)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate y nodal coordinates in file id %d", exoid);
+	ex_err("ex_get_partial_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidy = 0;
+    }
+
+    if (num_dim > 2) {
+      if ((status = nc_inq_varid (exoid, VAR_COORD_Z, &coordidz)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate z nodal coordinates in file id %d", exoid);
+	ex_err("ex_get_partial_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidz = 0;
+    }
+
+    /* write out the coordinates  */
+    for (i=0; i<num_dim; i++)
+      {
+        void *coor = NULL;
+        char *which = NULL;
+       
+	start[0] = start_node_num;
+	count[0] = num_nodes;
+
+        if (i == 0) {
+          coor = x_coor;
+          which = "X";
+          coordid = coordidx;
+        } else if (i == 1) {
+          coor = y_coor;
+          which = "Y";
+          coordid = coordidy;
+        } else if (i == 2) {
+          coor = z_coor;
+          which = "Z";
+          coordid = coordidz;
+        }
+
+        if (coor != NULL && coordid != 0) {
+          if (ex_comp_ws(exoid) == 4) {
+            status = nc_get_vara_float(exoid, coordid, start, count, coor); 
+          } else {
+            status = nc_get_vara_double(exoid, coordid, start, count, coor);
+          }
+          
+          if (status != NC_NOERR) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to get %s coord array in file id %d", which, exoid);
+	    ex_err("ex_get_coord",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+        }
+      }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_elem_attr.c b/exodus/cbind/src/ex_get_partial_elem_attr.c
new file mode 100644
index 0000000..a134387
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_elem_attr.c
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_elem_attr()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      attrib             - Pointer to the attribute vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * reads the attributes for an element block
+ */
+
+int ex_get_partial_elem_attr (int   exoid,
+                        ex_entity_id   elem_blk_id,
+                        int64_t   start_elem_num,
+                        int64_t   num_elems,
+                        void *attrib)
+
+{
+  int numelbdim, numattrdim, attrid, elem_blk_id_ndx, status;
+  size_t num_elem_this_blk, num_attr, start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of elem_blk_id in VAR_ID_EL_BLK array */
+  if ((elem_blk_id_ndx = ex_id_lkup(exoid, EX_ELEM_BLOCK, elem_blk_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no attributes found for NULL block %"PRId64" in file id %d",
+              elem_blk_id,exoid);
+      ex_err("ex_get_partial_elem_attr",errmsg,EX_NULLENTITY);
+      return (EX_WARN);              /* no attributes for this element block */
+    } else {
+      sprintf(errmsg,
+      "Warning: failed to locate element block %"PRId64" in %s array in file id %d",
+              elem_blk_id,VAR_ID_EL_BLK, exoid);
+      ex_err("ex_get_partial_elem_attr",errmsg,exerrval);
+      return (EX_WARN);
+    }
+  }
+
+
+/* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_EL_IN_BLK(elem_blk_id_ndx), &numelbdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+        "Error: failed to locate number of elements for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_get_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numelbdim, &num_elem_this_blk)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to get number of elements for block %"PRId64" in file id %d",
+            elem_blk_id,exoid);
+    ex_err("ex_get_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_BLK(elem_blk_id_ndx), &numattrdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no attributes found for block %"PRId64" in file id %d",
+            elem_blk_id,exoid);
+    ex_err("ex_get_partial_elem_attr",errmsg,EX_MSG);
+    return (EX_WARN);              /* no attributes for this element block */
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numattrdim, &num_attr)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to get number of attributes for block %"PRId64" in file id %d",
+            elem_blk_id,exoid);
+    ex_err("ex_get_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_ATTRIB(elem_blk_id_ndx), &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate attributes for block %"PRId64" in file id %d",
+            elem_blk_id,exoid);
+    ex_err("ex_get_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* do some error checking */
+  if (num_elem_this_blk < (start_elem_num + num_elems - 1)) {
+    exerrval = status;
+    sprintf(errmsg,
+      "Error: requested attributes from too many elements in this block, %"PRId64"",
+            elem_blk_id);
+    ex_err("ex_get_partial_elem_attr",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+
+/* read in the attributes */
+
+  start[0] = --start_elem_num;
+  start[1] = 0;
+
+  count[0] = num_elems;
+  count[1] = num_attr;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, attrid, start, count, attrib);
+  } else {
+    status = nc_get_vara_double(exoid, attrid, start, count, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get attributes for block %"PRId64" in file id %d",
+            elem_blk_id,exoid);
+    ex_err("ex_get_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_elem_conn.c b/exodus/cbind/src/ex_get_partial_elem_conn.c
new file mode 100644
index 0000000..11b8fae
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_elem_conn.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_elem_conn()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      connect            - Pointer to the connectivity vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stddef.h>                     // for NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_conn, etc
+
+/*!
+ * \deprecated use ex_get_partial_conn()
+ * reads the connectivity array for an element block 
+ */
+
+int ex_get_partial_elem_conn (int   exoid,
+                        ex_entity_id   elem_blk_id,
+                        int64_t   start_elem_num,
+                        int64_t   num_elems,
+                        void_int  *connect)
+{
+  return ex_get_partial_conn(exoid, EX_ELEM_BLOCK, elem_blk_id,
+		       start_elem_num, num_elems, connect, NULL, NULL);
+}
diff --git a/exodus/cbind/src/ex_get_partial_elem_map.c b/exodus/cbind/src/ex_get_partial_elem_map.c
new file mode 100644
index 0000000..354577a
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_elem_map.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_num_map, etc
+
+/*
+ * reads the element map with specified ID
+ * \deprecated Use ex_get_partial_num_map()(exoid, EX_ELEM_MAP, map_id, ent_start, ent_count, elem_map) instead
+ */
+
+int ex_get_partial_elem_map (int  exoid,
+			     ex_entity_id  map_id,
+			     int64_t  ent_start,
+			     int64_t  ent_count, 
+			     void_int *elem_map)
+{
+  return ex_get_partial_num_map(exoid, EX_ELEM_MAP, map_id, ent_start, ent_count, elem_map);
+}
diff --git a/exodus/cbind/src/ex_get_partial_elem_num_map.c b/exodus/cbind/src/ex_get_partial_elem_num_map.c
new file mode 100644
index 0000000..a6c784d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_elem_num_map.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* ne_gennm - ex_get_partial_elem_num_map
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	start_ent		starting location for read
+*	int	num_ents		number of elemental points
+*
+* exit conditions - 
+*	int*	elem_map		element number map array
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_ELEM, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_int, etc
+
+/*
+ *  reads the element numbering map from the database; allows element numbers
+ *  to be noncontiguous
+ */
+
+int ex_get_partial_elem_num_map (int  exoid,
+			   int64_t  start_ent,
+			   int64_t  num_ents,
+			   void_int *elem_map)
+{
+  int numelemdim, mapid, status;
+  size_t i;
+  size_t num_elem,  start[1], count[1]; 
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire id's of previously defined dimensions and variables  */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_ELEM, &numelemdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate number of elements in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen (exoid, numelemdim, &num_elem)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of elements in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_ent < 0 || start_ent > num_elem) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: Invalid input to function ex_get_partial_elem_num_map!\n");
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_ents < 0) {
+    exerrval = status;
+    sprintf(errmsg, "Error: Invalid number of entries in map!\n");
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_ent now starts at 1, not 0 */
+  if ((start_ent + num_ents - 1) > num_elem) {
+    exerrval = status;
+    sprintf(errmsg, "Error: request range invalid!\n");
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_ELEM_NUM_MAP, &mapid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: elem numbering map not stored in file id %d; returning default map",
+	    exoid);
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+
+    /* generate default map of 1..n, where n is num_elem */
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      int64_t *lmap = (int64_t*)elem_map;
+      for (i=0; i<num_ents; i++) {
+	lmap[i] = start_ent+i;
+      }
+    } else {
+      int *lmap = (int*)elem_map;
+      for (i=0; i<num_ents; i++) {
+	lmap[i] = start_ent+i;
+      }
+    }
+    return (EX_WARN);
+  }
+
+
+  /* read in the element numbering map  */
+  start[0] = --start_ent;
+  count[0] = num_ents;
+
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_vara_longlong(exoid, mapid, start, count, elem_map);
+  } else {
+    status = nc_get_vara_int(exoid, mapid, start, count, elem_map);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get element number map in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_elem_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return(EX_NOERR);
+
+}
diff --git a/exodus/cbind/src/ex_get_partial_elem_var.c b/exodus/cbind/src/ex_get_partial_elem_var.c
new file mode 100644
index 0000000..c34432f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_elem_var.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_elem_var()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      time_step          - The time step to write this data to.
+ *      elem_var_index     - The index of this elemental variable.
+ *      elem_blk_id        - The ID of the element block being written to.
+ *      num_elem_this_blk  - The number of elements in this block.
+ *      start_elem_num     - The start point for outputting data.
+ *      num_elem           - The number of values to be output.
+ *      elem_var_vals      - Pointer to the vector of values to be output.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_partial_var, etc
+
+/*
+ * reads the values of a single element variable for one element block at
+ * one time step in the database; assume the first time step and
+ * element variable index is 1
+ */
+
+int ex_get_partial_elem_var (int   exoid,
+		       int   time_step,
+		       int   elem_var_index,
+		       ex_entity_id elem_blk_id,
+		       int64_t num_elem_this_blk,
+		       int64_t start_elem_num,
+		       int64_t num_elem,
+		       void *elem_var_vals)
+{
+  return ex_get_partial_var(exoid, time_step, EX_ELEM_BLOCK,
+		      elem_var_index, elem_blk_id,
+		      start_elem_num, num_elem,
+		      elem_var_vals);
+}
diff --git a/exodus/cbind/src/ex_get_partial_id_map.c b/exodus/cbind/src/ex_get_partial_id_map.c
new file mode 100644
index 0000000..eaff955
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_id_map.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2007 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_int, etc
+
+/*
+ * reads the id map
+ */
+
+int ex_get_partial_id_map ( int   exoid,
+			    ex_entity_type map_type,
+			    int64_t   start_entity_num,
+			    int64_t   num_entities,
+			    void_int*  map )
+{
+  int dimid, mapid, status;
+  size_t i;
+  size_t num_entries;
+  size_t start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumentries;
+  const char* vmap;
+  const char* tname;
+
+  switch (map_type) {
+  case EX_NODE_MAP:
+    tname = "node";
+    dnumentries = DIM_NUM_NODES;
+    vmap = VAR_NODE_NUM_MAP;
+    break;
+  case EX_EDGE_MAP:
+    tname = "edge";
+    dnumentries = DIM_NUM_EDGE;
+    vmap = VAR_EDGE_NUM_MAP;
+    break;
+  case EX_FACE_MAP:
+    tname = "face";
+    dnumentries = DIM_NUM_FACE;
+    vmap = VAR_FACE_NUM_MAP;
+    break;
+  case EX_ELEM_MAP:
+    tname = "element";
+    dnumentries = DIM_NUM_ELEM;
+    vmap = VAR_ELEM_NUM_MAP;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg,
+	     "Error: Bad map type (%d) specified for file id %d",
+	     map_type, exoid );
+    ex_err( "ex_get_partial_id_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+  exerrval = 0; /* clear error code */
+
+  /* See if any entries are stored in this file */
+  if (nc_inq_dimid(exoid, dnumentries,&dimid) != NC_NOERR) {
+    return (EX_NOERR);
+  }
+
+  if (nc_inq_varid (exoid, vmap, &mapid) != NC_NOERR) {
+    if ((status = nc_inq_dimlen(exoid, dimid, &num_entries)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of %ss in file id %d", tname, exoid);
+      ex_err("ex_get_partial_id_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    
+    /* generate default map of 1..n, where n is num_entries */
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      int64_t *lmap = (int64_t*)map;
+      for (i=0; i < num_entities; i++) {
+	lmap[i] = start_entity_num+i;
+      }
+    } else {
+      int *lmap = (int*)map;
+      for (i=0; i<num_entities; i++) {
+	lmap[i] = start_entity_num+i;
+      }
+    }
+
+    return (EX_NOERR);
+  }
+
+  start[0] = start_entity_num-1;
+  count[0] = num_entities;
+
+  /* read in the id map  */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_vara_longlong(exoid, mapid, start, count, map);
+  } else {
+    status = nc_get_vara_int(exoid, mapid, start, count, map);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get %s id map in file id %d",
+	    tname, exoid);
+    ex_err("ex_get_partial_id_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_nodal_var.c b/exodus/cbind/src/ex_get_partial_nodal_var.c
new file mode 100644
index 0000000..547da5d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_nodal_var.c
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgnnv - ex_get_partial_nodal_var
+*
+* environment - UNIX
+*
+* entry conditions -
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	time_step		whole time step number
+*	int	nodeal_var_index	index of desired nodal variable
+*       int     start_node		starting location for read
+*	int	num_nodes		number of nodal points
+*
+* exit conditions -
+*	float*	var_vals		array of nodal variable values
+*
+* revision history -
+*
+*  $Id: ne_gnnv.c,v 1.16 2008/01/25 15:47:35 gdsjaar Exp $
+*
+*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_WARN, ex_comp_ws, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*
+ * reads the values of a single nodal variable for a single time step from
+ * the database; assume the first time step and nodal variable index is 1
+ */
+
+int ex_get_partial_nodal_var (int   exoid,
+		        int   time_step,
+		        int   nodal_var_index,
+                        int64_t   start_node,
+		        int64_t   num_nodes,
+		        void *var_vals)
+{
+  int varid;
+  int status;
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined variable */
+
+  if (ex_large_model(exoid) == 0) {
+    /* read values of the nodal variable */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variables in file id %d",
+              exoid);
+      ex_err("ex_get_partial_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = --nodal_var_index;
+    start[2] = --start_node;
+
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = num_nodes;
+
+  } else {
+    /* read values of the nodal variable  -- stored as separate variables... */
+    /* Get the varid.... */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR_NEW(nodal_var_index), &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_get_partial_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = --start_node;
+
+    count[0] = 1;
+    count[1] = num_nodes;
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, varid, start, count, var_vals);
+  } else {
+    status = nc_get_vara_double(exoid, varid, start, count, var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get nodal variables in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_nodal_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_node_num_map.c b/exodus/cbind/src/ex_get_partial_node_num_map.c
new file mode 100644
index 0000000..835dc2e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_node_num_map.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* ne_gnnnm - ex_get_partial_node_num_map
+*
+* environment - UNIX
+*
+* entry conditions -
+*   input parameters:
+*	int	exoid			nemesis file id
+*
+* exit conditions -
+*	int*	node_map		node numbering map array
+*
+* revision history -
+*
+*
+*****************************************************************************/
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_NODES, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_int, etc
+
+
+/*
+ *  reads the node numbering map from the database
+ */
+
+int ex_get_partial_node_num_map (int  exoid,
+                           int64_t  start_ent,
+                           int64_t  num_ents,
+                           void_int *node_map)
+{
+  int     numnodedim, mapid, status;
+  size_t  i;
+  size_t  num_nodes,  start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire id's of previously defined dimensions and variables  */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NODES, &numnodedim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate number of nodes in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numnodedim, &num_nodes)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of nodes in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_ent < 0 || start_ent > num_nodes) {
+    fprintf(stderr, "ERROR: Invalid input to function"
+                    "  ex_get_partial_node_num_map!\n");
+    return (EX_FATAL);
+  }
+
+  if (num_ents < 0) {
+    fprintf(stderr, "ERROR: Invalid number of entries in map!\n");
+    return (EX_FATAL);
+  }
+
+  /* start_ent now starts at 1, not 0 */
+  if ((start_ent + num_ents - 1) > num_nodes) {
+    fprintf(stderr, "ERROR: request range invalid!\n");
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_NODE_NUM_MAP, &mapid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+  "Warning: node numbering map not stored in file id %d; returning default map",
+            exoid);
+    ex_err("ex_get_partial_node_num_map",errmsg,exerrval);
+
+    /* generate default map of 1..n, where n is num_nodes */
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      int64_t *lmap = (int64_t*)node_map;
+      for (i=0; i<num_ents; i++) {
+	lmap[i] = start_ent+i;
+      }
+    } else {
+      int *lmap = (int*)node_map;
+      for (i=0; i<num_ents; i++) {
+	lmap[i] = start_ent+i;
+      }
+    }
+    return (EX_WARN);
+  }
+
+  /* read in the node numbering map  */
+  start[0] = --start_ent;
+  count[0] = num_ents;
+
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_vara_longlong(exoid, mapid, start, count, node_map);
+  } else {
+    status = nc_get_vara_int(exoid, mapid, start, count, node_map);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get node numbering map in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_node_set.c b/exodus/cbind/src/ex_get_partial_node_set.c
new file mode 100644
index 0000000..a9be864
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_node_set.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_node_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to read.
+ *      start_node_num     - The starting index of the nodes to be read.
+ *      num_nodes          - The number of nodes to read in.
+ *      node_set_node_list - List of node IDs in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * reads the node list for a single node set
+ */
+
+int ex_get_partial_node_set (int   exoid,
+                       ex_entity_id node_set_id,
+                       int64_t   start_node_num,
+                       int64_t   num_nodes,
+                       void_int  *node_set_node_list)
+{
+  int     dimid, node_list_id, node_set_id_ndx, status;
+  size_t  num_nodes_in_set, start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any node sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NS, &dimid))  != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no node sets defined in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of node set id in VAR_NS_IDS array */
+  if ((node_set_id_ndx = ex_id_lkup(exoid, EX_NODE_SET, node_set_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: node set %"PRId64" is NULL in file id %d",
+              node_set_id,exoid);
+      ex_err("ex_get_partial_node_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+
+      sprintf(errmsg,
+              "Error: failed to locate node set %"PRId64" in %s in file id %d",
+              node_set_id,VAR_NS_IDS,exoid);
+      ex_err("ex_get_partial_node_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NOD_NS(node_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to locate number of nodes in node set %"PRId64" in file id %d",
+            node_set_id,exoid);
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_nodes_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of nodes in set %"PRId64" in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_node_num < 0 || start_node_num > num_nodes_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_nodes < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of nodes in nodes set!");
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_node_num now starts at 1, not 0 */
+  if ((start_node_num + num_nodes - 1) > num_nodes_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of nodes in set!");
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_NODE_NS(node_set_id_ndx), &node_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate node set %"PRId64" node list in file id %d",
+            node_set_id,exoid);
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* read in the node list array */
+  start[0] = --start_node_num;
+  count[0] = num_nodes;
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, node_list_id, start, count, node_set_node_list);
+  } else {
+    status = nc_get_vara_int(exoid, node_list_id, start, count, node_set_node_list);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get node set node list in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_node_set_df.c b/exodus/cbind/src/ex_get_partial_node_set_df.c
new file mode 100644
index 0000000..83f8934
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_node_set_df.c
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_node_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to read.
+ *      start_num          - The starting index of the dist fact to be read.
+ *      num_df_to_get      - The number of distribution factors to read in.
+ *      node_set_dist_fact - List of distribution factors in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * reads the distribution factors for a single node set
+ */
+
+int ex_get_partial_node_set_df  (int   exoid,
+                           ex_entity_id node_set_id,
+                           int64_t   start_num,
+                           int64_t   num_df_to_get,
+                           void *node_set_dist_fact)
+{
+  int status;
+  int dimid, dist_id, node_set_id_ndx;
+  size_t num_nodes_in_set, start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any node sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NS, &dimid))  != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no node sets defined in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of node set id in VAR_NS_IDS array */
+  if ((node_set_id_ndx = ex_id_lkup(exoid,EX_NODE_SET,node_set_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: node set %"PRId64" is NULL in file id %d",
+              node_set_id,exoid);
+      ex_err("ex_get_partial_node_set_df",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+
+      sprintf(errmsg,
+              "Error: failed to locate node set %"PRId64" in %s in file id %d",
+              node_set_id,VAR_NS_IDS,exoid);
+      ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NOD_NS(node_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to locate number of nodes in node set %"PRId64" in file id %d",
+            node_set_id,exoid);
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_nodes_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of nodes in node set %"PRId64" in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_num < 0 || start_num > num_nodes_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_df_to_get < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of nodes in nodes set!");
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_num now starts at 1, not 0 */
+  if ((start_num + num_df_to_get - 1) > num_nodes_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of nodes in set!");
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_FACT_NS(node_set_id_ndx), &dist_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: dist factors not stored for node set %"PRId64" in file id %d",
+            node_set_id,exoid);
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_WARN);          /* complain - but not too loud */
+  }
+
+
+  /* read in the distribution factors array */
+  start[0] = --start_num;
+  count[0] = num_df_to_get;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, dist_id, start, count, node_set_dist_fact);
+  } else {
+    status = nc_get_vara_double(exoid, dist_id, start, count, node_set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get distribution factors in file id %d",
+            exoid);
+    ex_err("ex_get_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_num_map.c b/exodus/cbind/src/ex_get_partial_num_map.c
new file mode 100644
index 0000000..991206d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_num_map.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgpem - ex_get_partial_elem_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  element map id
+*       int     ent_start               first entry in map
+*       int     ent_count               number of entries in map
+*
+* exit conditions - 
+*       int*    elem_map                element map
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*
+ * reads the element map with specified ID
+ */
+
+int ex_get_partial_num_map (int  exoid,
+			    ex_entity_type map_type,
+			    ex_entity_id  map_id,
+			    int64_t  ent_start,
+			    int64_t  ent_count, 
+			    void_int *map)
+{
+  int dimid, var_id, id_ndx, status;
+  size_t num_mobj, start[1], count[1]; 
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dim_map_size;
+  const char* dim_num_maps;
+
+  switch (map_type) {
+  case EX_NODE_MAP:
+    dim_map_size = DIM_NUM_NODES;
+    dim_num_maps = DIM_NUM_NM;
+    break;
+  case EX_EDGE_MAP:
+    dim_map_size = DIM_NUM_EDGE;
+    dim_num_maps = DIM_NUM_EDM;
+    break;
+  case EX_FACE_MAP:
+    dim_map_size = DIM_NUM_FACE;
+    dim_num_maps = DIM_NUM_FAM;
+    break;
+  case EX_ELEM_MAP:
+    dim_map_size = DIM_NUM_ELEM;
+    dim_num_maps = DIM_NUM_EM;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg, "Bad map type (%d) specified", map_type );
+    ex_err( "ex_get_partial_num_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  exerrval = 0; /* clear error code */
+
+  /* See if file contains any elements...*/
+  if (nc_inq_dimid (exoid, dim_map_size, &dimid) != NC_NOERR) {
+    return (EX_NOERR);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_mobj)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of mesh objects in file id %d", exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (ent_start <= 0 || ent_start > num_mobj) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: start count is invalid in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ent_count < 0) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: Invalid count value in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ent_start+ent_count-1 > num_mobj) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: start+count-1 is larger than element count in file id %d",
+	    exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* first check if any maps have been defined */
+  if ((status = nc_inq_dimid (exoid, dim_num_maps, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no %ss defined in file id %d",
+	    ex_name_of_object(map_type), exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of element map id property array */
+  id_ndx = ex_id_lkup(exoid,map_type,map_id);
+  if (exerrval != 0) {
+    sprintf(errmsg,
+	    "Error: failed to locate %s id %"PRId64" in id variable in file id %d",
+	    ex_name_of_object(map_type),map_id,exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_varid(exoid, ex_name_of_map(map_type,id_ndx), &var_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate %s %"PRId64" in file id %d",
+	    ex_name_of_object(map_type),map_id,exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* read in the map */
+  start[0] = ent_start-1;
+  count[0] = ent_count;
+
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_get_vara_longlong(exoid, var_id, start, count, map);
+  } else {
+    status = nc_get_vara_int(exoid, var_id, start, count, map);
+  }
+
+  if (status == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get %s in file id %d",
+	    ex_name_of_object(map_type),exoid);
+    ex_err("ex_get_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_one_attr.c b/exodus/cbind/src/ex_get_partial_one_attr.c
new file mode 100644
index 0000000..97c7844
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_one_attr.c
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgeat - ex_get_partial_one_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge, face, elem block)
+*       int     obj_id                  object id (edge face, elem block ID)
+*       int     start_num               starting index of attributes to be returned.
+*       int     num_ent                 number of entities to read attributes for.
+*
+* exit conditions - 
+*       float*  attrib                  array of attributes
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t, ptrdiff_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+ * reads the specified attribute for a subsect of a block
+ * \param      exoid         exodus file id
+ * \param      obj_type      object type (edge, face, elem block)
+ * \param      obj_id        object id (edge, face, elem block ID)
+ * \param      start_num     the starting index of the attributes to be returned.
+ * \param      num_ent       the number of entities to read attributes for.
+ * \param      attrib_index  index of attribute to write
+ * \param      attrib         array of attributes
+ */
+/*
+ */
+int ex_get_partial_one_attr( int   exoid,
+		       ex_entity_type obj_type,
+		       ex_entity_id   obj_id,
+		       int64_t   start_num,
+		       int64_t   num_ent,
+		       int   attrib_index,
+		       void* attrib )
+
+{
+  int status;
+  int attrid, obj_id_ndx;
+  int temp;
+  size_t num_entries_this_obj, num_attr;
+  size_t start[2], count[2];
+  ptrdiff_t stride[2];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumobjent;
+  const char* dnumobjatt;
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  if (num_ent == 0)
+    return 0;
+  /* Determine index of obj_id in vobjids array */
+  if (obj_type != EX_NODAL) {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_get_partial_one_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id%"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id, exoid);
+	ex_err("ex_get_partial_one_attr",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vattrbname = VAR_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vattrbname = VAR_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vattrbname = VAR_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vattrbname = VAR_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vattrbname = VAR_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vattrbname = VAR_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vattrbname = VAR_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vattrbname = VAR_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vattrbname = VAR_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_get_partial_one_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if (ex_get_dimension(exoid, dnumobjent,"entries", &num_entries_this_obj, &temp, "ex_get_partial_one_attr") != NC_NOERR)
+    return EX_FATAL;
+  
+  if (start_num + num_ent -1 > num_entries_this_obj) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: start index (%"PRId64") + count (%"PRId64") is larger than total number of entities (%"ST_ZU") in file id %d",
+	    start_num, num_ent, num_entries_this_obj, exoid);
+    ex_err("ex_get_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  if (ex_get_dimension(exoid, dnumobjatt,"attributes", &num_attr, &temp, "ex_get_partial_one_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if (attrib_index < 1 || attrib_index > (int)num_attr) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+            "Error: Invalid attribute index specified: %d.  Valid range is 1 to %d for %s %"PRId64" in file id %d",
+            attrib_index, (int)num_attr, ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_get_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, vattrbname, &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_get_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+    
+  /* read in the attributes */
+  start[0] = start_num-1;
+  start[1] = attrib_index-1;
+
+  count[0] = num_ent;
+  count[1] = 1;
+
+  stride[0] = 1;
+  stride[1] = num_attr;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vars_float(exoid, attrid, start, count, stride, attrib);
+  } else {
+    status = nc_get_vars_double(exoid, attrid, start, count, stride, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get attribute %d for %s %"PRId64" in file id %d",
+            attrib_index, ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_get_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_set_dist_fact.c b/exodus/cbind/src/ex_get_partial_set_dist_fact.c
new file mode 100644
index 0000000..7b1de45
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_set_dist_fact.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+ * reads the distribution factors for a single set
+ */
+
+int ex_get_partial_set_dist_fact (int   exoid,
+				  ex_entity_type set_type,
+				  ex_entity_id   set_id,
+				  int64_t   offset,
+				  int64_t   num_to_put,
+				  void *set_dist_fact)
+{
+
+  int dimid, dist_id, set_id_ndx;
+  int status;
+  size_t start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+  char* factptr = NULL;
+ 
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid (exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no %s sets stored in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_get_partial_set_dist_fact",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid,set_type,set_id);
+  if (exerrval != 0)  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: %s set %"PRId64" is NULL in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_partial_set_dist_fact",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s set %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_partial_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    factptr = VAR_FACT_NS(set_id_ndx);
+  }
+  else if (set_type == EX_EDGE_SET) {
+    factptr = VAR_FACT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    factptr = VAR_FACT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    factptr = VAR_FACT_SS(set_id_ndx);
+  }
+  if (set_type == EX_ELEM_SET) {
+    factptr = VAR_FACT_ELS(set_id_ndx);
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_varid(exoid, factptr, &dist_id)) != NC_NOERR) {
+    exerrval = status;
+    /* not an error for node sets because this is how we check that df's exist */
+    if (set_type == EX_NODE_SET) {
+      sprintf(errmsg,
+	      "Warning: dist factors not stored for %s set %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id, exoid);
+      ex_err("ex_get_partial_set_dist_fact",errmsg,exerrval);
+      return (EX_WARN);         /* complain - but not too loud */
+    }
+    /* is an error for other sets */
+    else  {
+      sprintf(errmsg,
+	      "Error: failed to locate dist factors list for %s set %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_partial_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* read in the distribution factors array */
+  start[0] = offset-1;
+  count[0] = num_to_put;
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, dist_id, start, count, set_dist_fact);
+  } else {
+    status = nc_get_vara_double(exoid, dist_id, start, count, set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get dist factors list for %s set %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_get_partial_set_dist_fact",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_side_set.c b/exodus/cbind/src/ex_get_partial_side_set.c
new file mode 100644
index 0000000..3c66c48
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_side_set.c
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_side_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to read.
+ *      start_side_num     - The starting index of the sides to be read.
+ *      num_sides          - The number of sides to read in.
+ *      side_set_elem_list - List of element IDs in side set.
+ *      side_set_side_list - List of side IDs in side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_int, etc
+
+
+/*
+ * reads the side set element list and side set side list for a single side set
+ */
+
+int ex_get_partial_side_set (int   exoid,
+                       ex_entity_id   side_set_id,
+                       int64_t   start_side_num,
+                       int64_t   num_sides,
+                       void_int  *side_set_elem_list,
+                       void_int  *side_set_side_list)
+{
+
+  int      dimid, elem_list_id, side_list_id, status;
+  int      side_set_id_ndx;
+  size_t   num_side_in_set, count[1], start[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_SS, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no side sets stored in file id %d",
+            exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of side set id in VAR_SS_IDS array */
+  if ((side_set_id_ndx = ex_id_lkup(exoid, EX_SIDE_SET, side_set_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: side set %"PRId64" is NULL in file id %d",
+              side_set_id,exoid);
+      ex_err("ex_get_partial_side_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+
+      sprintf(errmsg,
+	      "Error: failed to locate side set id %"PRId64" in %s array in file id %d",
+              side_set_id, VAR_SS_IDS, exoid);
+      ex_err("ex_get_partial_side_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_SIDE_SS(side_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of sides in side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_side_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of sides in side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_ELEM_SS(side_set_id_ndx), &elem_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate element list for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_SIDE_SS(side_set_id_ndx), &side_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate side list for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of side numbers */
+  if (start_side_num < 0 || start_side_num > num_side_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_sides < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of elements in side set!");
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_side_num now starts at 1, not 0 */
+  if ((start_side_num + num_sides - 1) > num_side_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of elements in set!");
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* read in the element list and side list arrays */
+  start[0] = --start_side_num;
+  count[0] = num_sides;
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, elem_list_id, start, count, side_set_elem_list);
+  } else {
+    status = nc_get_vara_int(exoid, elem_list_id, start, count, side_set_elem_list);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get element list for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_get_vara_longlong(exoid, side_list_id, start, count, side_set_side_list);
+  } else {
+    status = nc_get_vara_int(exoid, side_list_id, start, count, side_set_side_list);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get side list for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_side_set_df.c b/exodus/cbind/src/ex_get_partial_side_set_df.c
new file mode 100644
index 0000000..28b59c9
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_side_set_df.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_get_partial_side_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to read.
+ *      start_side_num     - The starting index of the sides to be read.
+ *      num_sides          - The number of sides to read in.
+ *      side_set_dist_fact - List of side IDs in side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+int ex_get_partial_side_set_df (int   exoid,
+                          ex_entity_id   side_set_id,
+                          int64_t   start_num,
+                          int64_t   num_df_to_get,
+                          void *side_set_dist_fact)
+{
+
+  int dimid, dist_id, side_set_id_ndx, status;
+  size_t num_df_in_set, count[1], start[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_SS, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no side sets stored in file id %d",
+            exoid);
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of side set id in VAR_SS_IDS array */
+  if ((side_set_id_ndx = ex_id_lkup(exoid,EX_SIDE_SET,side_set_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: side set %"PRId64" is NULL in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_get_partial_side_set_df",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate side set %"PRId64" in %s array in file id %d",
+              side_set_id, VAR_SS_IDS, exoid);
+      ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_DF_SS(side_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: dist factors not stored for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_WARN);		/* complain - but not too loud */
+  }
+
+  if ((status = nc_inq_dimlen (exoid, dimid, &num_df_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of dist factors in side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_num < 0 || start_num > num_df_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_df_to_get < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of df's to get!");
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_num now starts at 1, not 0 */
+  if ((start_num + num_df_to_get - 1) > num_df_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of df's in set!");
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_FACT_SS(side_set_id_ndx), &dist_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate dist factors list for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* read in the distribution factors array */
+  start[0] = --start_num;
+  count[0] = num_df_to_get;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float (exoid, dist_id, start, count, side_set_dist_fact);
+  } else {
+    status = nc_get_vara_double (exoid, dist_id, start, count, side_set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get dist factors list for side set %"PRId64" in file id %d",
+            side_set_id,exoid);
+    ex_err("ex_get_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_partial_var.c b/exodus/cbind/src/ex_get_partial_var.c
new file mode 100644
index 0000000..6bcd14b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_partial_var.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*
+ * reads the values of a single element variable for one element block at 
+ * one time step in the database; assume the first time step and
+ * element variable index is 1
+ */
+
+/*!
+ * reads the values of a single variable for a partial block at one time
+ * step from the database; assume the first time step and variable index
+ * and start_index are 1
+ * \param      exoid           exodus file id
+ * \param      time_step       time step number
+ * \param      var_type        type (edge block, face block, edge set, ... )
+ * \param      var_index       element variable index
+ * \param      obj_id          element block id
+ * \param      start_index     index of first entity in block to read (1-based)
+ * \param      num_entities    number of entries to read in this block/set
+ * \param      var_vals        the values to read
+ */
+
+int ex_get_partial_var( int   exoid,
+		  int   time_step,
+		  ex_entity_type var_type,
+		  int   var_index,
+		  ex_entity_id   obj_id, 
+		  int64_t   start_index,
+		  int64_t   num_entities,
+		  void* var_vals )
+{
+  int status = 0;
+  int varid, obj_id_ndx;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+
+  if (num_entities == 0)
+    return status;
+  
+  if (var_type == EX_NODAL) {
+    /* FIXME: Special case: ignore obj_id, possible large_file complications, etc. */
+    return ex_get_partial_nodal_var( exoid, time_step, var_index, start_index, num_entities, var_vals );
+  } else if (var_type == EX_GLOBAL) {
+    /* FIXME: Special case: all vars stored in 2-D single array. */
+    return ex_get_glob_vars( exoid, time_step, num_entities, var_vals );
+  }
+   
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in VAR_ID_EL_BLK array */
+  obj_id_ndx = ex_id_lkup(exoid,var_type,obj_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: no %s variables for NULL block %"PRId64" in file id %d",
+	      ex_name_of_object(var_type), obj_id,exoid);
+      ex_err("ex_get_partial_var",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in id variable in file id %d",
+	      ex_name_of_object(var_type), obj_id, exoid);
+      ex_err("ex_get_partial_var",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire previously defined variable */
+
+  if((status = nc_inq_varid(exoid, ex_name_var_of_object(var_type,var_index,
+							 obj_id_ndx), &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s %"PRId64" var %d in file id %d",
+	    ex_name_of_object(var_type),obj_id,var_index,exoid); 
+    ex_err("ex_get_partial_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* read values of element variable */
+  start[0] = --time_step;
+  start[1] = start_index-1;
+
+  count[0] = 1;
+  count[1] = num_entities;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, varid, start, count, var_vals);
+  } else {
+    status = nc_get_vara_double(exoid, varid, start, count, var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get %s %"PRId64" variable %d in file id %d", 
+	    ex_name_of_object(var_type), obj_id, var_index,exoid);
+    ex_err("ex_get_partial_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_processor_elem_maps.c b/exodus/cbind/src/ex_get_processor_elem_maps.c
new file mode 100644
index 0000000..75a6b4d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_processor_elem_maps.c
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_elem_map()
+ *
+ *****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      elem_mapi       - Pointer to vector for retrieval of internal
+ *                        FEM element IDs.
+ *      elem_mapb       - Pointer to vector for retrieval of border
+ *                        FEM element IDs.
+ *      processor       - The processor the file being read was written for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, VAR_INT_E_STAT, etc
+
+
+
+int ex_get_processor_elem_maps(int  exoid,
+			       void_int *elem_mapi,
+			       void_int *elem_mapb,
+			       int  processor
+			       )
+{
+  const char  *func_name="ex_get_processor_elem_maps";
+
+  char    ftype[2];
+  int     dimid, varid, status;
+  size_t  start[1], count[1];
+  int64_t varidx[2];
+  int  emstat;
+
+  char   errmsg[MAX_ERR_LENGTH];
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: unable to find file type for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Check the status of the internal element map */
+  if ((status = nc_inq_varid(exoid, VAR_INT_E_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = processor;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &emstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file ID %d",
+            VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (emstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_ELEM_MAP_INT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_ELEM_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    if (varidx[1] == -1) {
+      /* Get the size of the internal element map */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_INT_ELEMS, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_INT_ELEMS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_INT_ELEMS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      varidx[1] = count[0];
+    }
+
+    /* Get the map */
+    if ((status = nc_inq_varid(exoid, VAR_ELEM_MAP_INT, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_ELEM_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_get_vara_longlong(exoid, varid, start, count, elem_mapi);
+    } else {
+      status = nc_get_vara_int(exoid, varid, start, count, elem_mapi);
+    }
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_ELEM_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (emstat == 1)" */
+
+  /* Check the status of the internal element map */
+  if ((status = nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = processor;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &emstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get status for \"%s\" from file ID %d",
+	    VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (emstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_ELEM_MAP_BOR_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find index variable, \"%s\", in file ID %d",
+	      VAR_ELEM_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    if (varidx[1] == -1) {
+      /* Get the size of the border element map */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_BOR_ELEMS, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find dimension ID for \"%s\" in file ID %d",
+		DIM_NUM_BOR_ELEMS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+		DIM_NUM_BOR_ELEMS, exoid);
+	ex_err(func_name, errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      varidx[1] = count[0];
+    }
+
+    /* Get the map */
+    if ((status = nc_inq_varid(exoid, VAR_ELEM_MAP_BOR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find variable ID for \"%s\" in file ID %d",
+	      VAR_ELEM_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_get_vara_longlong(exoid, varid, start, count, elem_mapb);
+    } else {
+      status = nc_get_vara_int(exoid, varid, start, count, elem_mapb);
+    }
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get variable \"%s\" from file ID %d",
+	      VAR_ELEM_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (emstat == 1)" */
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_processor_node_maps.c b/exodus/cbind/src/ex_get_processor_node_maps.c
new file mode 100644
index 0000000..355fb5d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_processor_node_maps.c
@@ -0,0 +1,349 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_node_map()
+ *****************************************************************************
+ * This function retrieves the nodal map.
+ *****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      node_mapi       - Pointer to vector for retrieval of internal FEM
+ *                        nodal IDs.
+ *      node_mapb       - Pointer to vector for retrieval of border FEM
+ *                        nodal IDs.
+ *      node_mape       - Pointer to vector for retrieval of external FEM
+ *                        nodal IDs.
+ *      processor       - The processor the file being read was written for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_BOR_NODES, etc
+
+
+
+int ex_get_processor_node_maps(int  exoid,
+			       void_int *node_mapi,
+			       void_int *node_mapb,
+			       void_int *node_mape,
+			       int  processor
+			       )
+{
+  const char   *func_name="ex_get_processor_node_maps";
+
+  char    ftype[2];
+  int     status, varid, dimid;
+  size_t  start[1], count[1];
+  int64_t varidx[2];
+  int  nmstat;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: unable to find file type for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the status of this node map */
+  if ((status = nc_inq_varid(exoid, VAR_INT_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = processor;
+
+  if (nc_get_var1_int(exoid, varid, start, &nmstat) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" in file ID %d",
+            VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_NODE_MAP_INT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_NODE_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension */
+    if (varidx[1] == -1) {
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_INT_NODES, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_INT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_INT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_NODE_MAP_INT, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NODE_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_get_vara_longlong(exoid, varid, start, count, node_mapi);
+    } else {
+      status = nc_get_vara_int(exoid, varid, start, count, node_mapi);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_NODE_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (nmstat == 1)" */
+
+  /* Get the status of this node map */
+  if ((status = nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = processor;
+
+  if (nc_get_var1_int(exoid, varid, start, &nmstat) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file ID %d",
+            VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_NODE_MAP_BOR_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_NODE_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension */
+    if (varidx[1] == -1) {
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_BOR_NODES, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_BOR_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_BOR_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_NODE_MAP_BOR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NODE_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_get_vara_longlong(exoid, varid, start, count, node_mapb);
+    } else {
+      status = nc_get_vara_int(exoid, varid, start, count, node_mapb);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_NODE_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (nmstat == 1)" */
+
+  /* Get the status of this node map */
+  if ((status = nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = processor;
+
+  if (nc_get_var1_int(exoid, varid, start, &nmstat) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file ID %d",
+            VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_NODE_MAP_EXT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_NODE_MAP_EXT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension */
+    if (varidx[1] == -1) {
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_EXT_NODES, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_EXT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_EXT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_NODE_MAP_EXT, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NODE_MAP_EXT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_get_vara_longlong(exoid, varid, start, count, node_mape);
+    } else {
+      status = nc_get_vara_int(exoid, varid, start, count, node_mape);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_NODE_MAP_EXT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (nmstat == 1)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_prop.c b/exodus/cbind/src/ex_get_prop.c
new file mode 100644
index 0000000..6264f6d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_prop.c
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strcpy, memset, strcmp
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_att_text, etc
+
+/*!
+
+The function ex_get_prop() reads an integer object property value
+stored for a single element block, node set, or side set.
+
+\return In case of an error, ex_get_prop() returns a negative number; a
+warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  invalid object type specified.
+  -  a warning value is returned if a property with the specified name is not found.
+
+\param[in] exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] obj_type   Type of object; use one of the options in the table below.
+\param[in] obj_id     The element block, node set, or side set ID.
+\param[in] prop_name  The name of the property (maximum length is \p MAX_STR_LENGTH ) for
+                      which the value is desired.
+\param[out]  value    Returned value of the property.
+
+<table>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_MAP   </td><td>  Element Map entity type  </td></tr>
+<tr><td> \c EX_NODE_MAP   </td><td>  Node Map entity type     </td></tr>
+<tr><td> \c EX_EDGE_MAP   </td><td>  Edge Map entity type     </td></tr>
+<tr><td> \c EX_FACE_MAP   </td><td>  Face Map entity type     </td></tr>
+</table>
+
+For an example of code to read an object property, refer to the
+description for ex_get_prop_names().
+
+*/
+
+int ex_get_prop (int   exoid,
+                 ex_entity_type obj_type,
+                 ex_entity_id   obj_id,
+                 const char *prop_name,
+                 void_int  *value)
+{
+   int status;
+   int num_props, i, propid;
+   int found = EX_FALSE;
+   size_t start[1]; 
+   char name[MAX_VAR_NAME_LENGTH+1];
+   char tmpstr[MAX_STR_LENGTH+1];
+
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval  = 0; /* clear error code */
+
+   /* open appropriate variable, depending on obj_type and prop_name */
+   num_props = ex_get_num_props(exoid,obj_type);
+
+   for (i=1; i<=num_props; i++) {
+     switch (obj_type){
+       case EX_ELEM_BLOCK:
+         strcpy (name, VAR_EB_PROP(i));
+         break;
+       case EX_EDGE_BLOCK:
+         strcpy (name, VAR_ED_PROP(i));
+         break;
+       case EX_FACE_BLOCK:
+         strcpy (name, VAR_FA_PROP(i));
+         break;
+       case EX_NODE_SET:
+         strcpy (name, VAR_NS_PROP(i));
+         break;
+       case EX_EDGE_SET:
+         strcpy (name, VAR_ES_PROP(i));
+         break;
+       case EX_FACE_SET:
+         strcpy (name, VAR_FS_PROP(i));
+         break;
+       case EX_ELEM_SET:
+         strcpy (name, VAR_ELS_PROP(i));
+         break;
+       case EX_SIDE_SET:
+         strcpy (name, VAR_SS_PROP(i));
+         break;
+       case EX_ELEM_MAP:
+         strcpy (name, VAR_EM_PROP(i));
+         break;
+       case EX_FACE_MAP:
+         strcpy (name, VAR_FAM_PROP(i));
+         break;
+       case EX_EDGE_MAP:
+         strcpy (name, VAR_EDM_PROP(i));
+         break;
+       case EX_NODE_MAP:
+         strcpy (name, VAR_NM_PROP(i));
+         break;
+       default:
+         exerrval = EX_BADPARAM;
+         sprintf(errmsg, "Error: object type %d not supported; file id %d",
+           obj_type, exoid);
+         ex_err("ex_get_prop",errmsg,exerrval);
+         return(EX_FATAL);
+     }
+
+     if ((status = nc_inq_varid(exoid, name, &propid)) != NC_NOERR) {
+       exerrval = status;
+       sprintf(errmsg,
+          "Error: failed to locate property array %s in file id %d",
+               name, exoid);
+       ex_err("ex_get_prop",errmsg,exerrval);
+       return (EX_FATAL);
+     }
+
+     /*   compare stored attribute name with passed property name   */
+     memset(tmpstr, 0, MAX_STR_LENGTH+1);
+     if ((status = nc_get_att_text(exoid, propid, ATT_PROP_NAME, tmpstr)) != NC_NOERR) {
+       exerrval = status;
+       sprintf(errmsg,
+              "Error: failed to get property name in file id %d", exoid);
+       ex_err("ex_get_prop",errmsg,exerrval);
+       return (EX_FATAL);
+     }
+
+     if (strcmp(tmpstr, prop_name) == 0) {
+       found = EX_TRUE;
+       break;
+     }
+   }
+
+   /* if property is not found, return warning */
+   if (!found) {
+     exerrval = EX_BADPARAM;
+     sprintf(errmsg,
+       "Warning: %s property %s not defined in file id %d",
+	     ex_name_of_object(obj_type), prop_name, exoid);
+     ex_err("ex_get_prop",errmsg,exerrval);
+     return (EX_WARN);
+   }
+
+   /* find index into property array using obj_id; read value from property */
+   /* array at proper index; ex_id_lkup returns an index that is 1-based,   */
+   /* but netcdf expects 0-based arrays so subtract 1                       */
+   start[0] = ex_id_lkup (exoid, obj_type, obj_id);
+   if (exerrval != 0)  {
+     if (exerrval == EX_NULLENTITY) {
+       sprintf(errmsg,
+              "Warning: %s id %"PRId64" is NULL in file id %d",
+               ex_name_of_object(obj_type), obj_id, exoid);
+       ex_err("ex_get_prop",errmsg,EX_NULLENTITY);
+       return (EX_WARN);
+     } else {
+       exerrval = status;
+       sprintf(errmsg,
+             "Error: failed to locate id %"PRId64" in %s property array in file id %d",
+               obj_id, ex_name_of_object(obj_type), exoid);
+       ex_err("ex_get_prop",errmsg,exerrval);
+       return (EX_FATAL);
+     }
+   }
+   start[0] = start[0] - 1;
+
+   if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+     long long l_val;
+     status = nc_get_var1_longlong (exoid, propid, start, &l_val);
+     if (status == NC_NOERR) {
+       int64_t *val = (int64_t*)value;
+       *val = l_val;
+     }
+   } else {
+     int     i_val;
+     status = nc_get_var1_int (exoid, propid, start, &i_val);
+     if (status == NC_NOERR) {
+       int *val = (int*)value;
+       *val = i_val;
+     }
+   }
+
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to read value in %s property array in file id %d",
+             ex_name_of_object(obj_type), exoid);
+     ex_err("ex_get_prop",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_prop_array.c b/exodus/cbind/src/ex_get_prop_array.c
new file mode 100644
index 0000000..c11dcef
--- /dev/null
+++ b/exodus/cbind/src/ex_get_prop_array.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgpa - ex_get_prop_array: read object property array
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                type of object (element block, node
+*                                               set or side set)
+*       char*   prop_name               name of the property for which the
+*                                               values will be read
+*       
+* exit conditions - 
+*       int*    values                  returned array of property values
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strcpy, memset, strcmp
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ATT_PROP_NAME, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_att_text, etc
+
+/*!
+  
+The function ex_get_prop_array() reads an array of integer property
+values for all element blocks, node sets, or side sets. The order of
+the values in the array correspond to the order in which the element
+blocks, node sets, or side sets were introduced into the file. Before
+this function is invoked, memory must be allocated for the returned
+array of(\c num_elem_blk, \c num_node_sets, or {num_side_sets})
+integer values.
+
+
+This function can be used in place of
+ - ex_get_elem_blk_ids(), 
+ - ex_get_node_set_ids(), and 
+ - ex_get_side_set_ids()
+to get element block, node set, and side set IDs, respectively, by
+requesting the property name \b ID. One should also note that this
+same function can be accomplished with multiple calls to
+ex_get_prop().
+
+\return In case of an error, ex_get_prop_array() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  invalid object type specified.
+  -  a warning value is returned if a property with the specified name is not found.
+
+\param[in]  exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  obj_type   Type of object; use one of the options in the table below.
+\param[in]  prop_name  The name of the property (maximum length of \p MAX_STR_LENGTH )
+                       for which the values are desired.
+\param[out]  values    Returned array of property values.
+
+<table>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_MAP   </td><td>  Element Map entity type  </td></tr>
+<tr><td> \c EX_NODE_MAP   </td><td>  Node Map entity type     </td></tr>
+<tr><td> \c EX_EDGE_MAP   </td><td>  Edge Map entity type     </td></tr>
+<tr><td> \c EX_FACE_MAP   </td><td>  Face Map entity type     </td></tr>
+</table>
+
+For an example of code to read an array of object properties, refer to
+the description for ex_get_prop_names().
+*/
+
+int ex_get_prop_array (int   exoid,
+                       ex_entity_type obj_type,
+                       const char *prop_name,
+                       void_int  *values)
+{
+   int num_props, i, propid, status;
+   int found = EX_FALSE;
+   char name[MAX_VAR_NAME_LENGTH+1];
+   char tmpstr[MAX_STR_LENGTH+1];
+
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval  = 0; /* clear error code */
+
+/* open appropriate variable, depending on obj_type and prop_name */
+
+   num_props = ex_get_num_props(exoid, obj_type);
+
+   for (i=1; i<=num_props; i++)
+   {
+     switch (obj_type){
+       case EX_ELEM_BLOCK:
+         strcpy (name, VAR_EB_PROP(i));
+         break;
+       case EX_EDGE_BLOCK:
+         strcpy (name, VAR_ED_PROP(i));
+         break;
+       case EX_FACE_BLOCK:
+         strcpy (name, VAR_FA_PROP(i));
+         break;
+       case EX_NODE_SET:
+         strcpy (name, VAR_NS_PROP(i));
+         break;
+       case EX_EDGE_SET:
+         strcpy (name, VAR_ES_PROP(i));
+         break;
+       case EX_FACE_SET:
+         strcpy (name, VAR_FS_PROP(i));
+         break;
+       case EX_ELEM_SET:
+         strcpy (name, VAR_ELS_PROP(i));
+         break;
+       case EX_SIDE_SET:
+         strcpy (name, VAR_SS_PROP(i));
+         break;
+       case EX_ELEM_MAP:
+         strcpy (name, VAR_EM_PROP(i));
+         break;
+       case EX_FACE_MAP:
+         strcpy (name, VAR_FAM_PROP(i));
+         break;
+       case EX_EDGE_MAP:
+         strcpy (name, VAR_EDM_PROP(i));
+         break;
+       case EX_NODE_MAP:
+         strcpy (name, VAR_NM_PROP(i));
+         break;
+       default:
+         exerrval = EX_BADPARAM;
+         sprintf(errmsg, "Error: object type %d not supported; file id %d",
+           obj_type, exoid);
+         ex_err("ex_get_prop_array",errmsg,exerrval);
+         return(EX_FATAL);
+     }
+
+     if ((status = nc_inq_varid(exoid, name, &propid)) != NC_NOERR) {
+       exerrval = status;
+       sprintf(errmsg,
+          "Error: failed to locate property array %s in file id %d",
+               name, exoid);
+       ex_err("ex_get_prop_array",errmsg,exerrval);
+       return (EX_FATAL);
+     }
+
+     /*   compare stored attribute name with passed property name   */
+     memset(tmpstr, 0, MAX_STR_LENGTH+1);
+     if ((status = nc_get_att_text(exoid, propid, ATT_PROP_NAME, tmpstr)) != NC_NOERR) {
+       exerrval = status;
+       sprintf(errmsg,
+              "Error: failed to get property name in file id %d", exoid);
+       ex_err("ex_get_prop_array",errmsg,exerrval);
+       return (EX_FATAL);
+     }
+
+     if (strcmp(tmpstr, prop_name) == 0) {
+       found = EX_TRUE;
+       break;
+     }
+   }
+
+   /* if property is not found, return warning */
+   if (!found) {
+     exerrval = EX_BADPARAM;
+     sprintf(errmsg,
+       "Warning: object type %d, property %s not defined in file id %d",
+        obj_type, prop_name, exoid);
+     ex_err("ex_get_prop_array",errmsg,exerrval);
+     return (EX_WARN);
+   }
+
+   /* read num_obj values from property variable */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_get_var_longlong(exoid, propid, values);
+  } else {
+    status = nc_get_var_int(exoid, propid, values);
+  }
+
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to read values in %s property array in file id %d",
+             ex_name_of_object(obj_type), exoid);
+     ex_err("ex_get_prop_array",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_prop_names.c b/exodus/cbind/src/ex_get_prop_names.c
new file mode 100644
index 0000000..f8d3065
--- /dev/null
+++ b/exodus/cbind/src/ex_get_prop_names.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strcpy
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ATT_PROP_NAME, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_att_text, etc
+
+/*!
+  
+The function ex_get_prop_names() returns names of integer properties
+stored for an element block, node set, or side set. The number of
+properties (needed to allocate space for the property names) can be
+obtained via a call to ex_inquire() or ex_inquire_int().
+
+\return In case of an error, ex_get_prop_names() returns a negative number; a
+warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  invalid object type specified.
+
+
+\param[in]   exoid        exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]   obj_type     Type of object; use one of the options in the table below.
+\param[out]  prop_names   Returned array containing \c num_props (obtained from call to
+                          ex_inquire() or ex_inquire_int()) names (of maximum length
+			  \p MAX_STR_LENGTH ) of properties to be stored. \b ID, a
+			  reserved property name, will be the first name in the array.
+
+<table>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_MAP   </td><td>  Element Map entity type  </td></tr>
+<tr><td> \c EX_NODE_MAP   </td><td>  Node Map entity type     </td></tr>
+<tr><td> \c EX_EDGE_MAP   </td><td>  Edge Map entity type     </td></tr>
+<tr><td> \c EX_FACE_MAP   </td><td>  Face Map entity type     </td></tr>
+</table>
+
+As an example, the following code segment reads in properties assigned
+to node sets:
+
+\code
+int error, exoid, num_props, *prop_values;
+char *prop_names[MAX_PROPS];
+
+\comment{read node set properties}
+num_props = ex_inquire_int(exoid, EX_INQ_NS_PROP);
+
+for (i=0; i < num_props; i++) {
+   prop_names[i] = (char *) malloc ((MAX_STR_LENGTH+1), sizeof(char));
+   prop_values = (int *) malloc (num_node_sets, sizeof(int));
+}
+
+error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+
+for (i=0; i < num_props; i++) {
+   error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                             prop_values);
+}
+\endcode
+
+*/
+
+int ex_get_prop_names (int    exoid,
+                       ex_entity_type obj_type,
+                       char **prop_names)
+{
+  int status;
+  int i, num_props, propid;
+  char var_name[12];
+  size_t att_len;
+  nc_type att_type;
+  int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;
+
+  /* determine which type of object property names are desired for */
+
+  num_props = ex_get_num_props (exoid, obj_type);
+
+  for (i=0; i<num_props; i++) {
+    switch (obj_type) {
+    case EX_ELEM_BLOCK:
+      strcpy (var_name, VAR_EB_PROP(i+1));
+      break;
+    case EX_FACE_BLOCK:
+      strcpy (var_name, VAR_FA_PROP(i+1));
+      break;
+    case EX_EDGE_BLOCK:
+      strcpy (var_name, VAR_ED_PROP(i+1));
+      break;
+    case EX_NODE_SET:
+      strcpy (var_name, VAR_NS_PROP(i+1));
+      break;
+    case EX_SIDE_SET:
+      strcpy (var_name, VAR_SS_PROP(i+1));
+      break;
+    case EX_EDGE_SET:
+      strcpy (var_name, VAR_ES_PROP(i+1));
+      break;
+    case EX_FACE_SET:
+      strcpy (var_name, VAR_FS_PROP(i+1));
+      break;
+    case EX_ELEM_SET:
+      strcpy (var_name, VAR_ELS_PROP(i+1));
+      break;
+    case EX_ELEM_MAP:
+      strcpy (var_name, VAR_EM_PROP(i+1));
+      break;
+    case EX_FACE_MAP:
+      strcpy (var_name, VAR_FAM_PROP(i+1));
+      break;
+    case EX_EDGE_MAP:
+      strcpy (var_name, VAR_EDM_PROP(i+1));
+      break;
+    case EX_NODE_MAP:
+      strcpy (var_name, VAR_NM_PROP(i+1));
+      break;
+    default:
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg, "Error: object type %d not supported; file id %d",
+	      obj_type, exoid);
+      ex_err("ex_get_prop_names",errmsg,EX_BADPARAM);
+      return(EX_FATAL);
+    }
+
+    if ((status = nc_inq_varid(exoid, var_name, &propid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate property array %s in file id %d",
+	      var_name, exoid);
+      ex_err("ex_get_prop_names",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /*   for each property, read the "name" attribute of property array variable */
+    if ((status = nc_inq_att(exoid, propid, ATT_PROP_NAME, &att_type, &att_len)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get property attributes (type, len) in file id %d", exoid);
+      ex_err("ex_get_prop_names",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (att_len-1 <= api_name_size) {
+      /* Client has large enough char string to hold text... */
+      if ((status = nc_get_att_text(exoid, propid, ATT_PROP_NAME, prop_names[i])) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get property name in file id %d", exoid);
+	ex_err("ex_get_prop_names",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+    else {
+      /* FIXME */
+      exerrval = NC_ESTS;
+      sprintf(errmsg,
+	      "Error: property name length exceeds space available to store it in file id %d", exoid);
+      ex_err("ex_get_prop_names",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_qa.c b/exodus/cbind/src/ex_get_qa.c
new file mode 100644
index 0000000..b2cab3b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_qa.c
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_trim_internal, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_vara_text, etc
+
+/*!
+The function ex_get_qa() reads the QA records from the database. Each
+QA record contains four \c MAX_STR_LENGTH-byte character
+strings. The character strings are:
+ -  the analysis code name
+ -  the analysis code QA descriptor
+ -  the analysis date
+ -  the analysis time
+
+Memory must be allocated for the QA records before this call is
+made. The number of QA records can be determined by invoking
+ex_inquire().
+
+\return In case of an error, ex_get_qa() returns a negative number; a
+        warning will return a positive number.  Possible causes of errors
+        include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  a warning value is returned if no QA records were stored.
+
+\param[in] exoid          exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[out]  qa_record    Returned array containing the QA records.
+
+The following will determine the number of QA records and 
+read them from the open exodus file:
+
+\code
+int num_qa_rec, error, exoid
+char *qa_record[MAX_QA_REC][4];
+
+\comment{read QA records}
+num_qa_rec = ex_inquire_int(exoid, EX_INQ_QA);
+
+for (i=0; i<num_qa_rec; i++) {
+    for (j=0; j<4; j++)
+    qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+}
+error = ex_get_qa (exoid, qa_record);
+\endcode
+
+ */
+
+int ex_get_qa (int exoid,
+               char *qa_record[][4])
+{
+  int status;
+  int dimid, varid;
+  size_t i, j;
+  size_t num_qa_records, start[3], count[3];
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined dimensions and variables  */
+  if ((status = nc_inq_dimid(rootid, DIM_NUM_QA, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no qa records stored in file id %d", 
+            rootid);
+    ex_err("ex_get_qa",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  if ((status = nc_inq_dimlen(rootid, dimid, &num_qa_records)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of qa records in file id %d",
+	    rootid);
+    ex_err("ex_get_qa",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* do this only if there are any QA records */
+  if (num_qa_records > 0) {
+    if ((status = nc_inq_varid(rootid, VAR_QA_TITLE, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate qa record data in file id %d", rootid);
+      ex_err("ex_get_qa",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+
+    /* read the QA records */
+    for (i=0; i<num_qa_records; i++) {
+      for (j=0; j<4; j++) {
+	start[0] = i; count[0] = 1;
+	start[1] = j; count[1] = 1;
+	start[2] = 0; count[2] = MAX_STR_LENGTH+1;
+	if ((status = nc_get_vara_text(rootid, varid, start, count, qa_record[i][j])) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get qa record data in file id %d", rootid);
+	  ex_err("ex_get_qa",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+	qa_record[i][j][MAX_STR_LENGTH] = '\0';
+	ex_trim_internal(qa_record[i][j]);
+      }
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_set.c b/exodus/cbind/src/ex_get_set.c
new file mode 100644
index 0000000..67814b5
--- /dev/null
+++ b/exodus/cbind/src/ex_get_set.c
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgset - ex_get_set
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid              exodus file id
+*       int     set_type           the type of set
+*       int     set_id             set id
+*
+* exit conditions - 
+*       int*    set_entry_list     array of entries in set
+*       int*    set_extra_list     array of extras in set
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_int, etc
+
+/*!
+ * reads the set entry list and set extra list for a single set
+ */
+
+int ex_get_set (int   exoid,
+		ex_entity_type set_type,
+		ex_entity_id   set_id,
+		void_int  *set_entry_list, 
+		void_int  *set_extra_list) /* NULL if dont want to retrieve data */
+{
+
+  int dimid, entry_list_id, extra_list_id, status;
+  int set_id_ndx;
+  char errmsg[MAX_ERR_LENGTH];
+  char* entryptr = NULL;
+  char* extraptr = NULL;
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: no %ss stored in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_get_set",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid,set_type,set_id);
+  if (exerrval != 0)  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: %s %"PRId64" is NULL in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    entryptr = VAR_NODE_NS(set_id_ndx);
+    extraptr = NULL;
+  }
+  else if (set_type == EX_EDGE_SET) {
+    entryptr = VAR_EDGE_ES(set_id_ndx);
+    extraptr = VAR_ORNT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    entryptr = VAR_FACE_FS(set_id_ndx);
+    extraptr = VAR_ORNT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    entryptr = VAR_ELEM_SS(set_id_ndx);
+    extraptr = VAR_SIDE_SS(set_id_ndx);
+  }
+  if (set_type == EX_ELEM_SET) {
+    entryptr = VAR_ELEM_ELS(set_id_ndx);
+    extraptr = NULL;
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_varid(exoid, entryptr, &entry_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate entry list for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_get_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* If client doet not pass in an array to store the
+     extra list, don't access it at all */
+
+  /* only do extra list for edge, face and side sets */
+  if (set_extra_list) {
+    if ((status = nc_inq_varid (exoid, extraptr, &extra_list_id)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate extra list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+
+  /* read in the entry list and extra list arrays unless they are NULL */
+  if (set_entry_list) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, entry_list_id, set_entry_list);
+    } else {
+      status = nc_get_var_int(exoid, entry_list_id, set_entry_list);
+    }    
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get entry list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* only do extra list for edge, face and side sets */
+  if (set_extra_list) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, extra_list_id, set_extra_list);
+    } else {
+      status = nc_get_var_int(exoid, extra_list_id, set_extra_list);
+    }
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get extra list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id, exoid);
+      ex_err("ex_get_set", errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_set_dist_fact.c b/exodus/cbind/src/ex_get_set_dist_fact.c
new file mode 100644
index 0000000..d5dbdce
--- /dev/null
+++ b/exodus/cbind/src/ex_get_set_dist_fact.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssd - ex_get_set_dist_fact
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                type of set
+*       int     set_id                  set id
+*
+* exit conditions - 
+*       float*  set_dist_fact           array of dist factors for set
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf, NULL
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_get_var_double, etc
+
+/*!
+ * reads the distribution factors for a single set
+ */
+
+int ex_get_set_dist_fact (int   exoid,
+			  ex_entity_type set_type,
+			  ex_entity_id   set_id,
+			  void *set_dist_fact)
+{
+
+  int dimid, dist_id, set_id_ndx;
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+  char* factptr = NULL;
+ 
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid (exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Warning: no %s sets stored in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_get_set_dist_fact",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid,set_type,set_id);
+  if (exerrval != 0)  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: %s set %"PRId64" is NULL in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set_dist_fact",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s set %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    factptr = VAR_FACT_NS(set_id_ndx);
+  }
+  else if (set_type == EX_EDGE_SET) {
+    factptr = VAR_FACT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    factptr = VAR_FACT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    factptr = VAR_FACT_SS(set_id_ndx);
+  }
+  if (set_type == EX_ELEM_SET) {
+    factptr = VAR_FACT_ELS(set_id_ndx);
+  }
+
+  /* inquire id's of previously defined dimensions and variables */
+  if ((status = nc_inq_varid(exoid, factptr, &dist_id)) != NC_NOERR) {
+    exerrval = status;
+    /* not an error for node sets because this is how we check that df's exist */
+    if (set_type == EX_NODE_SET) {
+      sprintf(errmsg,
+	      "Warning: dist factors not stored for %s set %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id, exoid);
+      ex_err("ex_get_set_dist_fact",errmsg,exerrval);
+      return (EX_WARN);         /* complain - but not too loud */
+    }
+    /* is an error for other sets */
+    else  {
+      sprintf(errmsg,
+	      "Error: failed to locate dist factors list for %s set %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* read in the distribution factors array */
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_var_float(exoid, dist_id, set_dist_fact);
+  } else {
+    status = nc_get_var_double(exoid, dist_id, set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get dist factors list for %s set %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_get_set_dist_fact",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_set_param.c b/exodus/cbind/src/ex_get_set_param.c
new file mode 100644
index 0000000..4bac5c2
--- /dev/null
+++ b/exodus/cbind/src/ex_get_set_param.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgsetp - ex_get_set_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                the type of set
+*       int     set_id                  set id
+*
+* exit conditions - 
+*       int*    num_entries_in_set      number of entries in the set
+*       int*    num_dist_fact_in_set    number of distribution factors in the 
+*                                       set
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*
+ * reads the number of entries and the number of distribution factors which 
+ * describe a single set
+ */
+
+int ex_get_set_param (int  exoid,
+		      ex_entity_type set_type, 
+		      ex_entity_id   set_id,
+		      void_int *num_entry_in_set, 
+		      void_int *num_dist_fact_in_set)
+{
+  int status;
+  int varid, dimid, set_id_ndx;
+  size_t lnum_entry_in_set;
+  size_t lnum_dist_fact_in_set;
+  char errmsg[MAX_ERR_LENGTH];
+  char* numentryptr = NULL;
+  char* numdfptr = NULL;
+
+  exerrval = 0; /* clear error code */
+
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    if (num_entry_in_set)
+      *(int64_t*)num_entry_in_set = 0;
+    if (num_dist_fact_in_set)
+      *(int64_t*)num_dist_fact_in_set = 0;
+  } else {
+    if (num_entry_in_set)
+      *(int*)num_entry_in_set = 0;
+    if (num_dist_fact_in_set)
+      *(int*)num_dist_fact_in_set = 0;
+  }
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: no %ss stored in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_get_set_param",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid,set_type,set_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY)     /* NULL set? */
+      {
+	return (EX_NOERR);
+      } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in id array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_get_set_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    numentryptr = DIM_NUM_NOD_NS(set_id_ndx);
+    /* note we are using DIM_NUM_NODE_NS instead of DIM_NUM_DF_NS */
+    numdfptr = DIM_NUM_NOD_NS(set_id_ndx);
+  }
+  else if (set_type == EX_EDGE_SET) {
+    numentryptr = DIM_NUM_EDGE_ES(set_id_ndx);
+    numdfptr = DIM_NUM_DF_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    numentryptr = DIM_NUM_FACE_FS(set_id_ndx);
+    numdfptr = DIM_NUM_DF_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    numentryptr = DIM_NUM_SIDE_SS(set_id_ndx);
+    numdfptr = DIM_NUM_DF_SS(set_id_ndx);
+  }
+  if (set_type == EX_ELEM_SET) {
+    numentryptr = DIM_NUM_ELE_ELS(set_id_ndx);
+    numdfptr = DIM_NUM_DF_ELS(set_id_ndx);
+  }
+
+  /* inquire values of dimension for number of entities in set */
+  if (ex_get_dimension(exoid, numentryptr,"entries", &lnum_entry_in_set,
+		       &dimid, "ex_get_set_param") != NC_NOERR)
+    return EX_FATAL;
+  
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    if (num_entry_in_set)
+      *(int64_t*)num_entry_in_set = lnum_entry_in_set;
+  } else {
+    if (num_entry_in_set)
+      *(int*)num_entry_in_set = lnum_entry_in_set;
+  }
+
+  /* Inquire value of dimension of number of dist factors for this set. 
+     NOTE: For node sets, because DIM_NUM_DF_NS is not used, we check to see
+     if the dist factor variable for a node set index exits. If it does not,
+     the dist factor count is assumed to be zero, otherwise the dist factor 
+     count will be the same as the number of nodes in the set. */
+
+  if (set_type == EX_NODE_SET) {
+    if ((status = nc_inq_varid(exoid, VAR_FACT_NS(set_id_ndx), &varid)) != NC_NOERR) {
+      if (status == NC_ENOTVAR)
+	return (EX_NOERR);
+      else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate the dist factors for %s %"PRId64" in file id %d",
+		ex_name_of_object(set_type), set_id,exoid);
+	ex_err("ex_get_set_param",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    if (num_dist_fact_in_set)
+      *(int64_t*)num_dist_fact_in_set = lnum_entry_in_set;
+    } else {
+    if (num_dist_fact_in_set)
+      *(int*)num_dist_fact_in_set = lnum_entry_in_set;
+    }
+  }
+  else {/* all other set types */
+    if ((status = nc_inq_dimid(exoid, numdfptr, &dimid)) != NC_NOERR) {
+      if (status == NC_EBADDIM)
+	return (EX_NOERR);
+      else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate number of dist factors in %s %"PRId64" in file id %d",
+		ex_name_of_object(set_type), set_id, exoid);
+	ex_err("ex_get_set_param",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+
+    if ((status = nc_inq_dimlen(exoid, dimid, &lnum_dist_fact_in_set)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of dist factors in %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id, exoid);
+      ex_err("ex_get_set_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      if (num_dist_fact_in_set)
+	*(int64_t*)num_dist_fact_in_set = lnum_dist_fact_in_set;
+    } else {
+      if (num_dist_fact_in_set)
+	*(int*)num_dist_fact_in_set = lnum_dist_fact_in_set;
+    }
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_sets.c b/exodus/cbind/src/ex_get_sets.c
new file mode 100644
index 0000000..b2c9afb
--- /dev/null
+++ b/exodus/cbind/src/ex_get_sets.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2012 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for ex_set, ex_get_set_param, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR
+
+int ex_get_sets (int   exoid,
+		 size_t set_count,
+		 struct ex_set *sets)
+{
+  size_t i;
+  int status = EX_NOERR;
+  int stat;
+  for (i=0; i < set_count; i++) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      stat = ex_get_set_param(exoid, sets[i].type, sets[i].id,
+			      &sets[i].num_entry, &sets[i].num_distribution_factor);
+    } else {
+      /* API expecting 32-bit ints; ex_set structure has 64-bit ints. */
+      int num_entry;
+      int num_dist;
+      stat = ex_get_set_param(exoid, sets[i].type, sets[i].id,
+			      &num_entry, &num_dist);
+      sets[i].num_entry = num_entry;
+      sets[i].num_distribution_factor = num_dist;
+    }
+    if (stat != EX_NOERR) status = (status == EX_FATAL) ? EX_FATAL : stat;
+
+    if (stat == EX_NOERR && (sets[i].entry_list != NULL || sets[i].extra_list != NULL)) {
+      stat = ex_get_set(exoid, sets[i].type, sets[i].id, sets[i].entry_list, sets[i].extra_list);
+      if (stat != EX_NOERR) status = (status == EX_FATAL) ? EX_FATAL : stat;
+    }
+
+    if (stat == EX_NOERR && sets[i].distribution_factor_list != NULL) {
+      stat = ex_get_set_dist_fact(exoid, sets[i].type, sets[i].id, sets[i].distribution_factor_list);
+      if (stat != EX_NOERR) status = (status == EX_FATAL) ? EX_FATAL : stat;
+    }
+  }
+  return status;
+}
diff --git a/exodus/cbind/src/ex_get_side_set.c b/exodus/cbind/src/ex_get_side_set.c
new file mode 100644
index 0000000..2001317
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgss - ex_get_side_set
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*
+* exit conditions - 
+*       int*    side_set_elem_list      array of elements in side set
+*       int*    side_set_side_list      array of sides in side set
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_set, void_int, etc
+
+/*!
+ * reads the side set element list and side set side list for a single side set
+ * \deprecated Use ex_get_set()(exoid, EX_SIDE_SET, side_set_id, side_set_elem_list, side_set_side_list)
+ */
+
+int ex_get_side_set (int   exoid,
+                     ex_entity_id   side_set_id,
+                     void_int  *side_set_elem_list, 
+                     void_int  *side_set_side_list)
+{
+  return ex_get_set(exoid, EX_SIDE_SET, side_set_id,
+		    side_set_elem_list, side_set_side_list);
+}
diff --git a/exodus/cbind/src/ex_get_side_set_dist_fact.c b/exodus/cbind/src/ex_get_side_set_dist_fact.c
new file mode 100644
index 0000000..587f33f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set_dist_fact.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssd - ex_get_side_set_dist_fact
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*
+* exit conditions - 
+*       float*  side_set_dist_fact      array of dist factors for side set
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_set_dist_fact, etc
+
+/*!
+ * reads the distribution factors for a single side set
+ * \deprecated Use ex_get_set_dist_fact()(exoid, EX_SIDE_SET, side_set_id, side_set_dist_fact)
+ */
+
+int ex_get_side_set_dist_fact (int   exoid,
+                               ex_entity_id   side_set_id,
+                               void *side_set_dist_fact)
+{
+  return ex_get_set_dist_fact(exoid, EX_SIDE_SET, side_set_id, 
+			      side_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_get_side_set_ids.c b/exodus/cbind/src/ex_get_side_set_ids.c
new file mode 100644
index 0000000..c9e102e
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set_ids.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssi - ex_get_side_set_ids
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*       int*    size_set_ids            array of side set IDs
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_ids, etc
+
+/*!
+ *  reads the side set ids from the database
+ * \deprecated Use ex_get_ids()(exoid, EX_SIDE_SET, ids)
+ */
+
+int ex_get_side_set_ids (int  exoid,
+                         void_int *ids)
+{
+  return ex_get_ids( exoid, EX_SIDE_SET, ids );
+}
diff --git a/exodus/cbind/src/ex_get_side_set_node_count.c b/exodus/cbind/src/ex_get_side_set_node_count.c
new file mode 100644
index 0000000..f2794ab
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set_node_count.c
@@ -0,0 +1,681 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssc - ex_get_side_set_node_count
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*
+* exit conditions - 
+*       int     *side_set_node_cnt_list returned array of number of nodes for
+*                                       side or face
+* revision history - 
+*
+*****************************************************************************/
+
+#include <assert.h>                     // for assert
+#include <ctype.h>                      // for toupper
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <string.h>                     // for strncmp, strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, ex_block, etc
+#include "exodusII_int.h"               // for elem_blk_parm, EX_FATAL, etc
+
+/* Generic error message for element type/node count mapping...*/
+static int el_node_count_error(struct elem_blk_parm elem_blk_parms)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  sprintf(errmsg,							
+	  "Error: An element of type '%s' with %d nodes is not valid.",	
+	  elem_blk_parms.elem_type,					
+	  elem_blk_parms.num_nodes_per_elem);			
+  ex_err("ex_get_side_set_node_count",errmsg,EX_MSG);			
+  return(EX_FATAL);							
+}
+
+int ex_get_side_set_node_count(int exoid,
+                               ex_entity_id side_set_id,
+                               int *side_set_node_cnt_list)
+{
+  size_t m;
+  int ii, i, j; 
+  int  num_side_sets, num_elem_blks, num_df, ndim;
+  size_t tot_num_ss_elem = 0;
+  int64_t side, elem;
+  void_int *elem_blk_ids;
+  void_int *ss_elem_ndx;
+  void_int *side_set_elem_list, *side_set_side_list;
+  size_t elem_ctr;
+
+  struct elem_blk_parm  *elem_blk_parms;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+  /* inquire how many side sets have been stored */
+  num_side_sets = ex_inquire_int(exoid, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of side sets in file id %d",exoid);
+    ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+  
+  if (num_side_sets == 0) {
+    sprintf(errmsg,
+	    "Warning: no side sets defined in file id %d",exoid);
+    ex_err("ex_get_side_set_node_count",errmsg,EX_WARN);
+    return(EX_WARN);
+  }
+  
+  /* Lookup index of side set id in VAR_SS_IDS array */
+  ex_id_lkup(exoid,EX_SIDE_SET,side_set_id);
+  if (exerrval != 0) 
+    {
+      if (exerrval == EX_NULLENTITY)
+	{
+	  sprintf(errmsg,
+		  "Warning: side set %"PRId64" is NULL in file id %d",
+		  side_set_id,exoid);
+	  ex_err("ex_get_side_set_node_count",errmsg,EX_NULLENTITY);
+	  return (EX_WARN);
+	}
+      else
+	{
+
+	  sprintf(errmsg,
+		  "Error: failed to locate side set %"PRId64" in VAR_SS_IDS array in file id %d",
+		  side_set_id,exoid);
+	  ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+    }
+
+  num_elem_blks = ex_inquire_int(exoid, EX_INQ_ELEM_BLK);
+  if (num_elem_blks < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of element blocks in file id %d",exoid);
+    ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* get the dimensionality of the coordinates;  this is necessary to
+     distinguish between 2d TRIs and 3d TRIs */
+  ndim = ex_inquire_int(exoid, EX_INQ_DIM);
+  if (ndim < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get dimensionality in file id %d",exoid);
+    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* First determine the  # of elements in the side set*/
+  if ((ex_get_side_set_param(exoid,side_set_id,&tot_num_ss_elem,&num_df)) == -1)
+    {
+      sprintf(errmsg,
+	      "Error: failed to get number of elements in side set %"PRId64" in file id %d",
+	      side_set_id, exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+      return(EX_FATAL);
+    }
+
+  /* Allocate space for the side set element list */
+  {
+    int int_size = sizeof(int);
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+      int_size = sizeof(int64_t);
+
+    if (!(side_set_elem_list=malloc(tot_num_ss_elem*int_size))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set element list for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Allocate space for the side set side list */
+    if (!(side_set_side_list=malloc(tot_num_ss_elem*int_size))) {
+      free(side_set_elem_list);
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set side list for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  
+    if (ex_get_side_set(exoid, side_set_id, 
+			side_set_elem_list, side_set_side_list) == -1) {
+      free(side_set_elem_list);
+      free(side_set_side_list);
+      sprintf(errmsg,
+	      "Error: failed to get side set %"PRId64" in file id %d",
+	      side_set_id, exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  
+    /* Allocate space for the ss element index array */
+    if (!(ss_elem_ndx=malloc(tot_num_ss_elem*int_size))) {
+      free(side_set_elem_list);
+      free(side_set_side_list);
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem sort array for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (int_size == sizeof(int64_t)) {
+      /* Sort side set element list into index array  - non-destructive */
+      int64_t *elems = (int64_t*)ss_elem_ndx;
+      for (i=0;i<tot_num_ss_elem;i++) {
+	elems[i] = i; /* init index array to current position */
+      }
+      ex_iqsort64(side_set_elem_list, elems,tot_num_ss_elem);
+    } else {
+      /* Sort side set element list into index array  - non-destructive */
+      int *elems = (int*)ss_elem_ndx;
+      for (i=0;i<tot_num_ss_elem;i++) {
+	elems[i] = i; /* init index array to current position */
+      }
+      ex_iqsort(side_set_elem_list, elems,tot_num_ss_elem);
+    }
+  }
+
+  /* Allocate space for the element block ids */
+  {
+    int int_size = sizeof(int);
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      int_size = sizeof(int64_t);
+    }
+
+    if (!(elem_blk_ids=malloc(num_elem_blks*int_size))) {
+      exerrval = EX_MEMFAIL;
+      free(ss_elem_ndx);
+      free(side_set_side_list);
+      free(side_set_elem_list);
+      sprintf(errmsg,
+	      "Error: failed to allocate space for element block ids for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (ex_get_elem_blk_ids(exoid, elem_blk_ids) == -1) {
+      free(elem_blk_ids);
+      free(ss_elem_ndx);
+      free(side_set_side_list);
+      free(side_set_elem_list);
+      sprintf(errmsg,
+	      "Error: failed to get element block ids in file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,EX_MSG);
+      return(EX_FATAL);
+    } 
+  }
+  
+  /* Allocate space for the element block params */
+  if (!(elem_blk_parms=malloc(num_elem_blks*sizeof(struct elem_blk_parm)))) {
+    free(elem_blk_ids);
+    free(ss_elem_ndx);
+    free(side_set_side_list);
+    free(side_set_elem_list);
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for element block params for file id %d",
+            exoid);
+    ex_err("ex_get_side_set_node_count",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  elem_ctr = 0;
+  for (i=0; i<num_elem_blks; i++) {
+    ex_entity_id id;
+    ex_block block;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      id = ((int64_t*)elem_blk_ids)[i];
+    } else {
+      id = ((int*)elem_blk_ids)[i];
+    }
+
+    /* read in an element block parameter */
+    block.type = EX_ELEM_BLOCK;
+    block.id = id;
+    if ((ex_get_block_param (exoid, &block)) == -1) {
+      free(elem_blk_parms);
+      free(elem_blk_ids);
+      free(ss_elem_ndx);
+      free(side_set_side_list);
+      free(side_set_elem_list);
+      sprintf(errmsg,
+	      "Error: failed to get element block %"PRId64" parameters in file id %d",
+              block.id, exoid);
+      ex_err("ex_get_side_set_node_count",errmsg,EX_MSG);
+      return(EX_FATAL);
+    }
+
+    elem_blk_parms[i].num_elem_in_blk = block.num_entry;
+    elem_blk_parms[i].num_nodes_per_elem = block.num_nodes_per_entry;
+    elem_blk_parms[i].num_attr = block.num_attribute;
+
+    for (m=0; m < strlen(block.topology); m++) {
+      elem_blk_parms[i].elem_type[m] = toupper(block.topology[m]);
+    }
+    elem_blk_parms[i].elem_type[m] = '\0';
+
+    if (strncmp(elem_blk_parms[i].elem_type,"CIRCLE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_CIRCLE;
+	elem_blk_parms[i].num_sides = 1;
+	elem_blk_parms[i].num_nodes_per_side[0] = 1;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SPHERE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_SPHERE;
+	elem_blk_parms[i].num_sides = 1;
+        elem_blk_parms[i].num_nodes_per_side[0] = 1;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"QUAD",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_QUAD;
+	elem_blk_parms[i].num_sides = 4;
+	if (elem_blk_parms[i].num_nodes_per_elem == 4) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 2;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 5) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 2;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 9 ||
+		   elem_blk_parms[i].num_nodes_per_elem == 8) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 3;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TRIANGLE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_TRIANGLE;
+	if (ndim == 2) { /* 2d TRIs */
+	  elem_blk_parms[i].num_sides = 3;
+	  if (elem_blk_parms[i].num_nodes_per_elem == 3) {
+	    elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	    elem_blk_parms[i].num_nodes_per_side[1] = 2;
+	    elem_blk_parms[i].num_nodes_per_side[2] = 2;
+	  } else if (elem_blk_parms[i].num_nodes_per_elem == 6) {
+	    elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	    elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	    elem_blk_parms[i].num_nodes_per_side[2] = 3;
+	  }
+	} else if (ndim == 3) { /* 3d TRIs -- triangular shell*/
+	  elem_blk_parms[i].num_sides = 5; /* 2 Faces and 3 Edges */
+	  if (elem_blk_parms[i].num_nodes_per_elem == 3) {
+	    elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	    elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	    elem_blk_parms[i].num_nodes_per_side[2] = 2;
+	    elem_blk_parms[i].num_nodes_per_side[3] = 2;
+	    elem_blk_parms[i].num_nodes_per_side[4] = 2;
+	  } else if (elem_blk_parms[i].num_nodes_per_elem == 6) {
+	    elem_blk_parms[i].num_nodes_per_side[0] = 6;
+	    elem_blk_parms[i].num_nodes_per_side[1] = 6;
+	    elem_blk_parms[i].num_nodes_per_side[2] = 3;
+	    elem_blk_parms[i].num_nodes_per_side[3] = 3;
+	    elem_blk_parms[i].num_nodes_per_side[4] = 3;
+	  } else {
+	    struct elem_blk_parm val = elem_blk_parms[i];
+	    free(elem_blk_parms);
+	    free(elem_blk_ids);
+	    free(ss_elem_ndx);
+	    free(side_set_side_list);
+	    free(side_set_elem_list);
+	    return el_node_count_error(val);
+	  }
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SHELL",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_SHELL;
+
+	if (elem_blk_parms[i].num_nodes_per_elem == 2) {/* KLUDGE for 2D Shells*/
+	  elem_blk_parms[i].num_sides = 2; 
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 2;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 4) {
+	  elem_blk_parms[i].num_sides = 6;  /* 2 Faces, 4 Edges */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 2;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 8 ||
+		   elem_blk_parms[i].num_nodes_per_elem == 9) {
+	  elem_blk_parms[i].num_sides = 6;  /* 2 Faces, 4 Edges */
+	  elem_blk_parms[i].num_nodes_per_side[0] =
+	    elem_blk_parms[i].num_nodes_per_elem; /* 8 or 9 */
+	  elem_blk_parms[i].num_nodes_per_side[1] =
+	    elem_blk_parms[i].num_nodes_per_elem; /* 8 or 9 */
+	  elem_blk_parms[i].num_nodes_per_side[2] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 3;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"HEX",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_HEX;
+	elem_blk_parms[i].num_sides = 6;  
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 8) {  /* 8-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 4;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 9) { /* 9-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 4;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 12) { /* HEXSHELLS */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 4;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 20) { /* 20-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 8;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 27) { /* 27-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 9;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 9;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 9;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 9;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 9;
+	  elem_blk_parms[i].num_nodes_per_side[5] = 9;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TETRA",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_TETRA;
+	elem_blk_parms[i].num_sides = 4;  
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 4) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 3;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 8) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 4;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 10) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 6;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"WEDGE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_WEDGE;
+	elem_blk_parms[i].num_sides = 5;  
+	if (elem_blk_parms[i].num_nodes_per_elem == 6) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 4;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 3;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 15){
+	  elem_blk_parms[i].num_nodes_per_side[0] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 8;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 6;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"PYRAMID",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_PYRAMID;
+	elem_blk_parms[i].num_sides = 5;  
+	if (elem_blk_parms[i].num_nodes_per_elem == 5) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 4;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 13){
+	  elem_blk_parms[i].num_nodes_per_side[0] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[2] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[3] = 6;
+	  elem_blk_parms[i].num_nodes_per_side[4] = 8;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"BEAM",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_BEAM;
+	elem_blk_parms[i].num_sides = 2;  
+
+	if (elem_blk_parms[i].num_nodes_per_elem == 2) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 2;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 3){
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    else if ( (strncmp(elem_blk_parms[i].elem_type,"TRUSS",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"BAR",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"EDGE",3) == 0) )
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_TRUSS;
+	elem_blk_parms[i].num_sides = 2;  
+
+	if (elem_blk_parms[i].num_nodes_per_elem == 2) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 2;
+	} else if (elem_blk_parms[i].num_nodes_per_elem == 3) {
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  elem_blk_parms[i].num_nodes_per_side[1] = 3;
+	} else {
+	  struct elem_blk_parm val = elem_blk_parms[i];
+	  free(elem_blk_parms);
+	  free(elem_blk_ids);
+	  free(ss_elem_ndx);
+	  free(side_set_side_list);
+	  free(side_set_elem_list);
+	  return el_node_count_error(val);
+	}
+      }
+    /* Used for an empty block in a parallel decomposition */
+    else if (strncmp(elem_blk_parms[i].elem_type,"NULL",3) == 0) {
+      elem_blk_parms[i].elem_type_val = EX_EL_NULL_ELEMENT;
+      elem_blk_parms[i].num_sides = 0;  
+      elem_blk_parms[i].num_nodes_per_side[0] = 0;
+      elem_blk_parms[i].num_elem_in_blk = 0;
+    } else {
+      /* unsupported element type; no problem if no sides specified for
+         this element block */
+      elem_blk_parms[i].elem_type_val = EX_EL_UNK;
+      elem_blk_parms[i].num_sides = 0;  
+      elem_blk_parms[i].num_nodes_per_side[0] = 0;
+    }
+
+    elem_blk_parms[i].elem_blk_id = id;    /* save id */
+    elem_ctr += elem_blk_parms[i].num_elem_in_blk;
+    elem_blk_parms[i].elem_ctr = elem_ctr;      /* save elem number max */
+  }
+
+
+  /* Finally... Create the list of node counts for each face in the
+   * side set.
+   */
+
+  j = 0; /* The current element block... */
+  for (ii=0;ii<tot_num_ss_elem;ii++) {
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      i    = ((int64_t*)ss_elem_ndx)[ii];
+      elem = ((int64_t*)side_set_elem_list)[i];
+      side = ((int64_t*)side_set_side_list)[i]-1; /* Convert to 0-based sides */
+    } else {
+      i    = ((int*)ss_elem_ndx)[ii];
+      elem = ((int*)side_set_elem_list)[i];
+      side = ((int*)side_set_side_list)[i]-1; /* Convert to 0-based sides */
+    }
+
+    /*
+     * Since the elements are being accessed in sorted, order, the
+     * block that contains the elements must progress sequentially
+     * from block 0 to block[num_elem_blks-1]. Once we find an element
+     * not in this block, find a following block that contains it...
+     */       
+    for ( ; j<num_elem_blks; j++) {
+      if (elem <= elem_blk_parms[j].elem_ctr) {
+        break;
+      }
+    }
+
+    if (j < num_elem_blks) {
+      assert(side < elem_blk_parms[j].num_sides);  
+      side_set_node_cnt_list[i] = elem_blk_parms[j].num_nodes_per_side[side];
+    } else {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Error: Invalid element number %"PRId64" found in side set %"PRId64" in file %d",
+              elem, side_set_id, exoid);
+      free(elem_blk_parms);
+      free(elem_blk_ids);
+      free(ss_elem_ndx);
+      free(side_set_side_list);
+      free(side_set_elem_list);
+      ex_err("ex_get_side_set_node_count",errmsg,EX_MSG);
+      return (EX_FATAL);
+    }
+  }
+
+  /* All done: release connectivity array space, element block ids
+   * array, element block parameters array, and side set element index
+   * array
+   */
+  free(elem_blk_ids);
+  free(elem_blk_parms);
+  free(ss_elem_ndx);
+  free(side_set_side_list);
+  free(side_set_elem_list);
+
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_side_set_node_list.c b/exodus/cbind/src/ex_get_side_set_node_list.c
new file mode 100644
index 0000000..406e545
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set_node_list.c
@@ -0,0 +1,1035 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssn - ex_get_side_set_node_list
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*
+* exit conditions - 
+*       int     *side_set_node_cnt_list returned array of number of nodes for
+*                                       side or face
+*       int     *side_set_node_list     array of nodes
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <ctype.h>                      // for toupper
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for malloc, NULL, free
+#include <string.h>                     // for strncmp, strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, ex_block, etc
+#include "exodusII_int.h"               // for elem_blk_parm, EX_FATAL, etc
+/*!
+ * This routine is designed to read the Exodus II V 2.0 side set side 
+ * definition  and return a ExodusI style side set node definition.
+ */
+static void set_count(int exoid, void_int *cnt, size_t ndx, size_t val)
+{
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    ((int64_t*)cnt)[ndx] = val;
+  } else {
+    ((int*)cnt)[ndx] = val;
+  }
+}
+
+static void get_nodes(int exoid, void_int *to, size_t ito, void_int *from, size_t ifrom)
+{
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    ((int64_t*)to)[ito] = ((int64_t*)from)[ifrom];
+  } else {
+    ((int*)to)[ito] = ((int*)from)[ifrom];
+  }
+}
+
+int ex_get_side_set_node_list(int exoid,
+			      ex_entity_id side_set_id,
+			      void_int *side_set_node_cnt_list,
+			      void_int *side_set_node_list)
+{
+  size_t m;
+  size_t i, j; 
+  int64_t elem, side;
+  int64_t num_side_sets, num_elem_blks, num_df, ndim;
+  int64_t tot_num_elem = 0, tot_num_ss_elem = 0, elem_num = 0;
+  size_t connect_offset, side_num, node_pos;
+  void_int *elem_blk_ids = NULL;
+  void_int *connect = NULL; 
+  void_int *ss_elem_ndx = NULL;
+  void_int *ss_elem_node_ndx = NULL;
+  void_int *ss_parm_ndx = NULL;
+  void_int *side_set_elem_list = NULL;
+  void_int *side_set_side_list = NULL;
+  size_t elem_ctr, node_ctr, elem_num_pos;
+  size_t num_nodes_per_elem;
+  int int_size, ids_size;
+
+  int err_stat = EX_NOERR;
+  int status;
+
+  struct elem_blk_parm  *elem_blk_parms = NULL;
+
+  /* side to node translation tables - 
+     These tables are used to look up the side number based on the
+     first and second node in the side/face list. The side node order
+     is found in the original Exodus document, SAND87-2997. The element
+     node order is found in the ExodusII document, SAND92-2137. These
+     tables were generated by following the right-hand rule for determining
+     the outward normal.
+  */
+  /* triangle */
+  static int tri_table[3][3] = {
+    /*   1        2        3                                             side   */
+    {1,2,4}, {2,3,5}, {3,1,6}                                       /* nodes  */
+  };
+
+  /* triangle 3d */
+  static int tri3_table[5][7] = {
+    /*       1                2                                          side   */
+    {1,2,3,4,5,6,7}, {3,2,1,6,5,4,7},                               /* nodes  */
+    /*       3              4              5                             side   */
+    {1,2,4,0,0,0,0}, {2,3,5,0,0,0,0}, {3,1,6,0,0,0,0}               /* nodes  */
+  };
+
+  /* quad */
+  static int quad_table[4][3] = {
+    /*   1        2        3        4                                    side   */
+    {1,2,5}, {2,3,6}, {3,4,7}, {4,1,8}                              /* nodes  */
+  };
+
+  /* shell */
+  static int shell_table[6][8] = {
+    /*        1                  2                                       side   */
+    {1,2,3,4,5,6,7,8}, {1,4,3,2,8,7,6,5} ,                          /* nodes  */
+    /*        3                  4                                       side   */
+    {1,2,5,0,0,0,0,0}, {2,3,6,0,0,0,0,0} ,                          /* nodes  */
+    /*        5                  6                                       side   */
+    {3,4,7,0,0,0,0,0}, {4,1,8,0,0,0,0,0}                            /* nodes  */
+  };
+
+  /* tetra */
+  static int tetra_table[4][6] = {
+    /*      1              2               3               4            side   */
+    {1,2,4,5,9,8}, {2,3,4,6,10,9}, {1,4,3,8,10,7}, {1,3,2,7,6,5}   /* nodes  */
+  };
+
+  /* wedge */
+  static int wedge_table[5][8] = {
+    /*        1                     2                     3              side   */
+    {1,2,5,4,7,11,13,10}, {2,3,6,5,8,12,14,11}, {1,4,6,3,10,15,12,9},
+    /*        4                  5                                       side   */
+    {1,3,2,0,9,8,7,0}, {4,5,6,0,13,14,15,0}                         /* nodes  */
+  };
+
+  /* hex */
+  static int hex_table[6][9] = {
+    /*         1                        2                                side   */
+    {1,2,6,5,9,14,17,13,26}, {2,3,7,6,10,15,18,14,25},              /* nodes  */
+    /*         3                        4                                side   */
+    {3,4,8,7,11,16,19,15,27}, {1,5,8,4,13,20,16,12,24},             /* nodes  */
+    /*         5                        6                                side   */
+    {1,4,3,2,12,11,10,9,22},  {5,6,7,8,17,18,19,20,23}              /* nodes  */
+  };
+
+  /* pyramid */
+  static int pyramid_table[5][8] = {
+    /*          1                   2                    3              side   */
+    {1,2,5,0,6,11,10,0}, {2,3,5,0,7,12,11,0}, {3,4,5,0,8,13,12,0}, /* nodes  */
+    /*          4                  5                                    side   */
+    {1,5,4,0,10,13,9,0}, {1,4,3,2,9,8,7,6}                         /* nodes  */
+  };
+
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+  /* inquire how many side sets have been stored */
+
+  num_side_sets = ex_inquire_int(exoid, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of side sets in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if (num_side_sets == 0) {
+    sprintf(errmsg,
+	    "Warning: no side sets defined in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,EX_WARN);
+    return(EX_WARN);
+  }
+
+  /* Lookup index of side set id in VAR_SS_IDS array */
+  ex_id_lkup(exoid,EX_SIDE_SET,side_set_id);
+  if (exerrval != 0)  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: side set %"PRId64" is NULL in file id %d",
+	      side_set_id,exoid);
+      ex_err("ex_get_side_set_node_list",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    }
+    else {
+
+      sprintf(errmsg,
+	      "Error: failed to locate side set %"PRId64" in VAR_SS_IDS array in file id %d",
+	      side_set_id,exoid);
+      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  num_elem_blks = ex_inquire_int(exoid, EX_INQ_ELEM_BLK);
+  if (num_elem_blks < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of element blocks in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  tot_num_elem = ex_inquire_int(exoid, EX_INQ_ELEM);
+  if (tot_num_elem < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get total number of elements in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* get the dimensionality of the coordinates;  this is necessary to
+     distinguish between 2d TRIs and 3d TRIs */
+  ndim = ex_inquire_int(exoid, EX_INQ_DIM);
+  if (ndim < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get dimensionality in file id %d",exoid);
+    ex_err("ex_cvt_nodes_to_sides",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  int_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    int_size = sizeof(int64_t);
+  }
+
+  ids_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    ids_size = sizeof(int64_t);
+  }
+
+  /* First determine the  # of elements in the side set*/
+  if (int_size == sizeof(int64_t)) {
+    status = ex_get_set_param(exoid,EX_SIDE_SET, side_set_id,&tot_num_ss_elem,&num_df);
+  } else {
+    int tot, df;
+    status = ex_get_set_param(exoid,EX_SIDE_SET, side_set_id,&tot,&df);
+    tot_num_ss_elem = tot;
+    num_df = df;
+  }
+
+  if (status != EX_NOERR) {
+    sprintf(errmsg,
+	    "Error: failed to get number of elements in side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* Allocate space for the side set element list */
+  if (!(side_set_elem_list=malloc(tot_num_ss_elem*int_size))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for side set element list for file id %d",
+	    exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Allocate space for the side set side list */
+  if (!(side_set_side_list=malloc(tot_num_ss_elem*int_size))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for side set side list for file id %d",
+	    exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    err_stat = EX_FATAL;
+    goto cleanup;
+  }
+
+  if (ex_get_set(exoid, EX_SIDE_SET, side_set_id, 
+		 side_set_elem_list, side_set_side_list) == -1) {
+    sprintf(errmsg,
+	    "Error: failed to get side set %"PRId64" in file id %d",
+	    side_set_id, exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    err_stat = EX_FATAL;
+    goto cleanup;
+  }
+
+  /* Allocate space for the ss element index array */
+  if (!(ss_elem_ndx= malloc(tot_num_ss_elem*int_size))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for side set elem sort array for file id %d",
+	    exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    err_stat = EX_FATAL;
+    goto cleanup;
+  }
+
+  /* Sort side set element list into index array  - non-destructive */
+  if (int_size == sizeof(int64_t)) {
+    /* Sort side set element list into index array  - non-destructive */
+    int64_t *elems = (int64_t*)ss_elem_ndx;
+    for (i=0;i<tot_num_ss_elem;i++) {
+      elems[i] = i; /* init index array to current position */
+    }
+    ex_iqsort64(side_set_elem_list, ss_elem_ndx,tot_num_ss_elem);
+  } else {
+    /* Sort side set element list into index array  - non-destructive */
+    int *elems = (int*)ss_elem_ndx;
+    for (i=0;i<tot_num_ss_elem;i++) {
+      elems[i] = i; /* init index array to current position */
+    }
+    ex_iqsort(side_set_elem_list, ss_elem_ndx,tot_num_ss_elem);
+  }
+
+  /* Allocate space for the element block ids */
+  if (!(elem_blk_ids= malloc(num_elem_blks*ids_size))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for element block ids for file id %d",
+	    exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    err_stat = EX_FATAL;
+    goto cleanup;
+  }
+  
+  if (ex_get_elem_blk_ids(exoid, elem_blk_ids) == -1) {
+    sprintf(errmsg,
+	    "Error: failed to get element block ids in file id %d",
+	    exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,EX_MSG);
+    err_stat = EX_FATAL;
+    goto cleanup;
+  }
+
+  /* Allocate space for the element block params */
+  if (!(elem_blk_parms= malloc(num_elem_blks*sizeof(struct elem_blk_parm)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for element block params for file id %d",
+            exoid);
+    ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+    err_stat = EX_FATAL;
+    goto cleanup;
+  }
+
+  elem_ctr = 0;
+  for (i=0; i<num_elem_blks; i++) {
+    ex_block block;
+
+    if (ids_size == sizeof(int64_t)) {
+      block.id = ((int64_t*)elem_blk_ids)[i];
+    } else {
+      block.id = ((int*)elem_blk_ids)[i];
+    }
+    block.type = EX_ELEM_BLOCK;
+
+    /* read in an element block parameter */
+    if ((ex_get_block_param (exoid, &block)) == -1) {
+      sprintf(errmsg,
+	      "Error: failed to get element block %"PRId64" parameters in file id %d",
+              block.id, exoid);
+      ex_err("ex_get_side_set_node_list",errmsg,EX_MSG);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+    elem_blk_parms[i].num_elem_in_blk = block.num_entry;
+    elem_blk_parms[i].num_nodes_per_elem = block.num_nodes_per_entry;
+    elem_blk_parms[i].num_attr = block.num_attribute;
+    elem_blk_parms[i].elem_blk_id = block.id;
+
+    for (m=0; m < strlen(block.topology); m++) {
+      elem_blk_parms[i].elem_type[m] = toupper(block.topology[m]);
+    }
+    elem_blk_parms[i].elem_type[m] = '\0';
+
+    if (strncmp(elem_blk_parms[i].elem_type,"CIRCLE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_CIRCLE;
+	/* set side set node stride */
+        elem_blk_parms[i].num_nodes_per_side[0] = 1;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SPHERE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_SPHERE;
+	/* set side set node stride */
+        elem_blk_parms[i].num_nodes_per_side[0] = 1;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"QUAD",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_QUAD;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 4)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	else if (elem_blk_parms[i].num_nodes_per_elem == 5)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	else
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TRIANGLE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_TRIANGLE;
+	/* set default side set node stride */
+	if (ndim == 2)  /* 2d TRIs */
+	  {
+	    if (elem_blk_parms[i].num_nodes_per_elem == 3)
+	      elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	    else 
+	      elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	  }
+	else if (ndim == 3)  /* 3d TRIs */
+	  {
+	    if (elem_blk_parms[i].num_nodes_per_elem == 3)
+	      elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	    else 
+	      elem_blk_parms[i].num_nodes_per_side[0] = 6;
+	  }
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SHELL",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_SHELL;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 2) /* KLUDGE for 2D Shells*/
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	else if (elem_blk_parms[i].num_nodes_per_elem == 4)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else
+	  elem_blk_parms[i].num_nodes_per_side[0] = 8;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"HEX",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_HEX;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 8)  /* 8-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else if (elem_blk_parms[i].num_nodes_per_elem == 9)  /* 9-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else if (elem_blk_parms[i].num_nodes_per_elem == 12)  /* HEXSHELLS */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else if (elem_blk_parms[i].num_nodes_per_elem == 27)  /* 27-node bricks */
+	  elem_blk_parms[i].num_nodes_per_side[0] = 9;
+	else 
+	  elem_blk_parms[i].num_nodes_per_side[0] = 8;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TETRA",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_TETRA;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 4)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+	else if (elem_blk_parms[i].num_nodes_per_elem == 8)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else
+	  elem_blk_parms[i].num_nodes_per_side[0] = 6;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"WEDGE",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_WEDGE;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 6)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else
+	  elem_blk_parms[i].num_nodes_per_side[0] = 8;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"PYRAMID",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_PYRAMID;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 5)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 4;
+	else
+	  elem_blk_parms[i].num_nodes_per_side[0] = 8;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"BEAM",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_BEAM;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 2)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	else 
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+      }
+    else if ( (strncmp(elem_blk_parms[i].elem_type,"TRUSS",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"BAR",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"EDGE",3) == 0) )
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_TRUSS;
+	/* determine side set node stride */
+	if (elem_blk_parms[i].num_nodes_per_elem == 2)
+	  elem_blk_parms[i].num_nodes_per_side[0] = 2;
+	else 
+	  elem_blk_parms[i].num_nodes_per_side[0] = 3;
+      }
+    else if (strncmp(elem_blk_parms[i].elem_type,"NULL",3) == 0)
+      {
+	elem_blk_parms[i].elem_type_val = EX_EL_NULL_ELEMENT;
+	elem_blk_parms[i].num_nodes_per_side[0] = 0;
+	elem_blk_parms[i].num_elem_in_blk = 0;
+      }
+    else
+      { /* unsupported element type; no problem if no sides specified for
+	   this element block */
+	elem_blk_parms[i].elem_type_val = EX_EL_UNK;
+	elem_blk_parms[i].num_nodes_per_side[0] = 0;
+      }
+    elem_blk_parms[i].elem_blk_id = block.id;    /* save id */
+    elem_ctr += elem_blk_parms[i].num_elem_in_blk;
+    elem_blk_parms[i].elem_ctr = elem_ctr;      /* save elem number max */
+  }
+
+
+  /* Allocate space for the ss element to element block parameter index array */
+  if (!(ss_parm_ndx=malloc(tot_num_ss_elem*int_size)))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem parms index for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+
+  /* Allocate space for the ss element to node list index array */
+  if (!(ss_elem_node_ndx=malloc(tot_num_ss_elem*int_size)))
+    {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem to node index for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+           
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+  /* Build side set element to node list index and side set element 
+     parameter index.
+  */
+  node_ctr = 0;
+  for (i=0;i<tot_num_ss_elem;i++) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      elem = ((int64_t*)side_set_elem_list)[i];
+      side = ((int64_t*)side_set_side_list)[i];
+    } else {
+      elem = ((int*)side_set_elem_list)[i];
+      side = ((int*)side_set_side_list)[i];
+    }
+
+    for (j=0; j<num_elem_blks; j++) {
+      if (elem_blk_parms[j].elem_type_val != EX_EL_NULL_ELEMENT)
+	if (elem <= elem_blk_parms[j].elem_ctr)
+	  break;
+    }
+
+    if (j >= num_elem_blks) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Error: Invalid element number %"PRId64" found in side set %"PRId64" in file %d",
+              elem, side_set_id, exoid);
+      ex_err("ex_get_side_set_node_list",errmsg,EX_MSG);
+      err_stat = EX_FATAL;
+      goto cleanup;
+    }
+
+    if (int_size == sizeof(int64_t)) {
+      ((int64_t*)ss_parm_ndx)[i] = j; /* assign parameter block index */
+      ((int64_t*)ss_elem_node_ndx)[i] = node_ctr;     /* assign node list index */
+    } else {
+      ((int*)ss_parm_ndx)[i] = j; /* assign parameter block index */
+      ((int*)ss_elem_node_ndx)[i] = node_ctr;     /* assign node list index */
+    }
+
+    /* Update node_ctr (which points to next node in chain */
+
+    /* WEDGEs with 3 node sides (side 4 or 5) are special cases */
+    if (elem_blk_parms[j].elem_type_val == EX_EL_WEDGE &&
+        (side == 4 || side == 5))
+      {
+	if (elem_blk_parms[j].num_nodes_per_elem == 6)
+	  node_ctr += 3;  /* 3 node side */
+	else
+	  node_ctr += 6;  /* 6 node side */
+      }
+    /* PYRAMIDSs with 3 node sides (sides 1,2,3,4) are also special */
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_PYRAMID &&
+             (side < 5))
+      {
+	if (elem_blk_parms[j].num_nodes_per_elem == 5)
+	  node_ctr += 3;  /* 3 node side */
+	else
+	  node_ctr += 6;  /* 6 node side */
+      }
+    /* side numbers 3,4,5,6 for SHELLs are also special */
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_SHELL &&
+	     (side > 2 ))
+      {
+	if (elem_blk_parms[j].num_nodes_per_elem == 4)
+	  node_ctr += 2;  /* 2 node side */
+	else
+	  node_ctr += 3;  /* 3 node side */
+      }
+    /* side numbers 3,4,5 for 3d TRIs are also special */
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_TRIANGLE &&
+             ndim == 3 &&
+             side > 2 )
+      {
+	if (elem_blk_parms[j].num_nodes_per_elem == 3)  /* 3-node TRI */
+	  node_ctr += 2;  /* 2 node side */
+	else   /* 6-node TRI */
+	  node_ctr += 3;  /* 3 node side */
+      }
+    else /* all other element types */
+      node_ctr += elem_blk_parms[j].num_nodes_per_side[0];
+  }
+
+  /* All setup, ready to go ... */
+
+  elem_ctr=0;
+
+  for (j=0; j < tot_num_ss_elem; j++) {
+    int64_t elem_ndx;
+    size_t parm_ndx;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      elem_ndx = ((int64_t*)ss_elem_ndx)[j];
+      elem     = ((int64_t*)side_set_elem_list)[elem_ndx];
+      side     = ((int64_t*)side_set_side_list)[elem_ndx];
+      parm_ndx = ((int64_t*)ss_parm_ndx)[elem_ndx];
+    } else {
+      elem_ndx = ((int*)ss_elem_ndx)[j];
+      elem     = ((int*)side_set_elem_list)[elem_ndx];
+      side     = ((int*)side_set_side_list)[elem_ndx];
+      parm_ndx = ((int*)ss_parm_ndx)[elem_ndx];
+    }
+	
+    if (elem > elem_ctr) {
+      /* release connectivity array space and get next one */
+      if (elem_ctr > 0) {
+        ex_safe_free(connect);
+      }
+
+      /* Allocate space for the connectivity array for new element block */
+      if (!(connect=malloc(elem_blk_parms[parm_ndx].num_elem_in_blk*
+                           elem_blk_parms[parm_ndx].num_nodes_per_elem*
+                           int_size)))
+	{
+	  exerrval = EX_MEMFAIL;
+	  sprintf(errmsg,
+		  "Error: failed to allocate space for connectivity array for file id %d",
+		  exoid);
+	  ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	  err_stat = EX_FATAL;
+	  goto cleanup;
+	}
+
+      /* get connectivity array */
+      if (ex_get_elem_conn(exoid,
+			   elem_blk_parms[parm_ndx].elem_blk_id,
+			   connect) == -1)
+	{
+	  sprintf(errmsg,
+		  "Error: failed to allocate space for connectivity array for file id %d",
+		  exoid);
+	  ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	  err_stat = EX_FATAL;
+	  goto cleanup;
+	}
+      elem_ctr = elem_blk_parms[parm_ndx].elem_ctr;
+    }
+    /*  For each side in side set, use the appropriate lookup table to  
+	determine the nodes from the connect array. */
+
+    elem_num = elem-1;/* element number 0-based*/
+    /* calculate the relative element number position in it's block*/
+
+    elem_num_pos = elem_num - 
+      (elem_blk_parms[parm_ndx].elem_ctr -
+       elem_blk_parms[parm_ndx].num_elem_in_blk);
+
+    /* calculate the beginning of the node list for this element by
+       using the ss_elem_node_ndx index into the side_sets_node_index
+       and adding the element number position * number of nodes per elem */
+
+    num_nodes_per_elem = elem_blk_parms[parm_ndx].num_nodes_per_elem;
+    connect_offset = num_nodes_per_elem*elem_num_pos;
+    side_num = side-1;
+
+    if (int_size == sizeof(int64_t)) {
+      node_pos = ((int64_t*)ss_elem_node_ndx)[elem_ndx];
+    } else {
+      node_pos = ((int*)ss_elem_node_ndx)[elem_ndx];
+    }
+
+    switch (elem_blk_parms[parm_ndx].elem_type_val)
+      {
+      case EX_EL_CIRCLE:
+      case EX_EL_SPHERE:
+	{ /* Note: no side-node lookup table is used for this simple case */
+	  get_nodes(exoid, side_set_node_list, node_pos, connect, connect_offset);
+	  set_count(exoid, side_set_node_cnt_list, elem_ndx, 1);   /* 1 node object */
+	  break;
+	}
+      case EX_EL_TRUSS:
+      case EX_EL_BEAM:
+	{ /* Note: no side-node lookup table is used for this simple case */
+	  for (i=0; i < num_nodes_per_elem; i++) {
+	    get_nodes(exoid, side_set_node_list, node_pos+i, connect, connect_offset+i);
+	  }
+	  set_count(exoid, side_set_node_cnt_list, elem_ndx, num_nodes_per_elem);
+	  break;
+	}
+      case EX_EL_TRIANGLE:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 5) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid triangle edge number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  if (ndim == 2)   /* 2d TRIs */
+	    {
+	      get_nodes(exoid, side_set_node_list, node_pos,   connect, connect_offset+tri_table[side_num][0]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+1, connect, connect_offset+tri_table[side_num][1]-1);
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 2);   /* 2 node object */
+	      if (num_nodes_per_elem > 3)   /* 6-node TRI  */
+		{
+		  get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+tri_table[side_num][2]-1);
+		  set_count(exoid, side_set_node_cnt_list, elem_ndx, 3); /* 3 node object */
+		}
+	    }
+	  else if (ndim == 3)  /* 3d TRIs */
+	    {
+	      get_nodes(exoid, side_set_node_list, node_pos,   connect, connect_offset+tri3_table[side_num][0]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+1, connect, connect_offset+tri3_table[side_num][1]-1);
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 2);   /* 2 node object */
+	      if (side_num+1 <= 2)  /* 3- or 6-node face */
+		{
+		  if (num_nodes_per_elem == 3)  /* 3-node face */
+		    {
+		      set_count(exoid, side_set_node_cnt_list, elem_ndx, 3); /* 3 node object */
+		      get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+tri3_table[side_num][2]-1);
+		    }
+		  else   /* 6-node face */
+		    {
+		      set_count(exoid, side_set_node_cnt_list, elem_ndx, 6); /* 6 node object */
+		      get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+tri3_table[side_num][2]-1);
+		      get_nodes(exoid, side_set_node_list, node_pos+3, connect, connect_offset+tri3_table[side_num][3]-1);
+		      get_nodes(exoid, side_set_node_list, node_pos+4, connect, connect_offset+tri3_table[side_num][4]-1);
+		      get_nodes(exoid, side_set_node_list, node_pos+5, connect, connect_offset+tri3_table[side_num][5]-1);
+		    }
+		}
+	      else /* 2- or 3-node edge */
+		{
+		  if (num_nodes_per_elem > 3)  /* 3-node edge */
+		    {
+		      set_count(exoid, side_set_node_cnt_list, elem_ndx, 3); /* 3 node object */
+		      get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+tri3_table[side_num][2]-1);
+		    }
+		}
+	    }
+	  break;
+	}
+      case EX_EL_QUAD:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 4) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid quad edge number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+        
+	  get_nodes(exoid, side_set_node_list, node_pos+0, connect, connect_offset+quad_table[side_num][0]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+1, connect, connect_offset+quad_table[side_num][1]-1);
+	  set_count(exoid, side_set_node_cnt_list, elem_ndx, 2);   /* 2 node object */
+	  if (num_nodes_per_elem > 5)
+	    {
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 3); /* 3 node object */
+	      get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+quad_table[side_num][2]-1);
+	    }
+	  break;
+	}
+      case EX_EL_SHELL:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 6) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid shell face number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  get_nodes(exoid, side_set_node_list, node_pos+0, connect, connect_offset+shell_table[side_num][0]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+1, connect, connect_offset+shell_table[side_num][1]-1);
+	  set_count(exoid, side_set_node_cnt_list, elem_ndx, 2);   /* 2 node object */
+	  if (num_nodes_per_elem > 2) /*** KLUDGE for 2D shells ***/
+	    {
+	      if (side_num+1 <= 2)  /* 4-node face */
+		{
+		  set_count(exoid, side_set_node_cnt_list, elem_ndx, 4);   /* 4 node object */
+		  get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+shell_table[side_num][2]-1);
+		  get_nodes(exoid, side_set_node_list, node_pos+3, connect, connect_offset+shell_table[side_num][3]-1);
+		}
+	    }
+	  if (num_nodes_per_elem == 8)
+	    {
+	      if (side_num+1 <= 2)  /* 8-node face */
+		{
+		  set_count(exoid, side_set_node_cnt_list, elem_ndx, 8); /* 8 node object */
+		  get_nodes(exoid, side_set_node_list, node_pos+4, connect, connect_offset+shell_table[side_num][4]-1);
+		  get_nodes(exoid, side_set_node_list, node_pos+5, connect, connect_offset+shell_table[side_num][5]-1);
+		  get_nodes(exoid, side_set_node_list, node_pos+6, connect, connect_offset+shell_table[side_num][6]-1);
+		  get_nodes(exoid, side_set_node_list, node_pos+7, connect, connect_offset+shell_table[side_num][7]-1);
+		}
+	      else 
+		{
+		  set_count(exoid, side_set_node_cnt_list, elem_ndx, 3); /* 3 node edge */
+		  get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+shell_table[side_num][2]-1);
+		}
+	    }
+	  break;
+	}
+      case EX_EL_TETRA:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 4) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid tetra face number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  get_nodes(exoid, side_set_node_list, node_pos+0, connect, connect_offset+tetra_table[side_num][0]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+1, connect, connect_offset+tetra_table[side_num][1]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+tetra_table[side_num][2]-1);
+	  set_count(exoid, side_set_node_cnt_list, elem_ndx, 3);   /* 3 node object */
+	  if (num_nodes_per_elem == 8)
+	    {
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 4); /* 4 node object */
+	      get_nodes(exoid, side_set_node_list, node_pos+3, connect, connect_offset+tetra_table[side_num][3]-1);
+	    }
+	  else if (num_nodes_per_elem > 8)
+	    {
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 6); /* 6 node object */
+	      get_nodes(exoid, side_set_node_list, node_pos+3, connect, connect_offset+tetra_table[side_num][3]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+4, connect, connect_offset+tetra_table[side_num][4]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+5, connect, connect_offset+tetra_table[side_num][5]-1);
+	    }
+	  break;
+	}
+      case EX_EL_WEDGE:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 5) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid wedge face number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][0]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][1]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][2]-1);
+
+	  if (wedge_table[side_num][3] == 0) { /* degenerate side? */
+	    set_count(exoid, side_set_node_cnt_list, elem_ndx, 3);   /* 3 node side */
+	  }
+	  else
+	    {
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][3]-1);
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 4);   /* 4 node side */
+	    }
+
+
+	  if (num_nodes_per_elem > 6)
+	    {
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][4]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][5]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][6]-1);
+
+	      if (wedge_table[side_num][7] == 0) /* degenerate side? */
+		set_count(exoid, side_set_node_cnt_list, elem_ndx, 7);   /* 6 node side */
+	      else
+		{
+		  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+wedge_table[side_num][7]-1);
+		  set_count(exoid, side_set_node_cnt_list, elem_ndx, 8);   /* 8 node side */
+		}
+	    }
+	  break;
+	}
+      case EX_EL_PYRAMID:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 5) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid pyramid face number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][0]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][1]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][2]-1);
+
+	  if (pyramid_table[side_num][3] == 0) { /* degenerate side? */
+	    set_count(exoid, side_set_node_cnt_list, elem_ndx, 3);   /* 3 node side */
+	  }
+	  else
+	    {
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][3]-1);
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 4);   /* 4 node side */
+	    }
+
+
+	  if (num_nodes_per_elem > 5)
+	    {
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][4]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][5]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][6]-1);
+
+	      if (pyramid_table[side_num][7] == 0) /* degenerate side? */
+		set_count(exoid, side_set_node_cnt_list, elem_ndx, 7);   /* 6 node side */
+	      else
+		{
+		  get_nodes(exoid, side_set_node_list, node_pos++, connect, connect_offset+pyramid_table[side_num][7]-1);
+		  set_count(exoid, side_set_node_cnt_list, elem_ndx, 8);   /* 8 node side */
+		}
+	    }
+	  break;
+	}
+      case EX_EL_HEX:
+	{
+	  if (side_num+1 < 1 || side_num+1 > 6) /* side number range check */
+	    {
+	      exerrval = EX_BADPARAM;
+	      sprintf(errmsg,
+		      "Error: Invalid hex face number %"ST_ZU" in file id %d",
+		      side_num+1, exoid);
+	      ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	      err_stat = EX_FATAL;
+	      goto cleanup;
+	    }
+
+	  get_nodes(exoid, side_set_node_list, node_pos+0, connect, connect_offset+hex_table[side_num][0]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+1, connect, connect_offset+hex_table[side_num][1]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+2, connect, connect_offset+hex_table[side_num][2]-1);
+	  get_nodes(exoid, side_set_node_list, node_pos+3, connect, connect_offset+hex_table[side_num][3]-1);
+	  set_count(exoid, side_set_node_cnt_list, elem_ndx, 4);   /* 4 node object */
+	  if (num_nodes_per_elem > 12)   /* more nodes than HEXSHELL */
+	    {
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 8); /* 8 node object */
+	      get_nodes(exoid, side_set_node_list, node_pos+4, connect, connect_offset+hex_table[side_num][4]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+5, connect, connect_offset+hex_table[side_num][5]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+6, connect, connect_offset+hex_table[side_num][6]-1);
+	      get_nodes(exoid, side_set_node_list, node_pos+7, connect, connect_offset+hex_table[side_num][7]-1);
+	    }
+	  if (num_nodes_per_elem == 27)                 /* 27-node brick */
+	    {
+	      set_count(exoid, side_set_node_cnt_list, elem_ndx, 9); /* 9 node object */
+	      get_nodes(exoid, side_set_node_list, node_pos+8, connect, connect_offset+hex_table[side_num][8]-1);
+	    }
+	  break;
+	}
+      default:
+	{
+	  exerrval = EX_BADPARAM;
+	  sprintf(errmsg,
+		  "Error: %s is an unsupported element type",
+		  elem_blk_parms[parm_ndx].elem_type);
+	  ex_err("ex_get_side_set_node_list",errmsg,exerrval);
+	  err_stat = EX_FATAL;
+	  goto cleanup;
+	}
+      }
+  }
+
+
+  /* All done: release connectivity array space, element block ids array,
+     element block parameters array, and side set element index array */
+ cleanup:
+  ex_safe_free(connect);
+  ex_safe_free(ss_parm_ndx);
+  ex_safe_free(elem_blk_ids);
+  ex_safe_free(elem_blk_parms);
+  ex_safe_free(ss_elem_ndx);
+  ex_safe_free(ss_elem_node_ndx);
+  ex_safe_free(side_set_side_list);
+  ex_safe_free(side_set_elem_list);
+
+  return(err_stat);
+}
diff --git a/exodus/cbind/src/ex_get_side_set_node_list_len.c b/exodus/cbind/src/ex_get_side_set_node_list_len.c
new file mode 100644
index 0000000..9464231
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set_node_list_len.c
@@ -0,0 +1,573 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgsnl - ex_get_side_set_node_list_len
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*
+* exit conditions - 
+*       int     *side_set_node_list_len length of node list
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <ctype.h>                      // for toupper
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for malloc, NULL, free
+#include <string.h>                     // for strncmp, strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for elem_blk_parm, EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR
+
+/*!
+ * This routine is designed to read the Exodus II V 2.0 side set side 
+ * definition  and return the length of a ExodusI style side set node list.
+ * \param           exoid                   exodus file id
+ * \param           side_set_id             side set id
+ * \param[out]     *side_set_node_list_len length of node list
+ */
+
+int ex_get_side_set_node_list_len(int exoid,
+				  ex_entity_id side_set_id,
+				  void_int *side_set_node_list_len)
+{
+  size_t i, j;
+  size_t m;
+  int64_t num_side_sets, num_elem_blks, num_df, ndim;
+  size_t list_len = 0;
+  int64_t tot_num_elem = 0, tot_num_ss_elem = 0; 
+  void_int *elem_blk_ids;
+  int *ss_elem_ndx = NULL;
+  int64_t *ss_elem_ndx_64 = NULL;
+  
+  void_int *side_set_elem_list;
+  void_int *side_set_side_list;
+  int elem_ctr; 
+  int status;
+  
+  struct elem_blk_parm  *elem_blk_parms;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+      *(int64_t*)side_set_node_list_len = 0; /* default value */
+    else
+      *(int*)side_set_node_list_len = 0; /* default value */
+      
+  /* first check if any side sets are specified */
+  /* inquire how many side sets have been stored */
+
+  /* get the dimensionality of the coordinates;  this is necessary to
+     distinguish between 2d TRIs and 3d TRIs */
+
+  ndim = ex_inquire_int(exoid, EX_INQ_DIM);
+  if (ndim < 0)  {
+    sprintf(errmsg,
+           "Error: failed to get dimensionality in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  tot_num_elem = ex_inquire_int(exoid, EX_INQ_ELEM);
+  if (tot_num_elem < 0) {
+    sprintf(errmsg,
+           "Error: failed to get total number of elements in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  num_elem_blks = ex_inquire_int(exoid, EX_INQ_ELEM_BLK);
+  if (num_elem_blks < 0) {
+    sprintf(errmsg,
+           "Error: failed to get number of element blocks in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  num_side_sets = ex_inquire_int(exoid, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    sprintf(errmsg,
+           "Error: failed to get number of side sets in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if (num_side_sets == 0) {
+    sprintf(errmsg,
+           "Warning: no side sets defined in file id %d",exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,EX_WARN);
+    return(EX_WARN);
+  }
+
+  /* First determine the  # of elements in the side set*/
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = ex_get_side_set_param(exoid,side_set_id,&tot_num_ss_elem,&num_df);
+  } else {
+    int tot;
+    int df;
+    status = ex_get_side_set_param(exoid,side_set_id,&tot,&df);
+    tot_num_ss_elem = tot;
+    num_df = df;
+  }
+
+  if (status != NC_NOERR) {
+    sprintf(errmsg,
+         "Error: failed to get number of elements in side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if (tot_num_ss_elem == 0) /* NULL side set? */
+    return (EX_NOERR); /* return zero */
+
+  /* Minor optimization/kluge -- If num_df is nonzero, or 1 per face
+     then assume that it matches the number of nodes in the sideset... */
+  if (num_df > 0 && num_df != tot_num_ss_elem) {
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+      *(int64_t*)side_set_node_list_len = num_df;
+    else
+      *(int*)side_set_node_list_len = num_df;
+    return(EX_NOERR);
+  }
+
+  /* Allocate space for the side set element list */
+  {
+    int int_size = sizeof(int);
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+      int_size = sizeof(int64_t);
+    if (!(side_set_elem_list=malloc(tot_num_ss_elem*int_size))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set element list for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Allocate space for the side set side list */
+    if (!(side_set_side_list=malloc(tot_num_ss_elem*int_size))) {
+      ex_safe_free(side_set_elem_list);
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set side list for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (ex_get_side_set(exoid, side_set_id, 
+			side_set_elem_list, side_set_side_list) != NC_NOERR) {
+      ex_safe_free(side_set_elem_list);
+      ex_safe_free(side_set_side_list);
+      sprintf(errmsg,
+	      "Error: failed to get side set %"PRId64" in file id %d",
+	      side_set_id, exoid);
+      ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    
+    /* Allocate space for the ss element index array */
+    if (int_size == sizeof(int64_t)) {
+      ss_elem_ndx_64=malloc(tot_num_ss_elem*int_size);
+    } else {
+      ss_elem_ndx   =malloc(tot_num_ss_elem*int_size);
+    }
+
+    if (ss_elem_ndx_64==NULL && ss_elem_ndx == NULL) {
+      ex_safe_free(side_set_elem_list);
+      ex_safe_free(side_set_side_list);
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate space for side set elem sort array for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* Sort side set element list into index array  - non-destructive */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    for (i=0;i<tot_num_ss_elem;i++)
+      ss_elem_ndx_64[i] = i; /* init index array to current position */
+    ex_iqsort64(side_set_elem_list, ss_elem_ndx_64,tot_num_ss_elem);
+  } else {
+    for (i=0;i<tot_num_ss_elem;i++)
+      ss_elem_ndx[i] = i; /* init index array to current position */
+    ex_iqsort(side_set_elem_list, ss_elem_ndx,tot_num_ss_elem);
+  }
+
+
+  /* Allocate space for the element block ids */
+  {
+    int int_size = sizeof(int);
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      int_size = sizeof(int64_t);
+    }
+
+    if (!(elem_blk_ids=malloc(num_elem_blks*int_size))) {
+      exerrval = EX_MEMFAIL;
+      ex_safe_free(ss_elem_ndx);
+      ex_safe_free(ss_elem_ndx_64);
+      ex_safe_free(side_set_side_list);
+      ex_safe_free(side_set_elem_list);
+      sprintf(errmsg,
+	      "Error: failed to allocate space for element block ids for file id %d",
+	      exoid);
+      ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  
+  if (ex_get_elem_blk_ids(exoid, elem_blk_ids)) {
+    ex_safe_free(elem_blk_ids);
+    ex_safe_free(ss_elem_ndx);
+    ex_safe_free(ss_elem_ndx_64);
+    ex_safe_free(side_set_side_list);
+    ex_safe_free(side_set_elem_list);
+    sprintf(errmsg,
+	    "Error: failed to get element block ids in file id %d",
+            exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,EX_MSG);
+    return(EX_FATAL);
+  } 
+
+  /* Allocate space for the element block params */
+  if (!(elem_blk_parms=malloc(num_elem_blks*sizeof(struct elem_blk_parm)))) {
+    ex_safe_free(elem_blk_ids);
+    ex_safe_free(ss_elem_ndx);
+    ex_safe_free(ss_elem_ndx_64);
+    ex_safe_free(side_set_side_list);
+    ex_safe_free(side_set_elem_list);
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+      "Error: failed to allocate space for element block params for file id %d",
+            exoid);
+    ex_err("ex_get_side_set_node_list_len",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  elem_ctr = 0;
+  for (i=0; i<num_elem_blks; i++) {
+    ex_block block;
+    block.type = EX_ELEM_BLOCK;
+    
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      block.id = ((int64_t*)elem_blk_ids)[i];
+    } else {
+      block.id = ((int*)elem_blk_ids)[i];
+    }
+
+    /* read in an element block parameter */
+    if ((ex_get_block_param (exoid, &block)) != NC_NOERR) {
+      ex_safe_free(elem_blk_parms);
+      ex_safe_free(elem_blk_ids);
+      ex_safe_free(ss_elem_ndx);
+      ex_safe_free(ss_elem_ndx_64);
+      ex_safe_free(side_set_side_list);
+      ex_safe_free(side_set_elem_list);
+      sprintf(errmsg,
+             "Error: failed to get element block %"PRId64" parameters in file id %d",
+              block.id, exoid);
+      ex_err("ex_get_side_set_node_list_len",errmsg,EX_MSG);
+      return(EX_FATAL);
+    }
+
+    elem_blk_parms[i].num_elem_in_blk = block.num_entry;
+    elem_blk_parms[i].num_nodes_per_elem = block.num_nodes_per_entry;
+    elem_blk_parms[i].num_attr = block.num_attribute;
+    elem_blk_parms[i].elem_blk_id = block.id;
+
+    for (m=0; m < strlen(block.topology); m++) {
+      elem_blk_parms[i].elem_type[m] = toupper(block.topology[m]);
+    }
+    elem_blk_parms[i].elem_type[m] = '\0';
+
+    if (strncmp(elem_blk_parms[i].elem_type,"CIRCLE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_CIRCLE;
+      /* set side set node stride */
+        elem_blk_parms[i].num_nodes_per_side[0] = 1;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SPHERE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_SPHERE;
+      /* set side set node stride */
+        elem_blk_parms[i].num_nodes_per_side[0] = 1;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"QUAD",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_QUAD;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 4)
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+      else if (elem_blk_parms[i].num_nodes_per_elem == 5)
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+      else 
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TRIANGLE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_TRIANGLE;
+      /* determine side set node stride */
+      if (ndim == 2) /* 2d TRIs */
+      {
+        if (elem_blk_parms[i].num_nodes_per_elem == 3)
+          elem_blk_parms[i].num_nodes_per_side[0] = 2;
+        else 
+          elem_blk_parms[i].num_nodes_per_side[0] = 3;
+      }
+      else if (ndim == 3)  /* 3d TRIs */
+      {   /* set the default number of nodes per side; catch exceptions later */
+        if (elem_blk_parms[i].num_nodes_per_elem == 3)
+          elem_blk_parms[i].num_nodes_per_side[0] = 3;
+        else 
+          elem_blk_parms[i].num_nodes_per_side[0] = 6;
+      }
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"SHELL",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_SHELL;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 2) /* KLUDGE for 2D Shells*/
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+      else if (elem_blk_parms[i].num_nodes_per_elem == 4)
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else
+        elem_blk_parms[i].num_nodes_per_side[0] = 8;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"HEX",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_HEX;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 8)
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else if (elem_blk_parms[i].num_nodes_per_elem == 9)
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else if (elem_blk_parms[i].num_nodes_per_elem == 12) /* HEXSHELL */
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else if (elem_blk_parms[i].num_nodes_per_elem == 27)
+        elem_blk_parms[i].num_nodes_per_side[0] = 9;
+      else
+        elem_blk_parms[i].num_nodes_per_side[0] = 8;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"TETRA",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_TETRA;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 4)
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+      else if (elem_blk_parms[i].num_nodes_per_elem == 8)
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else
+        elem_blk_parms[i].num_nodes_per_side[0] = 6;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"WEDGE",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_WEDGE;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 6)
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else
+        elem_blk_parms[i].num_nodes_per_side[0] = 8;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"PYRAMID",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_PYRAMID;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 5)
+        elem_blk_parms[i].num_nodes_per_side[0] = 4;
+      else
+        elem_blk_parms[i].num_nodes_per_side[0] = 8;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"BEAM",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_BEAM;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 2)
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+      else 
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+    }
+    else if ( (strncmp(elem_blk_parms[i].elem_type,"TRUSS",3) == 0) ||
+              (strncmp(elem_blk_parms[i].elem_type,"BAR",3) == 0)  ||
+              (strncmp(elem_blk_parms[i].elem_type,"EDGE",3) == 0))
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_TRUSS;
+      /* determine side set node stride */
+      if (elem_blk_parms[i].num_nodes_per_elem == 2)
+        elem_blk_parms[i].num_nodes_per_side[0] = 2;
+      else 
+        elem_blk_parms[i].num_nodes_per_side[0] = 3;
+    }
+    else if (strncmp(elem_blk_parms[i].elem_type,"NULL",3) == 0)
+    {
+      elem_blk_parms[i].elem_type_val = EX_EL_NULL_ELEMENT;
+      elem_blk_parms[i].num_nodes_per_side[0] = 0;
+      elem_blk_parms[i].num_elem_in_blk = 0;
+    }
+    else
+    { /* unsupported element type; no problem if no sides specified for
+         this element block */
+      elem_blk_parms[i].elem_type_val = EX_EL_UNK;
+      elem_blk_parms[i].num_nodes_per_side[0] = 0;
+    }
+
+    elem_ctr += elem_blk_parms[i].num_elem_in_blk;
+    elem_blk_parms[i].elem_ctr = elem_ctr;      /* save elem number max */
+  }
+
+/* Walk through element list and keep a running count of the node length */
+
+  list_len = 0;
+  for (i=0;i<tot_num_ss_elem;i++)
+  {
+    size_t elem;
+    size_t side;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      elem = ((int64_t*)side_set_elem_list)[i];
+      side = ((int64_t*)side_set_side_list)[i];
+    } else {
+      elem = ((int*)side_set_elem_list)[i];
+      side = ((int*)side_set_side_list)[i];
+    }
+
+    for (j=0; j<num_elem_blks; j++)
+    {
+      if (elem_blk_parms[j].elem_type_val != EX_EL_NULL_ELEMENT)
+        if (elem <= elem_blk_parms[j].elem_ctr)
+          break; /* stop because we found the parameters for this element */
+    }
+    if (j >= num_elem_blks)
+    {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+             "Error: Invalid element number %"ST_ZU" found in side set %"PRId64" in file %d",
+              elem, side_set_id, exoid);
+      ex_safe_free(elem_blk_parms);
+      ex_safe_free(elem_blk_ids);
+      ex_safe_free(ss_elem_ndx);
+      ex_safe_free(ss_elem_ndx_64);
+      ex_safe_free(side_set_side_list);
+      ex_safe_free(side_set_elem_list);
+      ex_err("ex_get_side_set_node_list_len",errmsg,EX_MSG);
+      return (EX_FATAL);
+    }
+
+    /* Update *side_set_node_list_len (which points to next node in chain */
+
+    /* WEDGEs with 3 node sides (side 4 or 5) are special cases */
+    if (elem_blk_parms[j].elem_type_val == EX_EL_WEDGE &&
+        (side == 4 || side == 5))
+    {
+      if (elem_blk_parms[j].num_nodes_per_elem == 6)
+        list_len += 3;  /* 3 node side */
+      else
+        list_len += 6;  /* 6 node side */
+    }
+    /* PYRAMIDSs with 3 node sides (sides 1,2,3,4) are also special */
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_PYRAMID &&
+             (side < 5))
+    {
+      if (elem_blk_parms[j].num_nodes_per_elem == 5)
+        list_len += 3;  /* 3 node side */
+      else
+        list_len += 6;  /* 6 node side */
+    }
+    /* side numbers 3,4,5,6 for SHELLs are also special */
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_SHELL &&
+        (side > 2 ))
+    {
+      if (elem_blk_parms[j].num_nodes_per_elem == 4)
+        list_len += 2;  /* 2 node side */
+      else
+        list_len += 3;  /* 3 node side */
+    }
+    /* sides 3, 4, and 5 of 3d TRIs are special cases */
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_TRIANGLE &&
+             ndim == 3 && side > 2 )
+    {
+      if (elem_blk_parms[j].num_nodes_per_elem == 3)  /* 3-node TRI */
+        list_len += 2;  /* 2 node side */
+      else  /* 6-node TRI */
+        list_len += 3;  /* 3 node side */
+    }
+    else if (elem_blk_parms[j].elem_type_val == EX_EL_UNK)
+    {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+             "Error: %s in elem block %"PRId64" is an unsupported element type",
+              elem_blk_parms[i].elem_type, elem_blk_parms[i].elem_blk_id);
+      ex_safe_free(elem_blk_parms);
+      ex_safe_free(elem_blk_ids);
+      ex_safe_free(ss_elem_ndx);
+      ex_safe_free(ss_elem_ndx_64);
+      ex_safe_free(side_set_side_list);
+      ex_safe_free(side_set_elem_list);
+      ex_err("ex_get_side_set_node_list_len",errmsg,EX_MSG);
+      return (EX_FATAL);
+    }
+    else /* all other element types */
+      list_len += elem_blk_parms[j].num_nodes_per_side[0];
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API)
+    *(int64_t*)side_set_node_list_len = list_len;
+  else
+    *(int*)side_set_node_list_len = list_len;
+
+  /* All done: release element block ids array,
+     element block parameters array, and side set element index array */
+  ex_safe_free(elem_blk_ids);
+  ex_safe_free(elem_blk_parms);
+  ex_safe_free(ss_elem_ndx);
+  ex_safe_free(ss_elem_ndx_64);
+  ex_safe_free(side_set_side_list);
+  ex_safe_free(side_set_elem_list);
+
+  return(EX_NOERR);
+}
+
diff --git a/exodus/cbind/src/ex_get_side_set_param.c b/exodus/cbind/src/ex_get_side_set_param.c
new file mode 100644
index 0000000..55ecca5
--- /dev/null
+++ b/exodus/cbind/src/ex_get_side_set_param.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+ *
+ * exgsp - ex_get_side_set_param
+ *
+ * entry conditions - 
+ *   input parameters:
+ *       int     exoid                   exodus file id
+ *       int     side_set_id             side set id
+ *
+ * exit conditions - 
+ *       int*    num_side_in_set         number of sides in the side set
+ *       int*    num_dist_fact_in_set    number of distribution factors in the 
+ *                                       side set
+ *
+ * revision history - 
+ *
+ *
+ *****************************************************************************/
+
+#include "exodusII.h"
+
+/*!
+ * reads the number of sides and the number of distribution factors which 
+ * describe a single side set
+ * \param      exoid                   exodus file id
+ * \param      side_set_id             side set id
+ * \param[out] num_side_in_set         number of sides in the side set
+ * \param[out] num_dist_fact_in_set    number of distribution factors in the 
+ * \deprecated Use ex_get_set_param()(exoid, EX_SIDE_SET, side_set_id, num_side_in_set, num_dist_fact_in_set)
+ */
+
+int ex_get_side_set_param (int  exoid,
+                           ex_entity_id  side_set_id,
+                           void_int *num_side_in_set, 
+                           void_int *num_dist_fact_in_set)
+{
+  return ex_get_set_param(exoid, EX_SIDE_SET, side_set_id, 
+			  num_side_in_set, num_dist_fact_in_set);
+}
diff --git a/exodus/cbind/src/ex_get_ss_param_global.c b/exodus/cbind/src/ex_get_ss_param_global.c
new file mode 100644
index 0000000..b1b5145
--- /dev/null
+++ b/exodus/cbind/src/ex_get_ss_param_global.c
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_get_ss_param_global()
+ *****************************************************************************
+ * This function retrieves the global side-set parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      global_ids      - Pointer to a vector of global node-set IDs.
+ *      side_cnts       - Pointer to a vector of global node counts in
+ *                        each global node set.
+ *      df_cnts         - Pointer to a vector of global distribution
+ *                        factors in each global node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_get_var_int, etc
+#include <stdio.h>                      // for sprintf, NULL
+
+
+
+int ex_get_ss_param_global(int exoid,
+                           void_int *global_ids,
+                           void_int *side_cnts,
+                           void_int *df_cnts
+                           )
+{
+  const char   *func_name="ex_get_ss_param_global";
+  int     varid, status;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the variable ID for the vector of global side set IDs */
+  if ((status = nc_inq_varid(exoid, VAR_SS_IDS_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_SS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the vector of side set IDs */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_get_var_longlong(exoid, varid, global_ids);
+  } else {
+    status = nc_get_var_int(exoid, varid, global_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_SS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the vector of global side set side count */
+  if (side_cnts != NULL) {
+    if ((status = nc_inq_varid(exoid, VAR_SS_SIDE_CNT_GLOBAL, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_SS_SIDE_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* Get the vector of side set side counts */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, varid, side_cnts);
+    } else {
+      status = nc_get_var_int(exoid, varid, side_cnts);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_SS_SIDE_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (side_cnts != NULL)" */
+
+  /* Get the variable ID for the vector of global side set dist. fact count */
+  if (df_cnts != NULL) {
+    if ((status = nc_inq_varid(exoid, VAR_SS_DF_CNT_GLOBAL, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_SS_DF_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* Get the vector of side set dist. fact counts */
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_get_var_longlong(exoid, varid, df_cnts);
+    } else {
+      status = nc_get_var_int(exoid, varid, df_cnts);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get variable \"%s\" from file ID %d",
+              VAR_SS_DF_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+  } /* End "if (df_cnts != NULL)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_sset_var.c b/exodus/cbind/src/ex_get_sset_var.c
new file mode 100644
index 0000000..09f4258
--- /dev/null
+++ b/exodus/cbind/src/ex_get_sset_var.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgssv - ex_get_sset_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     sset_var_index          sideset variable index
+*       int     sset_blk_id             sideset id
+*       int     num_side_this_sset       number of sides in this sideset
+*       
+*
+* exit conditions - 
+*       float*  sset_var_vals           array of sideset variable values
+*
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_get_var, ex_entity_id, etc
+
+/*!
+ * reads the values of a single sideset variable for one sideset at 
+ * one time step in the database; assume the first time step and
+ * sideset variable index is 1
+ * \deprecated Use ex_get_var()(exoid, time_step, EX_SIDE_SET, sset_var_index, sset_id, num_side_this_sset, sset_var_vals) instead
+ */
+
+int ex_get_sset_var (int   exoid,
+                     int   time_step,
+                     int   sset_var_index,
+                     ex_entity_id   sset_id, 
+                     int64_t   num_side_this_sset,
+                     void *sset_var_vals)
+{
+  return ex_get_var(exoid, time_step, EX_SIDE_SET, sset_var_index,
+		    sset_id, num_side_this_sset, sset_var_vals);
+}
diff --git a/exodus/cbind/src/ex_get_sset_var_tab.c b/exodus/cbind/src/ex_get_sset_var_tab.c
new file mode 100644
index 0000000..5012570
--- /dev/null
+++ b/exodus/cbind/src/ex_get_sset_var_tab.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvtt - ex_get_sset_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_sidesets            number of sidesets
+*       int     num_sset_var            number of sideset variables
+*
+* exit conditions - 
+*       int*    sset_var_tab            sideset variable truth table array
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_truth_table, etc
+
+/*!
+ * reads the EXODUS II sideset variable truth table from the database
+ * \deprecated Use ex_get_truth_table()(exoid, EX_SIDE_SET, num_sidesets, num_sset_var, sset_var_tab)
+ */
+
+int ex_get_sset_var_tab (int  exoid,
+                         int  num_sidesets,
+                         int  num_sset_var,
+                         int *sset_var_tab)
+{
+  return ex_get_truth_table(exoid, EX_SIDE_SET, num_sidesets, num_sset_var, sset_var_tab);
+}
diff --git a/exodus/cbind/src/ex_get_time.c b/exodus/cbind/src/ex_get_time.c
new file mode 100644
index 0000000..cf52ae9
--- /dev/null
+++ b/exodus/cbind/src/ex_get_time.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*!
+
+The function ex_get_time() reads the time value for a specified time
+step.
+
+Because time values are floating point values, the application code
+must declare the array passed to be the appropriate type (\c float or
+\c double) to match the compute word size passed in ex_create() or
+ex_open().
+
+\return In case of an error, ex_get_time() returns a negative number; a
+warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  no time steps have been stored in the file.
+
+
+\param[in]  exoid       exodus file ID returned from a previous call to ex_create() or ex_open(). 
+\param[in]  time_step   The time step number. This is essentially an index (in the time
+                        dimension) into the global, nodal, and element variables arrays stored
+			in the database. The first time step is 1.
+\param[out] time_value  Returned time at the specified time step.
+
+As an example, the following coding will read the time value stored in
+the data file for time step n:
+
+\code
+int n, error, exoid;
+float time_value;
+
+\comment{read time value at time step 3}
+n = 3;
+error = ex_get_time (exoid, n, &time_value);
+\endcode
+
+*/
+
+int ex_get_time (int   exoid,
+                 int   time_step,
+                 void *time_value)
+{
+   int status;
+   int varid;
+   size_t start[1];
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0;        /* clear error code */
+
+   /* inquire previously defined variable */
+   if ((status = nc_inq_varid(exoid, VAR_WHOLE_TIME, &varid)) != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to locate time variable in file id %d", exoid);
+     ex_err("ex_get_time",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+
+   /* read time value */
+   start[0] = --time_step;
+
+   if (ex_comp_ws(exoid) == 4) {
+     status = nc_get_var1_float(exoid, varid, start, time_value);
+   } else {
+     status = nc_get_var1_double(exoid, varid, start, time_value);
+   }
+
+   if (status != NC_NOERR) {
+     exerrval = status;
+     sprintf(errmsg,
+            "Error: failed to get time value in file id %d", exoid);
+     ex_err("ex_get_time",errmsg,exerrval);
+     return (EX_FATAL);
+   }
+   return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_truth_table.c b/exodus/cbind/src/ex_get_truth_table.c
new file mode 100644
index 0000000..5068cdb
--- /dev/null
+++ b/exodus/cbind/src/ex_get_truth_table.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvtt - ex_get_truth_table
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid              exodus file id
+*       int     num_blk            number of blocks
+*       int     num_var            number of variables
+*
+* exit conditions - 
+*       int*    var_tab            element variable truth table array
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for ex_get_dimension, EX_FATAL, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+
+/*!
+ * reads the EXODUS II specified variable truth table from the database
+ */
+
+int ex_get_truth_table (int  exoid,
+			ex_entity_type obj_type,
+			int  num_blk,
+			int  num_var,
+			int *var_tab)
+{
+  int dimid, varid, tabid, i, j, status, status1;
+  size_t num_entity = 0;
+  size_t num_var_db = 0;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* routine = "ex_get_truth_table";
+
+  /*
+   * The ent_type and the var_name are used to build the netcdf
+   * variables name.  Normally this is done via a macro defined in
+   * exodusII_int.h
+   */
+  const char* ent_type = NULL;
+  const char* var_name = NULL;
+
+  exerrval = 0; /* clear error code */
+
+  switch (obj_type) {
+  case EX_EDGE_BLOCK:
+    status = ex_get_dimension(exoid, DIM_NUM_EDG_VAR,  "edge variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_EBLK_TAB, &tabid);
+    var_name = "vals_edge_var";
+    ent_type = "eb";
+    break;
+  case EX_FACE_BLOCK:
+    status = ex_get_dimension(exoid, DIM_NUM_FAC_VAR,  "face variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_FBLK_TAB, &tabid);
+    var_name = "vals_face_var";
+    ent_type = "fb";
+    break;
+  case EX_ELEM_BLOCK:
+    status = ex_get_dimension(exoid, DIM_NUM_ELE_VAR,  "element variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_ELEM_TAB, &tabid);
+    var_name = "vals_elem_var";
+    ent_type = "eb";
+    break;
+  case EX_NODE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_NSET_VAR, "nodeset variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_NSET_TAB, &tabid);
+    var_name = "vals_nset_var";
+    ent_type = "ns";
+    break;
+  case EX_EDGE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_ESET_VAR, "edgeset variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_ESET_TAB, &tabid);
+    var_name = "vals_eset_var";
+    ent_type = "es";
+    break;
+  case EX_FACE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_FSET_VAR, "faceset variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_FSET_TAB, &tabid);
+    var_name = "vals_fset_var";
+    ent_type = "fs";
+    break;
+  case EX_SIDE_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_SSET_VAR, "sideset variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_SSET_TAB, &tabid);
+    var_name = "vals_sset_var";
+    ent_type = "ss";
+    break;
+  case EX_ELEM_SET:
+    status = ex_get_dimension(exoid, DIM_NUM_ELSET_VAR, "elemset variables", &num_var_db, &varid, routine);
+    status1 = nc_inq_varid (exoid, VAR_ELSET_TAB, &tabid);
+    var_name = "vals_elset_var";
+    ent_type = "es";
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+      "Error: Invalid variable type %d specified in file id %d",
+      obj_type, exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    return (EX_WARN);
+  }
+
+  status  = ex_get_dimension(exoid, ex_dim_num_objects(obj_type),
+			     ex_name_of_object(obj_type), &num_entity, &dimid, routine);
+  if (status != NC_NOERR) {
+    exerrval = status;
+    return (EX_FATAL);
+  }
+
+  if (num_entity != (size_t)num_blk) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+      "Error: # of %s doesn't match those defined in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_var_db != (size_t)num_var) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+      "Error: # of %s variables doesn't match those defined in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (status1 != NC_NOERR) {
+    /* since truth table isn't stored in the data file, derive it dynamically */
+    for (j=0; j<num_blk; j++) {
+
+      for (i=0; i<num_var; i++) {
+        /* NOTE: names are 1-based */
+        if (nc_inq_varid (exoid, ex_catstr2(var_name, i+1, ent_type, j+1), &tabid) == NC_NOERR) {
+          /* variable exists; put a 1 in the truth table */
+          var_tab[j*num_var+i] = 1;
+        } else {
+          /* variable doesn't exist; put a 0 in the truth table */
+          var_tab[j*num_var+i] = 0;
+        }
+      }
+    }
+  } else {
+    /* read in the truth table */
+    status = nc_get_var_int(exoid, tabid, var_tab);
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+        "Error: failed to get %s truth table from file id %d",
+	      ex_name_of_object(obj_type), exoid);
+      ex_err(routine,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  } 
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_var.c b/exodus/cbind/src/ex_get_var.c
new file mode 100644
index 0000000..3733824
--- /dev/null
+++ b/exodus/cbind/src/ex_get_var.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgev - ex_get_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                exodus file id
+*       int     time_step            time step number
+*       ex_entity_type var_type             block/variable type
+*                                      node, edge/face/element block, or
+*                                      node/edge/face/side/element set
+*       int     var_index            variable index
+*       int     obj_id               object id
+*       int     num_entry_this_obj   number of entries in this object
+*
+*
+* exit conditions - 
+*       float*  var_vals                array of element variable values
+*
+*
+* revision history - 
+*   20061002 - David Thompson - Adapted from ex_get_elem_var
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, etc
+
+/*
+ * reads the values of a single element variable for one element block at 
+ * one time step in the database; assume the first time step and
+ * element variable index is 1
+ */
+
+int ex_get_var( int   exoid,
+                int   time_step,
+                ex_entity_type var_type,
+                int   var_index,
+                ex_entity_id   obj_id, 
+                int64_t   num_entry_this_obj,
+                void* var_vals )
+{
+  int status;
+  int varid, obj_id_ndx;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+
+  if (var_type == EX_NODAL) {
+    /* FIXME: Special case: ignore obj_id, possible large_file complications, etc. */
+    return ex_get_nodal_var( exoid, time_step, var_index, num_entry_this_obj, var_vals );
+  } else if (var_type == EX_GLOBAL) {
+    /* FIXME: Special case: all vars stored in 2-D single array. */
+    return ex_get_glob_vars( exoid, time_step, num_entry_this_obj, var_vals );
+  }
+   
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in VAR_ID_EL_BLK array */
+  obj_id_ndx = ex_id_lkup(exoid,var_type,obj_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: no %s variables for NULL block %"PRId64" in file id %d",
+	      ex_name_of_object(var_type), obj_id,exoid);
+      ex_err("ex_get_var",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in id variable in file id %d",
+	      ex_name_of_object(var_type), obj_id, exoid);
+      ex_err("ex_get_var",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire previously defined variable */
+
+  if((status = nc_inq_varid(exoid, ex_name_var_of_object(var_type,var_index,
+							 obj_id_ndx), &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s %"PRId64" var %d in file id %d",
+	    ex_name_of_object(var_type),obj_id,var_index,exoid); 
+    ex_err("ex_get_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* read values of element variable */
+  start[0] = --time_step;
+  start[1] = 0;
+
+  count[0] = 1;
+  count[1] = num_entry_this_obj;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, varid, start, count, var_vals);
+  } else {
+    status = nc_get_vara_double(exoid, varid, start, count, var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get %s %"PRId64" variable %d in file id %d", 
+	    ex_name_of_object(var_type), obj_id, var_index,exoid);
+    ex_err("ex_get_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_var_name.c b/exodus/cbind/src/ex_get_var_name.c
new file mode 100644
index 0000000..89d302f
--- /dev/null
+++ b/exodus/cbind/src/ex_get_var_name.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvnm - ex_get_var_name
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   var_type                variable type: G,N, or E
+*       int     var_num                 variable index to read 1..num_var
+*
+* exit conditions - 
+*       char*   var_name                ptr to variable name
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_variable_name, etc
+
+/*!
+ * reads the name of a particular results variable from the database
+ * \deprecated use ex_get_variable_name()(exoid, obj_type, var_num, *var_name)
+ */
+
+int ex_get_var_name (int   exoid,
+                     const char *var_type,
+                     int   var_num,
+                     char *var_name)
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return ex_get_variable_name(exoid, obj_type, var_num, var_name);
+}
diff --git a/exodus/cbind/src/ex_get_var_names.c b/exodus/cbind/src/ex_get_var_names.c
new file mode 100644
index 0000000..7d10166
--- /dev/null
+++ b/exodus/cbind/src/ex_get_var_names.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvan - ex_get_var_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   var_type                variable type: G,N, or E
+*       int     num_vars                # of variables to read
+*
+* exit conditions - 
+*       char*   var_names               ptr array of variable names
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_variable_names, etc
+
+
+/*!
+ * reads the names of the results variables from the database
+ * \deprecated Use ex_get_variable_names()(exoid, obj_type, num_vars, var_names)
+ */
+
+int ex_get_var_names (int   exoid,
+                      const char *var_type,
+                      int   num_vars,
+                      char *var_names[])
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return ex_get_variable_names(exoid, obj_type, num_vars, var_names);
+}
diff --git a/exodus/cbind/src/ex_get_var_param.c b/exodus/cbind/src/ex_get_var_param.c
new file mode 100644
index 0000000..9d6732c
--- /dev/null
+++ b/exodus/cbind/src/ex_get_var_param.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvp - ex_get_var_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   var_type                variable type G,N, or E
+*
+* exit conditions - 
+*       int*    num_vars                number of variables in database
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_variable_param, etc
+
+
+/*!
+ * reads the number of global, nodal, or element variables that are 
+ * stored in the database
+ * \deprecated Use ex_get_variable_param()(exoid, obj_type, *num_vars)
+ */
+
+int ex_get_var_param (int   exoid,
+                      const char *var_type,
+                      int  *num_vars)
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return (ex_get_variable_param(exoid, obj_type, num_vars));
+}
diff --git a/exodus/cbind/src/ex_get_var_tab.c b/exodus/cbind/src/ex_get_var_tab.c
new file mode 100644
index 0000000..7ffdbaa
--- /dev/null
+++ b/exodus/cbind/src/ex_get_var_tab.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvtt - ex_get_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid              exodus file id
+*       int     num_blk            number of blocks
+*       int     num_var            number of variables
+*
+* exit conditions - 
+*       int*    var_tab            element variable truth table array
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_get_truth_table, etc
+
+
+/*!
+ * reads the EXODUS II specified variable truth table from the database
+ * \deprecated Use ex_get_truth_table()(exoid, obj_type, num_blk, num_var, var_tab)
+ */
+
+int ex_get_var_tab (int  exoid,
+                    const char *var_type,
+                    int  num_blk,
+                    int  num_var,
+                    int *var_tab)
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return ex_get_truth_table(exoid, obj_type, num_blk, num_var, var_tab);
+}
diff --git a/exodus/cbind/src/ex_get_var_time.c b/exodus/cbind/src/ex_get_var_time.c
new file mode 100644
index 0000000..67d6498
--- /dev/null
+++ b/exodus/cbind/src/ex_get_var_time.c
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvart - ex_get_var_time
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     var_type                variable type global, nodal,
+*                                         edge/face/elem block,
+*                                         node/edge/face/side/elem set
+*       int     var_index               element variable index
+*       int     id                      entry number
+*       int     beg_time_step           time step number
+*       int     end_time_step           time step number
+*
+* exit conditions - 
+*       float*  var_vals                array of element variable values
+*
+* revision history - 
+*   20061002 - David Thompson - Adapted from ex_get_var_time
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ST_ZU, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*
+ * reads the values of a variable for a single entry of an object (block or set) through a 
+ * specified number of time steps in the database; assume the first
+ * variable index, entry number, and time step are 1
+ */
+
+int ex_get_var_time( int   exoid,
+                     ex_entity_type var_type,
+                     int   var_index,
+                     int64_t   id,
+                     int   beg_time_step, 
+                     int   end_time_step,
+                     void* var_vals )
+{
+  int dimid, varid, numel = 0, offset;
+  int status;
+  int *stat_vals;
+  size_t num_obj, i;
+  size_t num_entries_this_obj = 0;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* varobjids;
+  const char* varobstat;
+
+  switch (var_type) {
+  case EX_GLOBAL:
+    return ex_get_glob_var_time( exoid, var_index, beg_time_step, end_time_step, var_vals );
+  case EX_NODAL:
+    return ex_get_nodal_var_time( exoid, var_index, id, beg_time_step, end_time_step, var_vals );
+  case EX_EDGE_BLOCK:
+    varobjids =   VAR_ID_ED_BLK; 
+    varobstat = VAR_STAT_ED_BLK;
+    break;
+  case EX_FACE_BLOCK:
+    varobjids =   VAR_ID_FA_BLK; 
+    varobstat = VAR_STAT_FA_BLK;
+    break;
+  case EX_ELEM_BLOCK:
+    varobjids =   VAR_ID_EL_BLK; 
+    varobstat = VAR_STAT_EL_BLK;
+    break;
+  case EX_NODE_SET:
+    varobjids =      VAR_NS_IDS; 
+    varobstat =      VAR_NS_STAT;
+    break;
+  case EX_EDGE_SET:
+    varobjids =      VAR_ES_IDS;
+    varobstat =      VAR_ES_STAT;
+    break;
+  case EX_FACE_SET:
+    varobjids =      VAR_FS_IDS; 
+    varobstat =      VAR_FS_STAT;
+    break;
+  case EX_SIDE_SET:
+    varobjids =      VAR_SS_IDS; 
+    varobstat =      VAR_SS_STAT;
+    break;
+  case EX_ELEM_SET:
+    varobjids =      VAR_ELS_IDS; 
+    varobstat =      VAR_ELS_STAT;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg, "Error: Invalid variable type (%d) specified for file id %d", var_type, exoid );
+    ex_err( "ex_get_var_time", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  exerrval = 0; /* clear error code */
+
+  /* assume entry number is 1-based (the first entry of an object is 1, not 0);
+   * adjust so it is 0-based
+   */
+  id--;
+
+  /* find what object the entry is in */
+
+  /* first, find out how many objects there are */
+  status = ex_get_dimension(exoid, ex_dim_num_objects(var_type), ex_name_of_object(var_type),
+			    &num_obj, &dimid, "ex_get_var_time");
+  if (status != NC_NOERR) return status;
+
+  /* get the array of object ids */
+  /* don't think we need this anymore since the netcdf variable names 
+     associated with objects don't contain the object ids */
+
+  if ((status = nc_inq_varid (exoid, varobjids, &varid )) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s ids in file id %d",
+	    ex_name_of_object(var_type),exoid);
+    ex_err("ex_get_var_time",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* allocate space for stat array */
+  if (!(stat_vals = malloc((int)num_obj*sizeof(int)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate memory for %s status array for file id %d",
+	    ex_name_of_object(var_type),exoid);
+    ex_err("ex_get_var_time",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* get variable id of status array */
+  if (nc_inq_varid (exoid, varobstat, &varid) == NC_NOERR) {
+    /* if status array exists, use it, otherwise assume, object exists
+       to be backward compatible */
+
+    if ((status = nc_get_var_int(exoid, varid, stat_vals)) != NC_NOERR) {
+      exerrval = status;
+      free(stat_vals);
+      sprintf(errmsg,
+	      "Error: failed to get %s status array from file id %d",
+	      ex_name_of_object(var_type),exoid);
+      ex_err("ex_get_var_time",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else { /* default: status is true */
+    for(i=0;i<num_obj;i++)
+      stat_vals[i]=1;
+  }
+
+  /* loop through each object until id is found;  since entry
+   * numbers are sequential (beginning with 1) id is in obj_i
+   * when id_first_i <= id <= id_last_i, where
+   * id_first_i is the entry number of the first entry in 
+   * obj_i and id_last_i is the entry number of the last
+   * entry in obj_i
+   */
+
+  i = 0;
+  if (stat_vals[i] != 0)  {
+    if ((status = nc_inq_dimid(exoid, ex_dim_num_entries_in_object(var_type,i+1), &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate number of entries in %"ST_ZU"th %s in file id %d",
+	      i, ex_name_of_object(var_type), exoid);
+      ex_err("ex_get_var_time",errmsg,exerrval);
+      free(stat_vals);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_inq_dimlen(exoid, dimid, &num_entries_this_obj)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of entries in %"ST_ZU"th %s in file id %d",
+	      i, ex_name_of_object(var_type), exoid);
+      ex_err("ex_get_var_time",errmsg,exerrval);
+      free(stat_vals);
+      return (EX_FATAL);
+    }
+  } /* End NULL object check */
+
+  numel = num_entries_this_obj;
+
+  while (numel <= id) {
+    if (stat_vals[++i] != 0) {
+      if ((status = nc_inq_dimid(exoid,ex_dim_num_entries_in_object(var_type,i+1), &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate number of entries in %"ST_ZU"th %s in file id %d",
+		i, ex_name_of_object(var_type), exoid);
+	ex_err("ex_get_var_time",errmsg,exerrval);
+	free(stat_vals);
+	return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, &num_entries_this_obj)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of entries in %"ST_ZU"th %s in file id %d",
+		i, ex_name_of_object(var_type), exoid);
+	ex_err("ex_get_var_time",errmsg,exerrval);
+	free(stat_vals);
+	return (EX_FATAL);
+      }
+      numel += num_entries_this_obj;
+    }
+  }
+  offset = id - (numel - num_entries_this_obj);
+
+  /* inquire previously defined variable */
+  if ((status = nc_inq_varid(exoid,ex_name_var_of_object(var_type,var_index,i+1), &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate variable %"ST_ZU" for %dth %s in file id %d",
+	    i, var_index,ex_name_of_object(var_type),exoid);
+    ex_err("ex_get_var_time",errmsg,exerrval);
+    free(stat_vals);
+    return (EX_FATAL);
+  }
+
+  free(stat_vals);
+
+  /* read values of object variable */
+  start[0] = --beg_time_step;
+  start[1] = offset;
+
+  if (end_time_step < 0) {
+    /* user is requesting the maximum time step;  we find this out using the
+     * database inquire function to get the number of time steps;  the ending
+     * time step number is 1 less due to 0 based array indexing in C
+     */
+    end_time_step = ex_inquire_int (exoid, EX_INQ_TIME);
+  }
+
+  end_time_step--;
+
+  count[0] = end_time_step - beg_time_step + 1;
+  count[1] = 1;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_get_vara_float(exoid, varid, start, count, var_vals);
+  } else {
+    status = nc_get_vara_double(exoid, varid, start, count, var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get %s variable values in file id %d",
+	    ex_name_of_object(var_type),exoid);
+    ex_err("ex_get_var_time",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_variable_name.c b/exodus/cbind/src/ex_get_variable_name.c
new file mode 100644
index 0000000..044eec9
--- /dev/null
+++ b/exodus/cbind/src/ex_get_variable_name.c
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvnm - ex_get_variable_name
+*
+* entry conditions - 
+*   input parameters:
+*       int   exoid                   exodus file id
+*       int   obj_type                variable type
+*       int   var_num                 variable index to read 1..num_var
+*
+* exit conditions - 
+*       char*   var_name                ptr to variable name
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf, NULL
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid
+
+/*!
+ * reads the name of a particular results variable from the database
+ */
+
+int ex_get_variable_name (int   exoid,
+			  ex_entity_type obj_type,
+			  int   var_num,
+			  char *var_name)
+{
+  int status;
+  int varid;
+  char errmsg[MAX_ERR_LENGTH];
+  const char *vname = NULL;
+   
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined variables  */
+
+  switch (obj_type) {
+  case EX_GLOBAL:
+    vname = VAR_NAME_GLO_VAR;
+    break;
+  case EX_NODAL:
+    vname = VAR_NAME_NOD_VAR;
+    break;
+  case EX_EDGE_BLOCK:
+    vname = VAR_NAME_EDG_VAR;
+    break;
+  case EX_FACE_BLOCK:
+    vname = VAR_NAME_FAC_VAR;
+    break;
+  case EX_ELEM_BLOCK:
+    vname = VAR_NAME_ELE_VAR;
+    break;
+  case EX_NODE_SET:
+    vname = VAR_NAME_NSET_VAR;
+    break;
+  case EX_EDGE_SET:
+    vname = VAR_NAME_ESET_VAR;
+    break;
+  case EX_FACE_SET:
+    vname = VAR_NAME_FSET_VAR;
+    break;
+  case EX_SIDE_SET:
+    vname = VAR_NAME_SSET_VAR;
+    break;
+  case EX_ELEM_SET:
+    vname = VAR_NAME_ELSET_VAR;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg, "Error: Invalid variable type (%d) given for file id %d", obj_type, exoid );
+    ex_err( "ex_get_variable_name", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, vname, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Warning: no %s variable names stored in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_get_variable_name",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* read the variable name */
+  {
+    int db_name_size = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);
+    int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
+    int name_size = db_name_size < api_name_size ? db_name_size : api_name_size;
+
+    status = ex_get_name_internal(exoid, varid, var_num-1, var_name, name_size, obj_type, "ex_get_variable_name");
+    if (status != NC_NOERR) {
+      return (EX_FATAL);
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_variable_names.c b/exodus/cbind/src/ex_get_variable_names.c
new file mode 100644
index 0000000..b20596b
--- /dev/null
+++ b/exodus/cbind/src/ex_get_variable_names.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid
+
+
+/*!
+The function ex_get_variable_names() reads the names of the results
+variables from the database. Memory must be allocated for the name
+array before this function is invoked. The names are \p
+MAX_STR_LENGTH-characters in length.
+
+\return In case of an error, ex_get_variable_names() returns a
+negative number; a warning will return a positive number.  Possible
+causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  invalid variable type specified.
+  -  a warning value is returned if no variables of the specified
+     type are stored in the file.
+
+\param[in]  exoid      exodus file ID returned from a previous call to ex_create() or ex_open(). 
+\param[in]  obj_type   Variable indicating the type of variable which is described. Use one
+                       of the options in the table below.
+\param[in]  num_vars   The number of \c var_type variables that will be read 
+                       from the database.
+\param[out] var_names  Returned array of pointers to \c num_vars variable names.
+
+<table>
+<tr><td> \c EX_GLOBAL}    </td><td>  Global entity type       </td></tr>
+<tr><td> \c EX_NODAL}     </td><td>  Nodal entity type        </td></tr>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+</table>
+
+As an example, the following code segment will read the names of the
+nodal variables stored in the data file:
+
+\code
+int error, exoid, num_nod_vars;
+char *var_names[10];
+
+\comment{read nodal variables parameters and names}
+error = ex_get_variable_param(exoid, EX_NODAL, &num_nod_vars);
+for (i=0; i < num_nod_vars; i++) {
+   var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+}
+error = ex_get_variable_names(exoid, EX_NODAL, num_nod_vars, var_names);
+\endcode
+
+*/
+
+int ex_get_variable_names (int   exoid,
+			   ex_entity_type obj_type,
+			   int   num_vars,
+			   char *var_names[])
+{
+  int varid, status;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* vvarname;
+
+  exerrval = 0; /* clear error code */
+
+  switch (obj_type) {
+  case EX_NODAL:
+    vvarname = VAR_NAME_NOD_VAR;
+    break;
+  case EX_EDGE_BLOCK:
+    vvarname = VAR_NAME_EDG_VAR;
+    break;
+  case EX_FACE_BLOCK:
+    vvarname = VAR_NAME_FAC_VAR;
+    break;
+  case EX_ELEM_BLOCK:
+    vvarname = VAR_NAME_ELE_VAR;
+    break;
+  case EX_NODE_SET:
+    vvarname = VAR_NAME_NSET_VAR;
+    break;
+  case EX_EDGE_SET:
+    vvarname = VAR_NAME_ESET_VAR;
+    break;
+  case EX_FACE_SET:
+    vvarname = VAR_NAME_FSET_VAR;
+    break;
+  case EX_SIDE_SET:
+    vvarname = VAR_NAME_SSET_VAR;
+    break;
+  case EX_ELEM_SET:
+    vvarname = VAR_NAME_ELSET_VAR;
+    break;
+  case EX_GLOBAL:
+    vvarname = VAR_NAME_GLO_VAR;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+      "Warning: invalid variable type %d requested from file id %d",
+	    obj_type, exoid);
+    ex_err("ex_get_variable_names",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* inquire previously defined variables  */
+  if ((status = nc_inq_varid(exoid, vvarname, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg, "Warning: no %s variables names stored in file id %d",
+	    ex_name_of_object(obj_type),exoid);
+    ex_err("ex_get_variable_names",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* read the variable names */
+  status = ex_get_names_internal(exoid, varid, num_vars, var_names, obj_type, "ex_get_variable_names");
+  if (status != NC_NOERR) {
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_get_variable_param.c b/exodus/cbind/src/ex_get_variable_param.c
new file mode 100644
index 0000000..ad63d1d
--- /dev/null
+++ b/exodus/cbind/src/ex_get_variable_param.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exgvp - ex_get_variable_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                variable type
+*
+* exit conditions - 
+*       int*    num_vars                number of variables in database
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*!
+
+The function ex_get_variable_param() reads the number of global,
+nodal, or element variables stored in the database.
+
+\return In case of an error, ex_get_variable_param() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  invalid variable type specified.
+
+\param[in]  exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  obj_type  Variable indicating the type of variable which is described. Use one
+                      of the options in the table below.
+\param[out] num_vars  Returned number of \c var_type variables that are stored in the database.
+
+<table>
+<tr><td> \c EX_GLOBAL}    </td><td>  Global entity type       </td></tr>
+<tr><td> \c EX_NODAL}     </td><td>  Nodal entity type        </td></tr>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+</table>
+
+As an example, the following coding will determine the number of
+global variables stored in the data file:
+
+\code
+int num_glo_vars, error, exoid;
+
+\comment{read global variables parameters}
+error = ex_get_variable_param(exoid, EX_GLOBAL, &num_glo_vars);
+\endcode
+
+*/
+
+int ex_get_variable_param (int   exoid,
+			   ex_entity_type obj_type,
+			   int  *num_vars)
+{
+  int dimid;
+  size_t dimlen;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumvar;
+  int status;
+  
+  exerrval = 0; /* clear error code */
+  *num_vars = 0;
+  
+  switch (obj_type) {
+  case EX_GLOBAL:
+    dnumvar = DIM_NUM_GLO_VAR;
+    break;
+  case EX_NODAL:
+    dnumvar = DIM_NUM_NOD_VAR;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumvar = DIM_NUM_EDG_VAR;
+    break;
+  case EX_FACE_BLOCK:
+    dnumvar = DIM_NUM_FAC_VAR;
+    break;
+  case EX_ELEM_BLOCK:
+    dnumvar = DIM_NUM_ELE_VAR;
+    break;
+  case EX_NODE_SET:
+    dnumvar = DIM_NUM_NSET_VAR;
+    break;
+  case EX_EDGE_SET:
+    dnumvar = DIM_NUM_ESET_VAR;
+    break;
+  case EX_FACE_SET:
+    dnumvar = DIM_NUM_FSET_VAR;
+    break;
+  case EX_SIDE_SET:
+    dnumvar = DIM_NUM_SSET_VAR;
+    break;
+  case EX_ELEM_SET:
+    dnumvar = DIM_NUM_ELSET_VAR;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+            "Warning: invalid variable type %d requested from file id %d",
+            obj_type, exoid);
+    ex_err("ex_get_var_param",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  if ((status = nc_inq_dimid (exoid, dnumvar, &dimid)) != NC_NOERR) {
+    *num_vars = 0;
+    if (status == NC_EBADDIM)
+      return(EX_NOERR);      /* no global variables defined */
+    else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %s variable names in file id %d",
+	      ex_name_of_object(obj_type),exoid);
+      ex_err("ex_get_var_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &dimlen)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of %s variables in file id %d",
+	    ex_name_of_object(obj_type),exoid);
+    ex_err("ex_get_var_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  *num_vars = dimlen;
+  
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_inquire.c b/exodus/cbind/src/ex_inquire.c
new file mode 100644
index 0000000..c33ffe6
--- /dev/null
+++ b/exodus/cbind/src/ex_inquire.c
@@ -0,0 +1,1138 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "exodusII.h"
+#include "exodusII_int.h"
+
+/*!
+\fn{int ex_inquire (int exoid, int req_info, void_int *ret_int, float *ret_float, char *ret_char)}
+
+The function ex_inquire() is used to inquire values of certain
+data entities in an exodus file. Memory must be allocated for the
+returned values before this function is invoked.query database. \sa ex_inquire_int().
+
+\return In case of an error, ex_inquire() returns a negative
+	number; a warning will return a positive number.
+	Possible causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open().
+  -  requested information not stored in the file.
+  -  invalid request flag.
+
+\param[in] exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] req_info  A flag which designates what information is requested. It must be one
+		     of the following constants in the table below.
+
+\param[out]  ret_int   Returned integer, if an integer value is requested (according
+		       to \c req_info); otherwise, supply a dummy argument.
+
+\param[out]  ret_float Returned float, if a float value is requested
+		       (according to \c req_info); otherwise, supply a dummy
+		       argument. This argument is always a float even if the database IO
+		       and/or CPU word size is a double.
+
+\param[out]  ret_char  Returned character string, if a character value is requested (according
+		       to \c req_info); otherwise, supply a dummy argument.
+
+<table>
+<tr><td>\c EX_INQ_API_VERS</td><td> The exodus API version number is returned
+ in \c ret_float and an undotted version number is returned in
+ \c ret_int. The API version number reflects the release of the
+ function library (i.e., function names, argument list, etc.). The API
+ and LIB version numbers are synchronized and will always
+ match. Initially, it was thought that maintaining the two versions
+ separately would be a benefit, but that was more confusing than
+ helpful, so the numbers were made the same.</td></tr>
+
+ <tr><td> \c EX_INQ_DB_VERS </td><td> The exodus database version number is
+ returned in \c ret_float and an ``undotted'' version number is
+ returned in \c ret_int. The database version number reflects the
+ version of the library that was used to \e write the file pointed to by
+ \c exoid. </td></tr>
+
+ <tr><td> \c EX_INQ_LIB_VERS  </td><td>The exodus library version number is
+ returned in \c ret_float and an undotted version number is
+ returned in \c ret_int. The API library version number reflects
+ the version number of the exodus library linked with this
+ application. </td></tr>
+
+ <tr><td> \c EX_INQ_TITLE  </td><td>The title stored in the database is returned in \c ret_char. </td></tr>
+
+ <tr><td> \c EX_INQ_DIM  </td><td>The dimensionality, or number of coordinates
+ per node (1, 2 or 3), of the database is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_NODES  </td><td>The number of nodes is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELEM  </td><td>The number of elements is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELEM_BLK  </td><td>The number of element blocks is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_NODE_SETS  </td><td>The number of node sets is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_NS_NODE_LEN  </td><td>The length of the concatenated node
+ sets node list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_NS_DF_LEN  </td><td>The length of the concatenated node
+ sets distribution list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_SIDE_SETS  </td><td>The number of side sets is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_SS_ELEM_LEN  </td><td>The length of the concatenated side
+ sets element list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_SS_DF_LEN  </td><td>The length of the concatenated side
+ sets distribution factor list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_SS_NODE_LEN  </td><td>The aggregate length of all of the
+ side sets node lists is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EB_PROP  </td><td>The number of integer properties stored
+ for each element block is returned in \c ret_int; this number
+ includes the property named \c ID. </td></tr>
+
+ <tr><td> \c EX_INQ_NS_PROP  </td><td>The number of integer properties stored
+ for each node set is returned in \c ret_int; this number includes
+ the property named \c ID. </td></tr>
+
+ <tr><td> \c EX_INQ_SS_PROP  </td><td>The number of integer properties stored
+ for each side set is returned in \c ret_int; this number includes
+ the property named \c ID. </td></tr>
+
+ <tr><td> \c EX_INQ_QA  </td><td>The number of QA records is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_INFO  </td><td>The number of information records is returned
+ in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_TIME  </td><td>The number of time steps stored in the
+ database is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EDGE_BLK   </td><td>The number of edge blocks is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EDGE_MAP   </td><td>The number of edge maps is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EDGE_PROP   </td><td>The number of properties stored per
+ edge blockis returned in \c ret_int.  </td></tr>
+
+ <tr><td> \c EX_INQ_EDGE_SETS   </td><td>The number of edge sets is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EDGE   </td><td>The number of edges is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FACE   </td><td>The number of faces is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EB_PROP   </td><td>The number of element block properties is
+ returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELEM_MAP   </td><td>The number of element maps is returned
+ in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELEM_SETS   </td><td>The number of element sets is returned
+ in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELS_DF_LEN   </td><td>The length of the concatenated
+ element set distribution factor list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELS_LEN   </td><td>The length of the concatenated element
+ set element list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ELS_PROP   </td><td>The number of properties stored per elem
+ set is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_EM_PROP   </td><td>The number of element map properties is
+ returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ES_DF_LEN   </td><td>The length of the concatenated edge
+ set distribution factor list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ES_LEN   </td><td>The length of the concatenated edge set
+ edge list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_ES_PROP   </td><td>The number of properties stored per edge
+ set is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FACE_BLK   </td><td>The number of face blocks is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FACE_MAP   </td><td>The number of face maps is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FACE_PROP   </td><td>The number of properties stored per
+ face block is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FACE_SETS   </td><td>The number of face sets is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FS_DF_LEN   </td><td>The length of the concatenated face
+ set distribution factor list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FS_LEN   </td><td>The length of the concatenated face set
+ face list is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_FS_PROP   </td><td>The number of properties stored per face
+ set is returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_NM_PROP   </td><td>The number of node map properties is
+ returned in \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_NODE_MAP   </td><td>The number of node maps is returned in
+ \c ret_int. </td></tr>
+
+ <tr><td> \c EX_INQ_COORD_FRAMES </td><td>The number of coordinate frames is returned in \c ret_int. </td></tr>
+</table>
+
+As an example, the following will return the number of element
+block properties stored in the exodus file :
+
+\code
+#include "exodusII.h"
+int error, exoid, num_props;
+float fdum;
+char *cdum;
+
+\comment{determine the number of element block properties}
+error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props,
+		    &fdum, cdum);
+...Another way to get the same information
+num_props = ex_inquire_int(exoid, EX_INQ_EB_PROP);
+\endcode
+
+*/
+
+/*! \cond INTERNAL */
+static int ex_get_dimension_value(int exoid, int64_t *var, int default_value, const char *dimension_name, int missing_ok)
+{
+  int status;
+  char  errmsg[MAX_ERR_LENGTH];
+  size_t idum;
+  int dimid;
+
+  if ((status = nc_inq_dimid( exoid, dimension_name, &dimid)) != NC_NOERR) {
+    *var = default_value;
+    if ( missing_ok ) {
+      return (EX_NOERR);
+    } else {
+      exerrval = status;
+      sprintf( errmsg,
+	       "Error: failed to retrieve dimension %s for file id %d",
+	       dimension_name, exoid);
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  if ((status = nc_inq_dimlen( exoid, dimid, &idum)) != NC_NOERR) {
+    *var = default_value;
+    exerrval = status;
+    sprintf( errmsg,
+	     "Error: failed to retrieve value for dimension %s for file id %d",
+	     dimension_name, exoid);
+    ex_err("ex_inquire",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  *var = idum;
+  return (EX_NOERR);
+}
+
+static int ex_get_concat_set_len(int exoid, int64_t *set_length, const char *set_name,
+				 ex_entity_type set_type, const char *set_num_dim,
+				 const char *set_stat_var, const char *set_size_root,
+				 int missing_ok)
+{
+  int i;
+  int status;
+  char  errmsg[MAX_ERR_LENGTH];
+  size_t idum;
+  int dimid, varid;
+  size_t num_sets;
+  int *stat_vals = NULL;
+
+  *set_length = 0;     /* default return value */
+
+  if ((status = nc_inq_dimid (exoid, set_num_dim, &dimid)) == NC_NOERR)
+    {
+      if ((status = nc_inq_dimlen (exoid, dimid, &num_sets)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of %s sets in file id %d",
+		set_name, exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      /* Allocate space for stat array */
+      if (!(stat_vals = malloc((int)num_sets*sizeof(int)))) {
+	exerrval = EX_MEMFAIL;
+	sprintf(errmsg,
+		"Error: failed to allocate memory for %s set status array for file id %d",
+		set_name, exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      /* get variable id of status array */
+      if ((status = nc_inq_varid (exoid, set_stat_var, &varid)) == NC_NOERR) {
+	/* if status array exists, use it, otherwise assume, object exists
+	   to be backward compatible */
+	if ((status = nc_get_var_int(exoid, varid, stat_vals)) != NC_NOERR) {
+	  exerrval = status;
+	  free(stat_vals);
+	  sprintf(errmsg,
+		  "Error: failed to get %s set status array from file id %d",
+		  set_name, exoid);
+	  ex_err("ex_inquire",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+      } else /* default: status is true */
+	for(i=0;i<num_sets;i++)
+	  stat_vals[i]=1;
+
+      for (i=0; i<num_sets; i++) {
+	if (stat_vals[i] == 0) /* is this object null? */
+	  continue;
+
+
+	if ((status = nc_inq_dimid (exoid, ex_catstr(set_size_root,i+1), &dimid)) != NC_NOERR) {
+	  if ( missing_ok ) {
+	    idum = 0;
+	  } else {
+	    *set_length = 0;
+	    free(stat_vals);
+	    return (EX_FATAL);
+	  }
+	} else {
+	  if ((status = nc_inq_dimlen (exoid, dimid, &idum)) != NC_NOERR) {
+	    *set_length = 0;
+	    free(stat_vals);
+	    return (EX_FATAL);
+	  }
+	}
+
+	*set_length += idum;
+      }
+
+      free(stat_vals);
+    }
+  return (EX_NOERR);
+}
+
+static void flt_cvt(float *xptr,double x)
+{
+  *xptr = (float)x;
+}
+/*! \endcond */
+
+static int ex_inquire_internal (int      exoid,
+				int      req_info,
+				int64_t *ret_int,
+				float   *ret_float,
+				char    *ret_char)
+{
+  int dimid, varid, tmp_num, rootid;
+  void_int *ids = NULL;
+  size_t i;
+  size_t ldum = 0;
+  size_t num_sets, idum;
+  int *stat_vals;
+  char  errmsg[MAX_ERR_LENGTH];
+  int status;
+  char tmp_title[2048];
+
+  exerrval = 0; /* clear error code */
+
+  if (ret_char)  *ret_char  = '\0';  /* Only needs to be non-null for TITLE */
+  
+  if (!ret_int) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Warning: integer argument is NULL which is not allowed.");
+    ex_err("ex_inquire",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+    
+  rootid = exoid & EX_FILE_ID_MASK;
+
+  switch (req_info) {
+  case EX_INQ_FILE_TYPE:
+
+    /* obsolete call */
+    /*returns "r" for regular EXODUS II file or "h" for history EXODUS file*/
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Warning: file type inquire is obsolete");
+    ex_err("ex_inquire",errmsg,exerrval);
+    return (EX_WARN);
+
+  case EX_INQ_API_VERS:
+    /* returns the EXODUS II API version number */
+    if (!ret_float) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Warning: float argument is NULL for EX_INQ_API_VERS which is not allowed.");
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (nc_get_att_float(rootid, NC_GLOBAL, ATT_API_VERSION, ret_float) != NC_NOERR)
+      {  /* try old (prior to db version 2.02) attribute name */
+	if ((status = nc_get_att_float (rootid, NC_GLOBAL, ATT_API_VERSION_BLANK,ret_float)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get EXODUS API version for file id %d", rootid);
+	  ex_err("ex_inquire",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+      }
+
+    break;
+
+  case EX_INQ_DB_VERS:
+    /* returns the EXODUS II database version number */
+    if (!ret_float) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Warning: float argument is NULL for EX_INQ_DB_VERS which is not allowed.");
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_get_att_float (rootid, NC_GLOBAL, ATT_VERSION, ret_float)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get EXODUS database version for file id %d", rootid);
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    break;
+
+  case EX_INQ_LIB_VERS:
+    /* returns the EXODUS II Library version number */
+    if (ret_float)
+      flt_cvt(ret_float, EX_API_VERS);
+
+    *ret_int = EX_API_VERS_NODOT;
+    break;
+
+  case EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH:
+    /* Return the MAX_NAME_LENGTH size for this database
+       It will not include the space for the trailing null, so if it
+       is defined as 33 on the database, 32 will be returned.
+    */
+    if ((status = nc_inq_dimid(rootid, DIM_STR_NAME, &dimid)) != NC_NOERR) {
+      /* If not found, then an older database */
+      *ret_int = 32;
+    }
+    else {
+      /* Get the name string length */
+      size_t name_length = 0;
+      if ((status = nc_inq_dimlen(rootid,dimid,&name_length)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get name string length in file id %d", exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+      else {
+	*ret_int = name_length-1;
+      }
+    }
+    break;
+
+  case EX_INQ_DB_FLOAT_SIZE:
+    {
+      nc_get_att_longlong(rootid, NC_GLOBAL, ATT_FLT_WORDSIZE, (long long*)ret_int);
+    }
+    break;
+    
+  case EX_INQ_DB_MAX_USED_NAME_LENGTH:
+    /* Return the value of the ATT_MAX_NAME_LENGTH attribute (if it
+       exists) which is the maximum length of any entity, variable,
+       attribute, property name written to this database.  If the
+       attribute does not exist, then '32' is returned.  The length
+       does not include the trailing null.
+    */
+    {
+      nc_type att_type = NC_NAT;
+      size_t att_len = 0;
+	
+      *ret_int = 32; /* Default size consistent with older databases */
+
+      status = nc_inq_att(rootid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, &att_type, &att_len);
+      if (status == NC_NOERR && att_type == NC_INT) {
+	/* The attribute exists, return it... */
+	nc_get_att_longlong(rootid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, (long long*)ret_int);
+      }
+    }
+    break;
+
+  case EX_INQ_MAX_READ_NAME_LENGTH:
+    {
+      /* Returns the user-specified maximum size of names that will be
+       * returned to the user by any of the ex_get_ routines.  If the
+       * name is longer than this value, it will be truncated. The
+       * default if not set by the client is 32 characters. The value
+       * does not include the trailing null.
+       */
+      struct ex_file_item* file = ex_find_file_item(rootid);
+
+      if (!file ) {
+	exerrval = EX_BADFILEID;
+	sprintf(errmsg,"Error: unknown file id %d for ex_inquire_int().",rootid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	*ret_int = 0;
+      }
+      else {
+	*ret_int = file->maximum_name_length;
+      }
+    }
+    break;
+
+  case EX_INQ_TITLE:
+    if (!ret_char) {
+      sprintf(errmsg,
+	      "Error: Requested title, but character pointer was null for file id %d", rootid);
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    } else {
+      /* returns the title of the database */
+      /* Title is stored at root level... */
+      if ((status = nc_get_att_text (rootid, NC_GLOBAL, ATT_TITLE, tmp_title)) != NC_NOERR) {
+	*ret_char = '\0';
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get database title for file id %d", exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      } else {
+	strncpy(ret_char, tmp_title, MAX_LINE_LENGTH+1);
+	ret_char[MAX_LINE_LENGTH] = '\0';
+      }
+    }
+    break;
+
+  case EX_INQ_DIM:
+    /* returns the dimensionality (2 or 3, for 2-d or 3-d) of the database */
+    if (ex_get_dimension(exoid, DIM_NUM_DIM, "database dimensionality", &ldum, &dimid, "ex_inquire") != NC_NOERR)
+      return EX_FATAL;
+    *ret_int = ldum;
+    break;
+
+  case EX_INQ_NODES:
+    /* returns the number of nodes */
+    if (ex_get_dimension(exoid, DIM_NUM_NODES, "nodes", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_ELEM:
+    /* returns the number of elements */
+    if (ex_get_dimension(exoid, DIM_NUM_ELEM, "elements", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_ELEM_BLK:
+    /* returns the number of element blocks */
+    if (ex_get_dimension(exoid, DIM_NUM_EL_BLK, "element blocks", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_NODE_SETS:
+    /* returns the number of node sets */
+    if (ex_get_dimension(exoid, DIM_NUM_NS, "node sets", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_NS_NODE_LEN:
+    /* returns the length of the concatenated node sets node list */
+    ex_get_concat_set_len(exoid, ret_int,"node",EX_NODE_SET,DIM_NUM_NS,VAR_NS_STAT,"num_nod_ns",0);
+    break;
+
+  case EX_INQ_NS_DF_LEN:
+    /*     returns the length of the concatenated node sets dist factor list */
+
+    /*
+      Determine the concatenated node sets distribution factor length:
+
+      2. Check see if the dist factor variable for a node set id exists.
+      3. If it exists, goto step 4, else the length is zero.
+      4. Get the dimension of the number of nodes in the node set -0
+      use this value as the length as by definition they are the same.
+      5. Sum the individual lengths for the total list length.
+    */
+
+    *ret_int = 0;    /* default value if no node sets defined */
+
+    if (nc_inq_dimid (exoid, DIM_NUM_NS, &dimid) == NC_NOERR) {
+      if ((status = nc_inq_dimlen(exoid, dimid, &num_sets)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of node sets in file id %d",
+		exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+
+      for (i=0; i<num_sets; i++) {
+	if ((status = nc_inq_varid (exoid, VAR_FACT_NS(i+1), &varid)) != NC_NOERR) {
+	  if (status == NC_ENOTVAR) {
+	    idum = 0;        /* this dist factor doesn't exist */
+	  } else {
+	    *ret_int = 0;
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to locate number of dist fact for %"ST_ZU"'th node set in file id %d",
+		    i, exoid);
+	    ex_err("ex_inquire",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+	} else {
+	  if ((status = nc_inq_dimid (exoid, DIM_NUM_NOD_NS(i+1), &dimid)) != NC_NOERR) {
+	    *ret_int = 0;
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to locate number of nodes in %"ST_ZU"'th node set in file id %d",
+		    i, exoid);
+	    ex_err("ex_inquire",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+	  if ((status = nc_inq_dimlen (exoid, dimid, &idum)) != NC_NOERR) {
+	    *ret_int = 0;
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to get number of nodes in %"ST_ZU"'th node set in file id %d",
+		    i,exoid);
+	    ex_err("ex_inquire",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+	}
+	*ret_int += idum;
+      }
+    }
+
+    break;
+
+  case EX_INQ_SIDE_SETS:
+    /* returns the number of side sets */
+    if (ex_get_dimension(exoid, DIM_NUM_SS, "side sets", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_SS_NODE_LEN:
+
+    /*     returns the length of the concatenated side sets node list */
+
+    *ret_int = 0;     /* default return value */
+
+    if (nc_inq_dimid (exoid, DIM_NUM_SS, &dimid) == NC_NOERR) {
+      if ((status = nc_inq_dimlen(exoid, dimid, &num_sets)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of side sets in file id %d",
+		exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+
+      if (!(ids = malloc(num_sets*sizeof(int64_t)))) { /* May be getting 2x what is needed, but should be OK */
+	exerrval = EX_MEMFAIL;
+	sprintf(errmsg,
+		"Error: failed to allocate memory for side set ids for file id %d",
+		exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      if (ex_get_side_set_ids (exoid, ids) == EX_FATAL) {
+	sprintf(errmsg,
+		"Error: failed to get side set ids in file id %d",
+		exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	free(ids);
+	return (EX_FATAL);
+      }
+
+      /* allocate space for stat array */
+      if (!(stat_vals = malloc((int)num_sets*sizeof(int)))) {
+	exerrval = EX_MEMFAIL;
+	free (ids);
+	sprintf(errmsg,
+		"Error: failed to allocate memory for side set status array for file id %d",
+		exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+      /* get variable id of status array */
+      if ((status = nc_inq_varid (exoid, VAR_SS_STAT, &varid)) == NC_NOERR) {
+	/* if status array exists, use it, otherwise assume, object exists
+	   to be backward compatible */
+
+	if ((status = nc_get_var_int(exoid, varid, stat_vals)) != NC_NOERR) {
+	  exerrval = status;
+	  free (ids);
+	  free(stat_vals);
+	  sprintf(errmsg,
+		  "Error: failed to get element block status array from file id %d",
+		  exoid);
+	  ex_err("ex_inquire",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+      }
+      else /* default: status is true */
+	for(i=0;i<num_sets;i++)
+	  stat_vals[i]=1;
+
+      /* walk id list, get each side set node length and sum for total */
+
+      for (i=0; i<num_sets; i++) {
+	ex_entity_id id;
+	if (stat_vals[i] == 0) /* is this object null? */
+	  continue;
+
+	if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	  int64_t tmp_len = 0;
+	  id = ((int64_t*)ids)[i];
+	  status = ex_get_side_set_node_list_len(exoid, id, &tmp_len);
+	  if (status == NC_NOERR) *ret_int += tmp_len;
+	}
+	else {
+	  int tmp_len = 0;
+	  id = ((int*)ids)[i];
+	  status = ex_get_side_set_node_list_len(exoid, id, &tmp_len);
+	  if (status == NC_NOERR) *ret_int += tmp_len;
+	}
+
+	if (status != NC_NOERR) {
+	  *ret_int = 0;
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to side set %"PRId64" node length in file id %d",
+		  id,exoid);
+	  ex_err("ex_inquire",errmsg,exerrval);
+	  free(stat_vals);
+	  free(ids);
+	  return (EX_FATAL);
+	}
+      }
+
+      free(stat_vals);
+      free (ids);
+    }
+
+    break;
+
+  case EX_INQ_SS_ELEM_LEN:
+    /*     returns the length of the concatenated side sets element list */
+    ex_get_concat_set_len(exoid, ret_int,"side",EX_SIDE_SET,DIM_NUM_SS,VAR_SS_STAT,"num_side_ss",0);
+    break;
+
+  case EX_INQ_SS_DF_LEN:
+
+    /*     returns the length of the concatenated side sets dist factor list */
+
+    /*
+      Determine the concatenated side sets distribution factor length:
+
+      1. Get the side set ids list.
+      2. Check see if the dist factor dimension for a side set id exists.
+      3. If it exists, goto step 4, else set the individual length to zero.
+      4. Sum the dimension value into the running total length.
+    */
+
+    *ret_int = 0;
+
+    /* first check see if any side sets exist */
+
+    if (nc_inq_dimid (exoid, DIM_NUM_SS, &dimid) == NC_NOERR) {
+      if ((status = nc_inq_dimlen (exoid, dimid, &num_sets)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get number of side sets in file id %d",
+		exoid);
+	ex_err("ex_inquire",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      for (i=0; i<num_sets; i++) {
+	if ((status = nc_inq_dimid (exoid, DIM_NUM_DF_SS(i+1), &dimid)) != NC_NOERR) {
+	  if (status == NC_EBADDIM) {
+	    ldum = 0;        /* this dist factor doesn't exist */
+	  } else {
+	    *ret_int = 0;
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to locate number of dist fact for %"ST_ZU"'th side set in file id %d",
+		    i, exoid);
+	    ex_err("ex_inquire",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+	} else {
+	  if ((status = nc_inq_dimlen (exoid, dimid, &ldum)) != NC_NOERR) {
+	    *ret_int = 0;
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to get number of dist factors in %"ST_ZU"'th side set in file id %d",
+		    i, exoid);
+	    ex_err("ex_inquire",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+	}
+	*ret_int += ldum;
+      }
+    }
+
+    break;
+
+  case EX_INQ_QA:
+    /* returns the number of QA records */
+    if (ex_get_dimension(rootid, DIM_NUM_QA, "QA records", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_INFO:
+    /* returns the number of information records */
+    if (ex_get_dimension(rootid, DIM_NUM_INFO, "info records", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_TIME:
+    /*     returns the number of time steps stored in the database */
+    if (ex_get_dimension(exoid, DIM_TIME, "time dimension", &ldum, &dimid, "ex_inquire") != NC_NOERR)
+      return EX_FATAL;
+    *ret_int = ldum;
+    break;
+
+  case EX_INQ_EB_PROP:
+    /* returns the number of element block properties */
+    *ret_int = ex_get_num_props (exoid, EX_ELEM_BLOCK);
+    break;
+
+  case EX_INQ_NS_PROP:
+    /* returns the number of node set properties */
+    *ret_int = ex_get_num_props (exoid, EX_NODE_SET);
+    break;
+
+  case EX_INQ_SS_PROP:
+    /* returns the number of side set properties */
+    *ret_int = ex_get_num_props (exoid, EX_SIDE_SET);
+    break;
+
+  case EX_INQ_ELEM_MAP:
+    /* returns the number of element maps */
+    if (ex_get_dimension(exoid, DIM_NUM_EM, "element maps", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_EM_PROP:
+    /* returns the number of element map properties */
+    *ret_int = ex_get_num_props (exoid, EX_ELEM_MAP);
+    break;
+
+  case EX_INQ_NODE_MAP:
+    /* returns the number of node maps */
+    if (ex_get_dimension(exoid, DIM_NUM_NM, "node maps", &ldum, &dimid, NULL) != NC_NOERR)
+      *ret_int = 0;
+    else
+      *ret_int = ldum;
+    break;
+
+  case EX_INQ_NM_PROP:
+    /* returns the number of node map properties */
+    *ret_int = ex_get_num_props (exoid, EX_NODE_MAP);
+    break;
+
+  case EX_INQ_EDGE:
+    /* returns the number of edges (defined across all edge blocks). */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_EDGE, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_EDGE_BLK:
+    /* returns the number of edge blocks. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_ED_BLK, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_EDGE_SETS:
+    /* returns the number of edge sets. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_ES, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_ES_LEN:
+    /* returns the length of the concatenated edge set edge list. */
+    ex_get_concat_set_len(exoid, ret_int,"edge",EX_EDGE_SET,DIM_NUM_ES,VAR_ES_STAT,"num_edge_es",0);
+    break;
+
+  case EX_INQ_ES_DF_LEN:
+    /* returns the length of the concatenated edge set distribution factor list. */
+    ex_get_concat_set_len(exoid, ret_int,"edge",EX_EDGE_SET,DIM_NUM_ES,VAR_ES_STAT,"num_df_es",1);
+    break;
+
+  case EX_INQ_EDGE_PROP:
+    /* returns the number of integer properties stored for each edge block. This includes the "ID" property. */
+    *ret_int = ex_get_num_props( exoid, EX_EDGE_BLOCK );
+    break;
+
+  case EX_INQ_ES_PROP:
+    /* returns the number of integer properties stored for each edge set.. This includes the "ID" property */
+    *ret_int = ex_get_num_props( exoid, EX_EDGE_SET );
+    break;
+
+  case EX_INQ_FACE:
+    /* returns the number of faces (defined across all face blocks). */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_FACE, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_FACE_BLK:
+    /* returns the number of face blocks. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_FA_BLK, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_FACE_SETS:
+    /* returns the number of face sets. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_FS, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_FS_LEN:
+    /* returns the length of the concatenated edge set edge list. */
+    ex_get_concat_set_len(exoid, ret_int,"face",EX_FACE_SET,DIM_NUM_FS,VAR_FS_STAT,"num_face_fs",0);
+    break;
+
+  case EX_INQ_FS_DF_LEN:
+    /* returns the length of the concatenated edge set distribution factor list. */
+    ex_get_concat_set_len(exoid, ret_int,"face",EX_FACE_SET,DIM_NUM_FS,VAR_FS_STAT,"num_df_fs",1);
+    break;
+
+  case EX_INQ_FACE_PROP:
+    /* returns the number of integer properties stored for each edge block. This includes the "ID" property. */
+    *ret_int = ex_get_num_props( exoid, EX_FACE_BLOCK );
+    break;
+
+  case EX_INQ_FS_PROP:
+    /* returns the number of integer properties stored for each edge set.. This includes the "ID" property */
+    *ret_int = ex_get_num_props( exoid, EX_FACE_SET );
+    break;
+
+  case EX_INQ_ELEM_SETS:
+    /* returns the number of element sets. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_ELS, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_ELS_LEN:
+    /* returns the length of the concatenated element set element list. */
+    ex_get_concat_set_len(exoid, ret_int,"element",EX_ELEM_SET,DIM_NUM_ELS,VAR_ELS_STAT,"num_ele_els",0);
+    break;
+
+  case EX_INQ_ELS_DF_LEN:
+    /* returns the length of the concatenated element set distribution factor list. */
+    ex_get_concat_set_len(exoid, ret_int,"element",EX_ELEM_SET,DIM_NUM_ELS,VAR_ELS_STAT,"num_df_els",1);
+    break;
+
+  case EX_INQ_ELS_PROP:
+    /* returns the number of integer properties stored for each element set. */
+    *ret_int = ex_get_num_props( exoid, EX_ELEM_SET );
+    break;
+
+  case EX_INQ_EDGE_MAP:
+    /* returns the number of edge maps. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_EDM, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_FACE_MAP:
+    /*     returns the number of face maps. */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_FAM, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_COORD_FRAMES:
+    /* return the number of coordinate frames */
+    if (ex_get_dimension_value(exoid, ret_int, 0, DIM_NUM_CFRAMES, 1) != EX_NOERR) return EX_FATAL;
+    break;
+
+  case EX_INQ_NUM_CHILD_GROUPS:
+    /* return number of groups contained in this (exoid) group */
+#if !defined(NOT_NETCDF4)
+    nc_inq_grps(exoid, &tmp_num, NULL);
+    *ret_int = tmp_num;
+#endif
+    break;
+    
+  case EX_INQ_GROUP_PARENT:
+    /* return id of parent of this (exoid) group; returns exoid if at root */
+#if !defined(NOT_NETCDF4)
+    tmp_num = exoid;
+    nc_inq_grp_parent(exoid, &tmp_num);
+    *ret_int = tmp_num;
+#endif
+    break;
+    
+  case EX_INQ_GROUP_ROOT:
+    /* return id of root group "/" of this (exoid) group; returns exoid if at root */
+    *ret_int = (unsigned)exoid & EX_FILE_ID_MASK;
+    break;
+    
+  case EX_INQ_GROUP_NAME_LEN:
+    {
+#if !defined(NOT_NETCDF4)
+      size_t len_name = 0;
+      /* return name length of group exoid */
+      nc_inq_grpname_len(exoid, &len_name);
+      *ret_int = (int)len_name;
+#endif
+    }
+    break;
+    
+  case EX_INQ_GROUP_NAME:
+    /* return name of group exoid. "/" returned for root group */
+    /* Assumes that ret_char is large enough to hold name. */
+    if (!ret_char) {
+      sprintf(errmsg,
+	      "Error: Requested group name, but character pointer was null for file id %d", exoid);
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+#if !defined(NOT_NETCDF4)
+    nc_inq_grpname(exoid, ret_char);
+#endif    
+    break;
+    
+  case EX_INQ_FULL_GROUP_NAME_LEN:
+    {
+#if !defined(NOT_NETCDF4)
+      size_t len_name = 0;
+      /* return length of full group name which is the "/" separated path from root
+       * For example "/group1/subgroup1/subsubgroup1"
+       * length does not include the NULL terminator byte.
+       */
+      nc_inq_grpname_full(exoid, &len_name, NULL);
+      *ret_int = (int)len_name;
+#endif
+    }
+    break;
+    
+  case EX_INQ_FULL_GROUP_NAME:
+    /* return full path name of group exoid which is the "/" separated path from root
+     * For example "/group1/subgroup1/subsubgroup1"
+     * Assumes that ret_char is large enough to hold full path name.
+     */
+    if (!ret_char) {
+      sprintf(errmsg,
+	      "Error: Requested group name, but character pointer was null for file id %d", exoid);
+      ex_err("ex_inquire",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+#if !defined(NOT_NETCDF4)
+    nc_inq_grpname_full(exoid, NULL, ret_char);
+#endif    
+    break;
+    
+  default:
+    *ret_int = 0;
+    exerrval = EX_FATAL;
+    sprintf(errmsg, "Error: invalid inquiry %d", req_info);
+    ex_err("ex_inquire",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+  return (EX_NOERR);
+}
+
+/*!
+  A variant of ex_inquire() which queries integer-valued information only. \see ex_inquire().
+  \param[in] exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+  \param[in] req_info  A flag which designates what information is requested.
+		       (See ex_inquire() documentation)
+  \return    result of inquiry.
+
+ As an example, the following will return the number of nodes,
+ elements, and element blocks stored in the exodus file :
+
+\code
+#include "exodusII.h"
+int exoid;
+int num_nodes = ex_inquire_int(exoid, EX_INQ_NODES);
+int num_elems = ex_inquire_int(exoid, EX_INQ_ELEM);
+int num_block = ex_inquire_int(exoid, EX_INQ_ELEM_BLK);
+\endcode
+
+*/
+int64_t ex_inquire_int (int exoid, int req_info)
+{
+  char *cdummy = NULL; /* Needed just for function call, unused. */
+  float fdummy = 0;    /* Needed just for function call, unused. */
+  int64_t ret_val = 0;
+  int error = ex_inquire_internal(exoid, req_info, &ret_val, &fdummy, cdummy);
+  if (error < 0)
+    ret_val = error;
+
+  return ret_val;
+}
+
+int ex_inquire (int       exoid,
+		int       req_info,
+		void_int *ret_int,
+		float    *ret_float,
+		char     *ret_char)
+{
+  if (ex_int64_status(exoid) & EX_INQ_INT64_API) {
+    return ex_inquire_internal(exoid, req_info, ret_int, ret_float, ret_char);
+  } else {
+    /* ret_int is a 32-bit int */
+    int64_t tmp_int;
+    int *return_int = ret_int;
+    int ierr = ex_inquire_internal(exoid, req_info, &tmp_int, ret_float, ret_char);
+    *return_int = (int)tmp_int;
+    return ierr;
+  }
+}
+
diff --git a/exodus/cbind/src/ex_ne_util.c b/exodus/cbind/src/ex_ne_util.c
new file mode 100644
index 0000000..f16d2d8
--- /dev/null
+++ b/exodus/cbind/src/ex_ne_util.c
@@ -0,0 +1,407 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *     ex_leavedef()
+ *     ex_catstrn12()
+ *     ne_id_lkup()
+ *     ex_get_file_type()
+ *     ex_put_nemesis_version()
+ *     ne_check_file_version()
+ *     ex_get_idx()
+ *
+ *****************************************************************************
+ * Much of this code is a modified version of what is found in NemesisI.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, EX_NOERR, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <stdlib.h>                     // for malloc
+#include <string.h>                     // for strcpy, strlen
+#include <sys/types.h>                  // for int64_t
+
+
+
+/* Global variables */
+char *ne_ret_string;
+
+int ex_leavedef(int exoid,
+                const char *call_rout
+                )
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+  
+  if ((status = nc_enddef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to end define mode for file id %d",
+            exoid);
+    ex_err(call_rout, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+char *ex_catstrn12(char *name,
+                 int   num1,
+                 int   num2
+                 )
+{
+  const char *func_name="ex_catstrn12";
+
+  char  errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;  /* clear error code */
+
+  if (ne_ret_string == NULL) {
+    ne_ret_string = (char *)malloc((NC_MAX_NAME+1)*sizeof(char));
+    if (ne_ret_string == NULL) {
+      exerrval = EX_MSG;
+      sprintf(errmsg, "Error: Insufficient memory!\n");
+      ex_err(func_name, errmsg, exerrval);
+      return NULL;
+    }
+  }
+
+  if (strlen(name) > NC_MAX_NAME) {
+    exerrval = EX_MSG;
+    sprintf(errmsg, "Error: name too long!");
+    ex_err(func_name, errmsg, exerrval);
+
+    return (NULL);
+  }
+
+  sprintf(ne_ret_string, "%s%d-%d", name, num1, num2);
+
+  return ne_ret_string;
+}
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Note: This function assumes a 1-d vector of data for "ne_var_name".
+ */
+/*****************************************************************************/
+int ne_id_lkup(int exoid, const char *ne_var_name, int64_t *idx, ex_entity_id ne_var_id)
+{
+  const char    *func_name="ne_id_lkup";
+
+  int      status;
+  int      varid, ndims, dimid[1], ret=-1;
+  nc_type  var_type;
+  size_t   length, start[1];
+  int64_t  my_index, begin, end;
+  long long id_val;
+
+  char   errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if ((status = nc_inq_varid(exoid, ne_var_name, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            ne_var_name, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* check if I need the length for this variable */
+  if (idx[1] == -1) {
+    /* Get the dimension IDs for this variable */
+    if ((status = nc_inq_var(exoid, varid, (char *) 0, &var_type, &ndims,
+			     dimid, (int *) 0)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+          "Error: failed to find dimension ID for variable \"%s\" in file ID %d",
+              ne_var_name, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return -1;
+    }
+
+    /* Get the length of this variable */
+    if ((status = nc_inq_dimlen(exoid, dimid[0], &length)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+          "Error: failed to find dimension for variable \"%s\" in file ID %d",
+              ne_var_name, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return -1;
+    }
+
+    idx[1] = length;
+  } /* End "if (idx[1] == -1)" */
+
+  begin = idx[0];
+  end = idx[1];
+
+  /* Find the index by looping over each entry */
+  for(my_index=begin; my_index < end; my_index++) {
+    start[0] = my_index;
+    status = nc_get_var1_longlong(exoid, varid, start, &id_val);
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable \"%s\" in file ID %d",
+              ne_var_name, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return -1;
+    }
+
+    if (id_val == ne_var_id) {
+      ret = (int) my_index;
+      break;
+    }
+  }
+
+  return ret;
+}
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* This function retrieves the file type from a Nemesis file.
+ */
+/*****************************************************************************/
+int ex_get_file_type(int exoid,
+                     char *ftype
+                     )
+{
+  const char   *func_name="ex_get_file_type";
+
+  int  status;
+  int     varid;
+  int  lftype;
+
+  char    errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if ((status = nc_inq_varid(exoid, VAR_FILE_TYPE, &varid)) != NC_NOERR) {
+
+    /* If no file type is found, assume parallel */
+    ftype[0] = 'p';
+    ftype[1] = '\0';
+
+    return (EX_NOERR);
+  }
+
+  if ((status = nc_get_var1_int(exoid, varid, NULL, &lftype)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_FILE_TYPE, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Set the appropriate character */
+  if (lftype == 0)       strcpy(ftype, "p");
+  else if (lftype == 1)  strcpy(ftype, "s");
+
+  return (EX_NOERR);
+}
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* This function outputs the Nemesis version information to the file.
+ */
+/*****************************************************************************/
+int ex_put_nemesis_version(int exoid)
+{
+  const char  *func_name="ex_put_nemesis_version";
+  int    status;
+  float  file_ver, api_ver;
+
+  char   errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear the error code */
+
+  file_ver = NEMESIS_FILE_VERSION;
+  api_ver  = NEMESIS_API_VERSION;
+
+  /* Check to see if the nemesis file version is already in the file */
+  if (nc_get_att_float(exoid, NC_GLOBAL, "nemesis_file_version", &file_ver) != NC_NOERR) {
+
+    /* Output the Nemesis file version */
+    if ((status = nc_put_att_float(exoid, NC_GLOBAL, "nemesis_file_version", NC_FLOAT,
+				   1, &file_ver)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output nemesis file version in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Output the Nemesis API version */
+    if ((status = nc_put_att_float(exoid, NC_GLOBAL, "nemesis_api_version", NC_FLOAT,
+				   1, &api_ver)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output nemesis api version in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  return (EX_NOERR);
+}
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* This function checks that the version info is correct.
+ */
+/*****************************************************************************/
+int ne_check_file_version(int exoid)
+{
+#if 0
+  const char  *func_name="ne_check_file_version";
+
+  float  file_ver;
+
+  int    status;
+  char   errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0;  /* clear error code */
+
+  /* Get the file version */
+  if ((status = nc_get_att_float(exoid, NC_GLOBAL, "nemesis_file_version", &file_ver)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get the nemesis file version from file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (fabs(NEMESIS_FILE_VERSION-file_ver) > 0.001) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: Nemesis version mismatch in file ID %d!\n", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+#endif
+  return (EX_NOERR);
+}
+
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* This function gets the index for the given variable at the
+ * position given.
+ */
+/*****************************************************************************/
+int ex_get_idx(int exoid, const char *ne_var_name, int64_t *my_index, int pos)
+{
+  const char  *func_name="ex_get_idx";
+
+  int      status;
+  int      varid;
+  size_t   start[1], count[1];
+#if defined(NC_NETCDF4)
+  long long varidx[2];
+#else
+  int varidx[2];
+#endif
+  char   errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* set default values for idx */
+  my_index[0] = 0;
+  my_index[1] = -1;
+
+  /*
+   * assume that if there is an error returned, that this
+   * means that this is a parallel file, and the index does
+   * not exists. This is not an error
+   */
+  if ((status = nc_inq_varid(exoid, ne_var_name, &varid)) == NC_NOERR) {
+    /* check if we are at the beginning of the index vector */
+    if (pos == 0) {
+      start[0] = pos;
+      count[0] = 1;
+    } else {
+      start[0] = pos - 1;
+      count[0] = 2;
+    }
+
+#if defined(NC_NETCDF4)
+    status = nc_get_vara_longlong(exoid, varid, start, count, varidx);
+#else
+    status = nc_get_vara_int(exoid, varid, start, count, varidx);
+#endif
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable \"%s\" in file ID %d",
+              ne_var_name, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return -1;
+    }
+
+    if (pos == 0) {
+      my_index[0] = 0;
+      my_index[1] = varidx[0];
+    } else {
+      my_index[0] = varidx[0];
+      my_index[1] = varidx[1];
+    }
+  }
+
+  return 1;
+}
diff --git a/exodus/cbind/src/ex_open.c b/exodus/cbind/src/ex_open.c
new file mode 100644
index 0000000..a542c39
--- /dev/null
+++ b/exodus/cbind/src/ex_open.c
@@ -0,0 +1,329 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exopen - ex_open
+*
+* entry conditions - 
+*   input parameters:
+*       char*   path                    exodus filename path
+*       int     mode                    access mode w/r
+*
+* exit conditions - 
+*       int     exoid                   exodus file id
+*       int*    comp_ws                 computer word size
+*       int*    io_ws                   storage word size
+*       float*  version                 EXODUSII interface version number
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, NC_GLOBAL, etc
+
+/*!  
+
+The function ex_open() opens an existing exodus file and returns
+an ID that can subsequently be used to refer to the file, the word
+size of the floating point values stored in the file, and the version
+of the exodus database (returned as a ``float'', regardless of the
+compute or I/O word size). Multiple files may be ``open'' simultaneously.
+
+\return In case of an error, ex_open() returns a negative
+number. Possible causes of errors include:
+  -  The specified file does not exist.
+  -  The mode specified is something other than the predefined constant \fparam{EX_READ} or \fparam{EX_WRITE}.
+  -  Database version is earlier than 2.0.
+
+\param path The file name of the exodus file. This can be given as either an
+            absolute path name (from the root of the file system) or a relative
+            path name (from the current directory).
+
+\param mode Access mode. Use one of the following predefined constants:
+        -  \fparam{EX_READ} To open the file just for reading.
+        -  \fparam{EX_WRITE} To open the file for writing and reading.
+
+\param[in,out] comp_ws The word size in bytes (0, 4 or 8) of the floating point variables
+               used in the application program. If 0 (zero) is passed, the default
+               size of floating point values for the machine will be used and
+               returned in this variable. WARNING: all exodus functions requiring
+               reals must be passed reals declared with this passed in or returned
+               compute word size (4 or 8).
+
+
+\param[in,out] io_ws The word size in bytes (0, 4 or 8) of the floating 
+                    point data as they are stored in the exodus file. If the word 
+                    size does not match the word size of data stored in the file, 
+                    a fatal error is returned. If this argument is 0, the word size 
+                    of the floating point data already stored in the file is returned.
+
+\param[out] version  Returned exodus database version number.
+
+The following opens an exodus file named \file{test.exo} for read
+only, using default settings for compute and I/O word sizes:
+
+\code
+int CPU_word_size,IO_word_size, exoid;
+float version;
+
+CPU_word_size = sizeof(float);   \co{float or double}
+IO_word_size = 0;                \co{use what is stored in file}
+
+\comment{open exodus files}
+exoid = ex_open ("test.exo",     \co{filename path}
+                 EX_READ,        \co{access mode = READ}
+		 &CPU_word_size, \co{CPU word size}
+		 &IO_word_size,  \co{IO word size}
+	         &version);      \co{ExodusII library version}
+\endcode
+ */
+
+static int warning_output = 0;
+
+int ex_open_int (const char  *path,
+		 int    mode,
+		 int   *comp_ws,
+		 int   *io_ws,
+		 float *version,
+		 int    run_version)
+{
+  int exoid;
+  int status, stat_att, stat_dim;
+  nc_type att_type = NC_NAT;
+  size_t att_len = 0;
+  int old_fill;
+  int file_wordsize;
+  int dim_str_name;
+  int int64_status = 0;
+  
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+ 
+  /* set error handling mode to no messages, non-fatal errors */
+  ex_opts(exoptval);    /* call required to set ncopts first time through */
+
+  if (run_version != EX_API_VERS_NODOT && warning_output == 0) {
+    int run_version_major = run_version / 100;
+    int run_version_minor = run_version % 100;
+    int lib_version_major = EX_API_VERS_NODOT / 100;
+    int lib_version_minor = EX_API_VERS_NODOT % 100;
+    fprintf(stderr, "EXODUS: Warning: This code was compiled with exodus version %d.%02d,\n          but was linked with exodus library version %d.%02d\n          This is probably an error in the build process of this code.\n",
+	    run_version_major, run_version_minor, lib_version_major, lib_version_minor);
+    warning_output = 1;
+  }
+  
+
+  if ((mode & EX_READ) && (mode & EX_WRITE)) {
+    exerrval = EX_BADFILEMODE;
+    sprintf(errmsg,"Error: Cannot specify both EX_READ and EX_WRITE");
+    ex_err("ex_open",errmsg,exerrval); 
+    return (EX_FATAL);
+  }
+
+  /* The EX_READ mode is the default if EX_WRITE is not specified... */
+  if (!(mode & EX_WRITE)) { /* READ ONLY */
+#if defined(__LIBCATAMOUNT__)
+    if ((status = nc_open (path, NC_NOWRITE, &exoid)) != NC_NOERR)
+#else
+      if ((status = nc_open (path, NC_NOWRITE|NC_SHARE, &exoid)) != NC_NOERR)
+#endif
+	{
+	  /* NOTE: netCDF returns an id of -1 on an error - but no error code! */
+	  if (status == 0) {
+	    exerrval = EX_FATAL;
+	  }
+	  else {
+	    /* It is possible that the user is trying to open a netcdf4
+	       file, but the netcdf4 capabilities aren't available in the
+	       netcdf linked to this library. Note that we can't just use a
+	       compile-time define since we could be using a shareable
+	       netcdf library, so the netcdf4 capabilities aren't known
+	       until runtime...
+	  
+	       Netcdf-4.X does not (yet?) have a function that can be
+	       queried to determine whether the library being used was
+	       compiled with --enable-netcdf4, so that isn't very
+	       helpful.. 
+
+	       At this time, query the beginning of the file and see if it
+	       is an HDF-5 file and if it is assume that the open failure
+	       is due to the netcdf library not enabling netcdf4 features...
+	    */
+	    int type = 0;
+	    ex_check_file_type(path, &type);
+	  
+	    if (type == 5) {
+	      /* This is an hdf5 (netcdf4) file. Since the nc_open failed,
+		 the assumption is that the netcdf doesn't have netcdf4
+		 capabilities enabled.  Tell the user...
+	      */
+	      fprintf(stderr,
+		      "EXODUS: Error: Attempting to open the netcdf-4 file:\n\t'%s'\n\twith a netcdf library that does not support netcdf-4\n",
+		      path);
+	    }
+	    exerrval = status;
+	  }
+	  sprintf(errmsg,"Error: failed to open %s read only",path);
+	  ex_err("ex_open",errmsg,exerrval); 
+	  return(EX_FATAL);
+	} 
+  }
+  else /* (mode & EX_WRITE) READ/WRITE */
+    {
+#if defined(__LIBCATAMOUNT__)
+      if ((status = nc_open (path, NC_WRITE, &exoid)) != NC_NOERR)
+#else
+	if ((status = nc_open (path, NC_WRITE|NC_SHARE, &exoid)) != NC_NOERR)
+#endif
+	  {
+	    /* NOTE: netCDF returns an id of -1 on an error - but no error code! */
+	    if (status == 0)
+	      exerrval = EX_FATAL;
+	    else
+	      exerrval = status;
+	    sprintf(errmsg,"Error: failed to open %s write only",path);
+	    ex_err("ex_open",errmsg,exerrval); 
+	    return(EX_FATAL);
+	  } 
+
+      /* turn off automatic filling of netCDF variables */
+      if ((status = nc_set_fill (exoid, NC_NOFILL, &old_fill)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to set nofill mode in file id %d",
+		exoid);
+	ex_err("ex_open", errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      stat_att = nc_inq_att(exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, &att_type, &att_len);
+      stat_dim = nc_inq_dimid(exoid, DIM_STR_NAME, &dim_str_name);
+      if(stat_att != NC_NOERR || stat_dim != NC_NOERR) {
+	if ((status=nc_redef (exoid)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+	  ex_err("ex_open",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+
+	if (stat_att != NC_NOERR) {
+	  int max_so_far = 32;
+	  nc_put_att_int(exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, NC_INT, 1, &max_so_far);
+	}
+
+	/* If the DIM_STR_NAME variable does not exist on the database, we need to add it now. */
+	if(stat_dim != NC_NOERR) {
+	  /* Not found; set to default value of 32+1. */
+	  int max_name = ex_default_max_name_length < 32 ? 32 : ex_default_max_name_length;
+	  if ((status = nc_def_dim(exoid, DIM_STR_NAME, max_name+1, &dim_str_name)) != NC_NOERR) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to define string name dimension in file id %d",
+		    exoid);
+	    ex_err("ex_open",errmsg,exerrval);
+	    return (EX_FATAL);
+	  }
+	}
+	if ((exerrval=nc_enddef (exoid)) != NC_NOERR) {
+	  sprintf(errmsg,
+		  "Error: failed to complete definition in file id %d", 
+		  exoid);
+	  ex_err("ex_open",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+      }
+    }
+
+  /* determine version of EXODUS II file, and the word size of
+   * floating point and integer values stored in the file
+   */
+
+  if ((status = nc_get_att_float(exoid, NC_GLOBAL, ATT_VERSION, version)) != NC_NOERR) {
+    exerrval  = status;
+    sprintf(errmsg,"Error: failed to get database version for file id: %d",
+	    exoid);
+    ex_err("ex_open",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  /* check ExodusII file version - old version 1.x files are not supported */
+  if (*version < 2.0) {
+    exerrval  = EX_FATAL;
+    sprintf(errmsg,"Error: Unsupported file version %.2f in file id: %d",
+	    *version, exoid);
+    ex_err("ex_open",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  if (nc_get_att_int (exoid, NC_GLOBAL, ATT_FLT_WORDSIZE, &file_wordsize) != NC_NOERR)
+    {  /* try old (prior to db version 2.02) attribute name */
+      if (nc_get_att_int (exoid,NC_GLOBAL,ATT_FLT_WORDSIZE_BLANK,&file_wordsize) != NC_NOERR)
+	{
+	  exerrval  = EX_FATAL;
+	  sprintf(errmsg,"Error: failed to get file wordsize from file id: %d",
+		  exoid);
+	  ex_err("ex_open",errmsg,exerrval);
+	  return(exerrval);
+	}
+    }
+
+  /* See if int64 status attribute exists and if so, what data is stored as int64 
+   * Older files don't have the attribute, so it is not an error if it is missing
+   */
+  if (nc_get_att_int (exoid, NC_GLOBAL, ATT_INT64_STATUS, &int64_status) != NC_NOERR) {
+    int64_status = 0; /* Just in case it gets munged by a failed get_att_int call */
+  }
+  
+  /* Merge in API int64 status flags as specified by caller of function... */
+  int64_status |= (mode & EX_ALL_INT64_API);
+  
+  /* initialize floating point and integer size conversion. */
+  if (ex_conv_ini(exoid, comp_ws, io_ws, file_wordsize, int64_status, 0) != EX_NOERR ) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: failed to initialize conversion routines in file id %d",
+            exoid);
+    ex_err("ex_open", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  return (exoid);
+}
diff --git a/exodus/cbind/src/ex_open_par.c b/exodus/cbind/src/ex_open_par.c
new file mode 100644
index 0000000..044f49d
--- /dev/null
+++ b/exodus/cbind/src/ex_open_par.c
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exopen - ex_open
+*
+* entry conditions - 
+*   input parameters:
+*       char*   path                    exodus filename path
+*       int     mode                    access mode w/r
+*
+* exit conditions - 
+*       int     exoid                   exodus file id
+*       int*    comp_ws                 computer word size
+*       int*    io_ws                   storage word size
+*       float*  version                 EXODUSII interface version number
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <mpi.h>                        // for MPI_Comm, MPI_Info, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, NC_GLOBAL, etc
+#include "netcdf_par.h"                 // for nc_open_par
+
+
+/*!  
+
+The function ex_open() opens an existing exodus file and returns
+an ID that can subsequently be used to refer to the file, the word
+size of the floating point values stored in the file, and the version
+of the exodus database (returned as a ``float'', regardless of the
+compute or I/O word size). Multiple files may be ``open'' simultaneously.
+
+\return In case of an error, ex_open() returns a negative
+number. Possible causes of errors include:
+  -  The specified file does not exist.
+  -  The mode specified is something other than the predefined constant \fparam{EX_READ} or \fparam{EX_WRITE}.
+  -  Database version is earlier than 2.0.
+
+\param path The file name of the exodus file. This can be given as either an
+            absolute path name (from the root of the file system) or a relative
+            path name (from the current directory).
+
+\param mode Access mode. Use one of the following predefined constants:
+        -  \fparam{EX_READ} To open the file just for reading.
+        -  \fparam{EX_WRITE} To open the file for writing and reading.
+
+\param[in,out] comp_ws The word size in bytes (0, 4 or 8) of the floating point variables
+               used in the application program. If 0 (zero) is passed, the default
+               size of floating point values for the machine will be used and
+               returned in this variable. WARNING: all exodus functions requiring
+               reals must be passed reals declared with this passed in or returned
+               compute word size (4 or 8).
+
+
+\param[in,out] io_ws The word size in bytes (0, 4 or 8) of the floating 
+                    point data as they are stored in the exodus file. If the word 
+                    size does not match the word size of data stored in the file, 
+                    a fatal error is returned. If this argument is 0, the word size 
+                    of the floating point data already stored in the file is returned.
+
+\param[out] version  Returned exodus database version number.
+
+The following opens an exodus file named \file{test.exo} for read
+only, using default settings for compute and I/O word sizes:
+
+\code
+int CPU_word_size,IO_word_size, exoid;
+float version;
+
+CPU_word_size = sizeof(float);   \co{float or double}
+IO_word_size = 0;                \co{use what is stored in file}
+
+\comment{open exodus files}
+exoid = ex_open ("test.exo",     \co{filename path}
+                 EX_READ,        \co{access mode = READ}
+		 &CPU_word_size, \co{CPU word size}
+		 &IO_word_size,  \co{IO word size}
+	         &version);      \co{ExodusII library version}
+\endcode
+ */
+
+static int warning_output = 0;
+
+int ex_open_par_int (const char  *path,
+		     int    mode,
+		     int   *comp_ws,
+		     int   *io_ws,
+		     float *version,
+		     MPI_Comm comm,
+		     MPI_Info info,
+		     int    run_version)
+{
+  int exoid;
+  int status, stat_att, stat_dim;
+  nc_type att_type = NC_NAT;
+  size_t att_len = 0;
+  int old_fill;
+  int file_wordsize;
+  int dim_str_name;
+  int int64_status = 0;
+  int pariomode = NC_MPIPOSIX;
+  
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+ 
+  /* set error handling mode to no messages, non-fatal errors */
+  ex_opts(exoptval);    /* call required to set ncopts first time through */
+
+  if (run_version != EX_API_VERS_NODOT && warning_output == 0) {
+    int run_version_major = run_version / 100;
+    int run_version_minor = run_version % 100;
+    int lib_version_major = EX_API_VERS_NODOT / 100;
+    int lib_version_minor = EX_API_VERS_NODOT % 100;
+    fprintf(stderr, "EXODUS: Warning: This code was compiled with exodus version %d.%02d,\n          but was linked with exodus library version %d.%02d\n          This is probably an error in the build process of this code.\n",
+	    run_version_major, run_version_minor, lib_version_major, lib_version_minor);
+    warning_output = 1;
+  }
+  
+
+  if ((mode & EX_READ) && (mode & EX_WRITE)) {
+    exerrval = EX_BADFILEMODE;
+    sprintf(errmsg,"Error: Cannot specify both EX_READ and EX_WRITE");
+    ex_err("ex_open",errmsg,exerrval); 
+    return (EX_FATAL);
+  }
+
+  /* Check parallel io mode.  Valid is NC_MPIPOSIX or NC_MPIIO or NC_PNETCDF
+   * Exodus uses different flag values; map to netcdf values
+   */
+  if (mode & EX_MPIPOSIX)
+    pariomode = NC_MPIPOSIX;
+  else if (mode & EX_MPIIO)
+    pariomode = NC_MPIIO;
+  else if (mode & EX_PNETCDF)
+    pariomode = NC_PNETCDF;
+  
+  
+  /* The EX_READ mode is the default if EX_WRITE is not specified... */
+  if (!(mode & EX_WRITE)) { /* READ ONLY */
+    if ((status = nc_open_par (path, NC_NOWRITE|NC_SHARE|pariomode, comm, info, &exoid)) != NC_NOERR) {
+      /* It is possible that the user is trying to open a netcdf4
+	 file, but the netcdf4 capabilities aren't available in the
+	 netcdf linked to this library. Note that we can't just use a
+	 compile-time define since we could be using a shareable
+	 netcdf library, so the netcdf4 capabilities aren't known
+	 until runtime...
+	  
+	 Netcdf-4.X does not (yet?) have a function that can be
+	 queried to determine whether the library being used was
+	 compiled with --enable-netcdf4, so that isn't very
+	 helpful.. 
+
+	 At this time, query the beginning of the file and see if it
+	 is an HDF-5 file and if it is assume that the open failure
+	 is due to the netcdf library not enabling netcdf4 features...
+      */
+      int type = 0;
+      ex_check_file_type(path, &type);
+	  
+      if (type == 5) {
+	/* This is an hdf5 (netcdf4) file. Since the nc_open failed,
+	   the assumption is that the netcdf doesn't have netcdf4
+	   capabilities enabled.  Tell the user...
+	*/
+	fprintf(stderr,
+		"EXODUS: Error: Attempting to open the netcdf-4 file:\n\t'%s'\n\twith a netcdf library that (potentially) does not support netcdf-4\n",
+		path);
+      }
+      exerrval = status;
+      
+      sprintf(errmsg,"Error: failed to open %s read only",path);
+      ex_err("ex_open",errmsg,exerrval); 
+      return(EX_FATAL);
+    } 
+  }
+  else /* (mode & EX_WRITE) READ/WRITE */
+    {
+      if ((status = nc_open_par (path, NC_WRITE|NC_SHARE|pariomode, comm, info, &exoid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,"Error: failed to open %s write only",path);
+	ex_err("ex_open",errmsg,exerrval); 
+	return(EX_FATAL);
+      } 
+
+      /* turn off automatic filling of netCDF variables */
+      if ((status = nc_set_fill (exoid, NC_NOFILL, &old_fill)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to set nofill mode in file id %d",
+		exoid);
+	ex_err("ex_open", errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+      stat_att = nc_inq_att(exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, &att_type, &att_len);
+      stat_dim = nc_inq_dimid(exoid, DIM_STR_NAME, &dim_str_name);
+      if(stat_att != NC_NOERR || stat_dim != NC_NOERR) {
+	nc_redef(exoid);
+	if (stat_att != NC_NOERR) {
+	  int max_so_far = 32;
+	  nc_put_att_int(exoid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, NC_INT, 1, &max_so_far);
+	}
+
+	/* If the DIM_STR_NAME variable does not exist on the database, we need to add it now. */
+	if(stat_dim != NC_NOERR) {
+	  /* Not found; set to default value of 32+1. */
+	  int max_name = ex_default_max_name_length < 32 ? 32 : ex_default_max_name_length;
+	  nc_def_dim(exoid, DIM_STR_NAME, max_name+1, &dim_str_name);
+	}
+	nc_enddef (exoid);
+      }
+    }
+
+  /* determine version of EXODUS II file, and the word size of
+   * floating point and integer values stored in the file
+   */
+
+  if ((status = nc_get_att_float(exoid, NC_GLOBAL, ATT_VERSION, version)) != NC_NOERR) {
+    exerrval  = status;
+    sprintf(errmsg,"Error: failed to get database version for file id: %d",
+	    exoid);
+    ex_err("ex_open",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  /* check ExodusII file version - old version 1.x files are not supported */
+  if (*version < 2.0) {
+    exerrval  = EX_FATAL;
+    sprintf(errmsg,"Error: Unsupported file version %.2f in file id: %d",
+	    *version, exoid);
+    ex_err("ex_open",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  if (nc_get_att_int (exoid, NC_GLOBAL, ATT_FLT_WORDSIZE, &file_wordsize) != NC_NOERR)
+    {  /* try old (prior to db version 2.02) attribute name */
+      if (nc_get_att_int (exoid,NC_GLOBAL,ATT_FLT_WORDSIZE_BLANK,&file_wordsize) != NC_NOERR)
+	{
+	  exerrval  = EX_FATAL;
+	  sprintf(errmsg,"Error: failed to get file wordsize from file id: %d",
+		  exoid);
+	  ex_err("ex_open",errmsg,exerrval);
+	  return(exerrval);
+	}
+    }
+
+  /* See if int64 status attribute exists and if so, what data is stored as int64 
+   * Older files don't have the attribute, so it is not an error if it is missing
+   */
+  if (nc_get_att_int (exoid, NC_GLOBAL, ATT_INT64_STATUS, &int64_status) != NC_NOERR) {
+    int64_status = 0; /* Just in case it gets munged by a failed get_att_int call */
+  }
+  
+  /* Merge in API int64 status flags as specified by caller of function... */
+  int64_status |= (mode & EX_ALL_INT64_API);
+  
+  /* initialize floating point and integer size conversion. */
+  if (ex_conv_ini(exoid, comp_ws, io_ws, file_wordsize, int64_status, 1) != EX_NOERR ) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: failed to initialize conversion routines in file id %d",
+            exoid);
+    ex_err("ex_open", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  return (exoid);
+}
diff --git a/exodus/cbind/src/ex_opts.c b/exodus/cbind/src/ex_opts.c
new file mode 100644
index 0000000..e899d39
--- /dev/null
+++ b/exodus/cbind/src/ex_opts.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+#include "exodusII_int.h"
+
+/*! \cond INTERNAL */
+int ex_default_max_name_length = 32; /* For default compatibility with older clients */
+
+#if defined(VERBOSE)
+int exoptval = EX_VERBOSE;   /* loud mode: set EX_VERBOSE */
+#else
+#if defined (DEBUG)
+int exoptval = EX_VERBOSE | EX_DEBUG;/* debug mode: set EX_VERBOSE & EX_DEBUG */
+#else
+int exoptval = EX_DEFAULT;  /* set default global options value to NOT print error msgs*/
+#endif
+#endif
+/*! \endcond */
+
+/*!
+The function ex_opts() is used to set message reporting options.
+
+\return Returns previous value for the message reporting option.
+
+\param[in] options   Integer option value. Current options are shown in the table below.
+
+<table>
+<tr><td> \c EX_ABORT  </td><td> Causes fatal errors to force program 
+                                exit. (Default is false.) </td></tr>
+<tr><td> \c EX_DEBUG  </td><td> Causes certain messages to print 
+                                for debug use. (Default is false.)</td></tr>
+<tr><td> \c EX_VERBOSE</td><td> Causes all error messages to print when true, 
+                                otherwise no error messages will print. (Default is false.)</td></tr>
+</table>
+
+\note Values may be OR'ed together to provide any combination 
+      of these capabilities.
+
+For example, the following will cause all messages to print 
+and will cause the program to exit upon receipt of fatal error:
+
+\code
+#include "exodusII.h"
+ex_opts(EX_ABORT|EX_VERBOSE);
+\endcode
+
+*/
+int ex_opts (int options)      
+{
+  int oldval = exoptval;
+  exerrval = 0; /* clear error code */
+  exoptval = options;
+  return oldval;
+}
diff --git a/exodus/cbind/src/ex_put_all_var_param.c b/exodus/cbind/src/ex_put_all_var_param.c
new file mode 100644
index 0000000..21b8c91
--- /dev/null
+++ b/exodus/cbind/src/ex_put_all_var_param.c
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvp - ex_put_all_var_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid           exodus file id
+*       int     num_g           global variable count
+*       int     num_n           nodal variable count
+*       int     num_e           element variable count
+*       int*    elem_var_tab    element variable truth table array
+*       int     num_m           nodeset variable count
+*       int*    nset_var_tab    nodeset variable truth table array
+*       int     num_s           sideset variable count
+*       int*    sset_var_tab    sideset variable truth table array
+*
+* exit conditions - 
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_var_params, etc
+
+/*!
+ * defines the number of global, nodal, element, nodeset, and sideset variables 
+ * that will be written to the database
+*  \param     exoid           exodus file id
+*  \param     num_g           global variable count
+*  \param     num_n           nodal variable count
+*  \param     num_e           element variable count
+*  \param    *elem_var_tab    element variable truth table array
+*  \param     num_m           nodeset variable count
+*  \param    *nset_var_tab    nodeset variable truth table array
+*  \param     num_s           sideset variable count
+*  \param    *sset_var_tab    sideset variable truth table array
+ */
+
+int ex_put_all_var_param (int   exoid,
+                          int   num_g,
+                          int   num_n,
+                          int   num_e,
+                          int  *elem_var_tab,
+                          int   num_m,
+                          int  *nset_var_tab,
+                          int   num_s,
+                          int  *sset_var_tab)
+{
+  ex_var_params vparam;
+
+  vparam.num_glob = num_g;
+  vparam.num_node = num_n;
+  vparam.num_edge = 0;
+  vparam.edge_var_tab = 0;
+  vparam.num_face = 0;
+  vparam.face_var_tab = 0;
+  vparam.num_elem = num_e;
+  vparam.elem_var_tab = elem_var_tab;
+  vparam.num_nset = num_m;
+  vparam.nset_var_tab = nset_var_tab;
+  vparam.num_eset = 0;
+  vparam.eset_var_tab = 0;
+  vparam.num_fset = 0;
+  vparam.fset_var_tab = 0;
+  vparam.num_sset = num_s;
+  vparam.sset_var_tab = sset_var_tab;
+  vparam.num_elset = 0;
+  vparam.elset_var_tab = 0;
+
+  return ex_put_all_var_param_ext( exoid, &vparam );
+}
diff --git a/exodus/cbind/src/ex_put_all_var_param_ext.c b/exodus/cbind/src/ex_put_all_var_param_ext.c
new file mode 100644
index 0000000..b4a3da0
--- /dev/null
+++ b/exodus/cbind/src/ex_put_all_var_param_ext.c
@@ -0,0 +1,566 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvp - ex_put_all_var_param_ext
+*
+* entry conditions - 
+*   input parameters:
+*       int                  exoid    exodus file id
+*       const ex_var_params* vp       pointer to variable parameter info
+*
+* exit conditions - 
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for malloc, NULL, free
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+static int define_dimension(int exoid, const char *DIMENSION, int count, const char *label, int *dimid);
+static int define_variable_name_variable(int exoid, const char *VARIABLE, int dimension,
+                                         const char *label);
+static int *get_status_array(int exoid, int count, const char *VARIABLE, const char *label);
+static int put_truth_table(int exoid, int varid, int *table, const char *label);
+static int define_truth_table(ex_entity_type obj_type, int exoid, int num_ent, int num_var,
+                              int *var_tab, int *status, void_int *ids, const char *label);
+
+#define EX_GET_IDS_STATUS(TNAME,NUMVAR,DNAME,DID,DVAL,VIDS,EIDS,VSTAT,VSTATVAL) \
+  if (NUMVAR > 0) {							\
+    status = ex_get_dimension(exoid, DNAME, TNAME "s", &DVAL, &DID, routine); \
+    if (status != NC_NOERR)						\
+      goto error_ret;							\
+									\
+    /* get element block IDs */						\
+    if (!(VIDS = malloc(DVAL*sizeof(int64_t)))) {				\
+      exerrval = EX_MEMFAIL;						\
+      sprintf(errmsg,							\
+              "Error: failed to allocate memory for " TNAME " id array for file id %d", \
+              exoid);							\
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);		\
+      goto error_ret;							\
+    }									\
+    ex_get_ids (exoid, EIDS, VIDS);					\
+									\
+    /* Get element block status array for later use (allocates memory) */ \
+    VSTATVAL = get_status_array(exoid, DVAL, VSTAT, TNAME);		\
+    if (VSTATVAL == NULL) {						\
+      goto error_ret;							\
+    }									\
+  }
+
+/*!
+ * writes the number of global, nodal, element, nodeset, and sideset variables 
+ * that will be written to the database
+ * \param      exoid    exodus file id
+ * \param      *vp       pointer to variable parameter info
+ */
+
+int ex_put_all_var_param_ext ( int   exoid,
+                               const ex_var_params* vp )
+{
+  int in_define = 0;
+  int status;
+  int temp;
+  int time_dim, num_nod_dim, dimid;
+  size_t num_elem_blk, num_edge_blk, num_face_blk;
+  size_t num_nset, num_eset, num_fset, num_sset, num_elset;
+  int numelblkdim, numelvardim, numedvardim, numedblkdim,
+    numfavardim, numfablkdim,  numnsetdim,  nsetvardim,
+    numesetdim,  esetvardim,   numfsetdim,  fsetvardim,
+    numssetdim,  ssetvardim,  numelsetdim, elsetvardim;
+  int i;
+
+  int edblk_varid, fablk_varid, eblk_varid, nset_varid,
+    eset_varid, fset_varid, sset_varid, elset_varid, varid;
+  
+  void_int* eblk_ids = 0;
+  void_int* edblk_ids = 0;
+  void_int* fablk_ids = 0;
+  void_int* nset_ids = 0;
+  void_int* eset_ids = 0;
+  void_int* fset_ids = 0;
+  void_int* sset_ids = 0;
+  void_int* elset_ids = 0;
+
+  int* eblk_stat = 0;
+  int* edblk_stat = 0;
+  int* fablk_stat = 0;
+  int* nset_stat = 0;
+  int* eset_stat = 0;
+  int* fset_stat = 0;
+  int* sset_stat = 0;
+  int* elset_stat = 0;
+  
+  int dims[3];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* routine = "ex_put_all_var_param_ext";
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined dimensions  */
+
+  if ((status = nc_inq_dimid(exoid, DIM_TIME, &time_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate time dimension in file id %d", exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    goto error_ret;
+  }
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NODES, &num_nod_dim)) != NC_NOERR) {
+    num_nod_dim = -1; /* There is probably no nodes on this file */
+  }
+
+  /* Check this now so we can use it later without checking for errors */
+  if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &temp)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get string length in file id %d",exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    goto error_ret;
+  }
+
+  EX_GET_IDS_STATUS(   "edge block",vp->num_edge, DIM_NUM_ED_BLK,numedblkdim,num_edge_blk,edblk_ids,EX_EDGE_BLOCK,VAR_STAT_ED_BLK,edblk_stat);
+  EX_GET_IDS_STATUS(   "face block",vp->num_face, DIM_NUM_FA_BLK,numfablkdim,num_face_blk,fablk_ids,EX_FACE_BLOCK,VAR_STAT_FA_BLK,fablk_stat);
+  EX_GET_IDS_STATUS("element block",vp->num_elem, DIM_NUM_EL_BLK,numelblkdim,num_elem_blk, eblk_ids,EX_ELEM_BLOCK,VAR_STAT_EL_BLK, eblk_stat);
+  EX_GET_IDS_STATUS(     "node set",vp->num_nset, DIM_NUM_NS,    numnsetdim, num_nset,     nset_ids,EX_NODE_SET,  VAR_NS_STAT,     nset_stat);
+  EX_GET_IDS_STATUS(     "edge set",vp->num_eset, DIM_NUM_ES,    numesetdim, num_eset,     eset_ids,EX_EDGE_SET,  VAR_ES_STAT,     eset_stat);
+  EX_GET_IDS_STATUS(     "face set",vp->num_fset, DIM_NUM_FS,    numfsetdim, num_fset,     fset_ids,EX_FACE_SET,  VAR_FS_STAT,     fset_stat);
+  EX_GET_IDS_STATUS(     "side set",vp->num_sset, DIM_NUM_SS,    numssetdim, num_sset,     sset_ids,EX_SIDE_SET,  VAR_SS_STAT,     sset_stat);
+  EX_GET_IDS_STATUS(  "element set",vp->num_elset,DIM_NUM_ELS,   numelsetdim,num_elset,   elset_ids,EX_ELEM_SET,  VAR_ELS_STAT,   elset_stat);
+
+  /* put file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to put file id %d into define mode", exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    goto error_ret;
+  }
+  in_define = 1;
+
+  /* define dimensions and variables */
+  if (vp->num_glob > 0) {
+    if (define_dimension(exoid, DIM_NUM_GLO_VAR, vp->num_glob, "global", &dimid) != NC_NOERR)
+      goto error_ret;
+    
+    dims[0] = time_dim;
+    dims[1] = dimid;
+    if ((status = nc_def_var (exoid, VAR_GLO_VAR, nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define global variables in file id %d",
+	      exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+      goto error_ret;          /* exit define mode and return */
+    }
+    ex_compress_variable(exoid, varid, 2);
+
+    /* Now define global variable name variable */
+    if (define_variable_name_variable(exoid, VAR_NAME_GLO_VAR, dimid, "global") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_node > 0) {
+    /*
+     * There are two ways to store the nodal variables. The old way *
+     * was a blob (#times,#vars,#nodes), but that was exceeding the
+     * netcdf maximum dataset size for large models. The new way is
+     * to store #vars separate datasets each of size (#times,#nodes)
+     *
+     * We want this routine to be capable of storing both formats
+     * based on some external flag.  Since the storage format of the
+     * coordinates have also been changed, we key off of their
+     * storage type to decide which method to use for nodal
+     * variables. If the variable 'coord' is defined, then store old
+     * way; otherwise store new.
+     */
+    if (define_dimension(exoid, DIM_NUM_NOD_VAR, vp->num_node, "nodal", &dimid) != NC_NOERR)
+      goto error_ret;
+
+    if (num_nod_dim > 0) {
+      if (ex_large_model(exoid) == 0) { /* Old way */
+	dims[0] = time_dim;
+	dims[1] = dimid;
+	dims[2] = num_nod_dim;
+	if ((status = nc_def_var(exoid, VAR_NOD_VAR,
+				 nc_flt_code(exoid), 3, dims, &varid)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to define nodal variables in file id %d",
+		  exoid);
+	  ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+	  goto error_ret;          /* exit define mode and return */
+	}
+      } else { /* Store new way */
+	for (i = 1; i <= vp->num_node; i++) {
+	  dims[0] = time_dim;
+	  dims[1] = num_nod_dim;
+	  if ((status = nc_def_var(exoid, VAR_NOD_VAR_NEW(i),
+				   nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to define nodal variable %d in file id %d",
+		    i, exoid);
+	    ex_err("ex_put_var_param",errmsg,exerrval);
+	    goto error_ret;          /* exit define mode and return */
+	  }
+	  ex_compress_variable(exoid, varid, 2);
+	}
+      }
+    }
+
+    /* Now define nodal variable name variable */
+    if (define_variable_name_variable(exoid, VAR_NAME_NOD_VAR, dimid, "nodal") != NC_NOERR)
+      goto error_ret;
+  }
+
+#define EX_DEFINE_VARS(TID,STNAME,TNAME,NUMVAR,DNAME,DID1,DID2,DVAL,VIDS,VNOV,VTV,VSTATVAL,VTABVAL,VTABVAR) \
+  if (NUMVAR > 0) {							\
+    status = define_dimension(exoid, DNAME, NUMVAR, STNAME, &DID2);	\
+    if (status != NC_NOERR) goto error_ret;				\
+									\
+    /* Now define STNAME variable name variable */			\
+    if (define_variable_name_variable(exoid, VNOV, DID2, STNAME) != NC_NOERR) \
+      goto error_ret;							\
+									\
+    if (define_truth_table(TID, exoid, DVAL, NUMVAR, VTABVAL, VSTATVAL, VIDS, TNAME) != NC_NOERR) \
+      goto error_ret;							\
+									\
+    VSTATVAL = ex_safe_free (VSTATVAL);					\
+    VIDS  = ex_safe_free (VIDS);					\
+									\
+    /* create a variable array in which to store the STNAME variable truth \
+     * table								\
+     */									\
+									\
+    dims[0] = DID1;							\
+    dims[1] = DID2;							\
+									\
+    if ((status = nc_def_var(exoid, VTV, NC_INT, 2, dims, &VTABVAR)) != NC_NOERR) { \
+      exerrval = status;						\
+      sprintf(errmsg,							\
+              "Error: failed to define " STNAME " variable truth table in file id %d", \
+              exoid);							\
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);		\
+      goto error_ret;          /* exit define mode and return */	\
+    }									\
+  }
+  EX_DEFINE_VARS(EX_EDGE_BLOCK,   "edge",   "edge block",vp->num_edge, DIM_NUM_EDG_VAR,  numedblkdim,numedvardim,num_edge_blk,edblk_ids,VAR_NAME_EDG_VAR,  VAR_EBLK_TAB, edblk_stat,vp->edge_var_tab,edblk_varid);
+  EX_DEFINE_VARS(EX_FACE_BLOCK,   "face",   "face block",vp->num_face, DIM_NUM_FAC_VAR,  numfablkdim,numfavardim,num_face_blk,fablk_ids,VAR_NAME_FAC_VAR,  VAR_FBLK_TAB, fablk_stat,vp->face_var_tab,fablk_varid);
+  EX_DEFINE_VARS(EX_ELEM_BLOCK,"element","element block",vp->num_elem, DIM_NUM_ELE_VAR,  numelblkdim,numelvardim,num_elem_blk, eblk_ids,VAR_NAME_ELE_VAR,  VAR_ELEM_TAB,  eblk_stat,vp->elem_var_tab,eblk_varid);
+  EX_DEFINE_VARS(EX_NODE_SET,  "nodeset",     "node set",vp->num_nset, DIM_NUM_NSET_VAR, numnsetdim, nsetvardim, num_nset,     nset_ids,VAR_NAME_NSET_VAR, VAR_NSET_TAB,  nset_stat,vp->nset_var_tab, nset_varid);
+  EX_DEFINE_VARS(EX_EDGE_SET,  "edgeset",     "edge set",vp->num_eset, DIM_NUM_ESET_VAR, numesetdim, esetvardim, num_eset,     eset_ids,VAR_NAME_ESET_VAR, VAR_ESET_TAB,  eset_stat,vp->eset_var_tab, eset_varid);
+  EX_DEFINE_VARS(EX_FACE_SET,  "faceset",     "face set",vp->num_fset, DIM_NUM_FSET_VAR, numfsetdim, fsetvardim, num_fset,     fset_ids,VAR_NAME_FSET_VAR, VAR_FSET_TAB,  fset_stat,vp->fset_var_tab, fset_varid);
+  EX_DEFINE_VARS(EX_SIDE_SET,  "sideset",     "side set",vp->num_sset, DIM_NUM_SSET_VAR, numssetdim, ssetvardim, num_sset,     sset_ids,VAR_NAME_SSET_VAR, VAR_SSET_TAB,  sset_stat,vp->sset_var_tab, sset_varid);
+  EX_DEFINE_VARS(EX_ELEM_SET,  "elemset",  "element set",vp->num_elset,DIM_NUM_ELSET_VAR,numelsetdim,elsetvardim,num_elset,   elset_ids,VAR_NAME_ELSET_VAR,VAR_ELSET_TAB,elset_stat,vp->elset_var_tab,elset_varid);
+
+  /* leave define mode  */
+
+  in_define = 0;
+  if ((status = nc_enddef (exoid)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to complete definition in file id %d",
+              exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+      goto error_ret;
+    }
+
+  /* write out the variable truth tables */
+  if (vp->num_edge > 0) {
+    if (put_truth_table(exoid, edblk_varid, vp->edge_var_tab, "edge") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_face > 0) {
+    if (put_truth_table(exoid, fablk_varid, vp->face_var_tab, "face") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_elem > 0) {
+    if (put_truth_table(exoid, eblk_varid, vp->elem_var_tab, "element") !=  NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_nset > 0) {
+    if (put_truth_table(exoid, nset_varid, vp->nset_var_tab, "nodeset") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_eset > 0) {
+    if (put_truth_table(exoid, eset_varid, vp->eset_var_tab, "edgeset") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_fset > 0) {
+    if (put_truth_table(exoid, fset_varid, vp->fset_var_tab, "faceset") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_sset > 0) {
+    if (put_truth_table(exoid, sset_varid, vp->sset_var_tab, "sideset") != NC_NOERR)
+      goto error_ret;
+  }
+
+  if (vp->num_elset > 0) {
+    if (put_truth_table(exoid, elset_varid, vp->elset_var_tab, "elemset") != NC_NOERR)
+      goto error_ret;
+  }
+
+  return(EX_NOERR);
+  
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (in_define == 1) {
+    if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+      {
+        sprintf(errmsg,
+                "Error: failed to complete definition for file id %d",
+                exoid);
+        ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+      }
+  }
+  ex_safe_free(eblk_ids);
+  ex_safe_free(edblk_ids);
+  ex_safe_free(fablk_ids);
+  ex_safe_free(nset_ids);
+  ex_safe_free(eset_ids);
+  ex_safe_free(fset_ids);
+  ex_safe_free(sset_ids);
+  ex_safe_free(elset_ids);
+
+  ex_safe_free(eblk_stat);
+  ex_safe_free(edblk_stat);
+  ex_safe_free(fablk_stat);
+  ex_safe_free(nset_stat);
+  ex_safe_free(eset_stat);
+  ex_safe_free(fset_stat);
+  ex_safe_free(sset_stat);
+  ex_safe_free(elset_stat);
+  return(EX_FATAL);
+}
+
+static int define_dimension(int exoid, const char *DIMENSION, int count, const char *label, int *dimid)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+  if ((status = nc_def_dim(exoid, DIMENSION, count, dimid)) != NC_NOERR) {
+    exerrval = status;
+    if (status == NC_ENAMEINUSE) {
+      sprintf(errmsg,
+              "Error: %s variable name parameters are already defined in file id %d",
+              label, exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    } else {
+      sprintf(errmsg,
+              "Error: failed to define number of %s variables in file id %d",
+              label, exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    }
+  }
+  return status;
+}
+
+static int define_variable_name_variable(int exoid, const char *VARIABLE, int dimension, const char *label)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int dims[2];
+  int variable;
+  int status;
+  
+  dims[0] = dimension;
+  (void)nc_inq_dimid(exoid, DIM_STR_NAME, &dims[1]); /* Checked earlier, so known to exist */
+
+  if ((status=nc_def_var(exoid, VARIABLE, NC_CHAR, 2, dims, &variable)) != NC_NOERR) {
+    if (status == NC_ENAMEINUSE) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: %s variable names are already defined in file id %d",
+              label, exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define %s variable names in file id %d",
+              label, exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    }
+  }
+  return status;
+}
+
+static int *get_status_array(int exoid, int var_count, const char *VARIABLE, const char *label)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int varid;
+  int status;
+  int *stat_vals = NULL;
+  
+  if (!(stat_vals = malloc(var_count*sizeof(int)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+            "Error: failed to allocate memory for %s status array for file id %d",
+            label, exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    return (NULL);
+  }
+
+  /* get variable id of status array */
+  if ((nc_inq_varid (exoid, VARIABLE, &varid)) == NC_NOERR) {
+    /* if status array exists (V 2.01+), use it, otherwise assume
+       object exists to be backward compatible */
+     
+    if ((status = nc_get_var_int(exoid, varid, stat_vals)) != NC_NOERR) {
+      exerrval = status;
+      ex_safe_free(stat_vals);
+      sprintf(errmsg,
+              "Error: failed to get %s status array from file id %d",
+              label, exoid);
+      ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+      return (NULL);
+    }
+  } else {
+    /* status array doesn't exist (V2.00), dummy one up for later checking */
+    int i;
+    for(i=0; i<var_count; i++)
+      stat_vals[i] = 1;
+  }
+ return stat_vals;
+}
+
+static int put_truth_table(int exoid, int varid, int *table, const char *label)
+{
+  int  iresult = 0;
+  char errmsg[MAX_ERR_LENGTH];
+  
+  iresult = nc_put_var_int(exoid, varid, table);
+    
+  if (iresult != NC_NOERR) {
+    exerrval = iresult;
+    sprintf(errmsg,
+            "Error: failed to store %s variable truth table in file id %d",
+            label, exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+   }
+  return iresult;
+}
+
+static int define_truth_table(ex_entity_type obj_type, int exoid, int num_ent, int num_var,
+			      int *var_tab, int *status_tab, void_int *ids, const char *label)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int k = 0;
+  int i, j;
+  int time_dim;
+  int dims[2];
+  int varid;
+  int status;
+
+  if ((status = nc_inq_dimid(exoid, DIM_TIME, &time_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate time dimension in file id %d", exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+    return -1;
+  }
+
+  if (var_tab == NULL) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+            "Error: %s variable truth table is NULL in file id %d", label, exoid);
+    ex_err("ex_put_all_var_param_ext",errmsg, exerrval);
+    return -1;
+  }
+  
+  for (i=0; i<num_ent; i++) {
+    int64_t id;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API)
+      id = ((int64_t*)ids)[i];
+    else
+      id = ((int*)ids)[i];
+      
+    for (j=1; j<=num_var; j++) {
+      
+      /* check if variables are to be put out for this block */
+      if (var_tab[k] != 0) {
+        if (status_tab[i] != 0) {/* only define variable if active */
+          dims[0] = time_dim;
+                
+          /* Determine number of entities in entity */
+          /* Need way to make this more generic... */
+          status = nc_inq_dimid(exoid, ex_dim_num_entries_in_object( obj_type, i+1 ), &dims[1]);
+          if (status != NC_NOERR) {
+            exerrval = status;
+            sprintf(errmsg,
+                    "Error: failed to locate number of entities in %s %"PRId64" in file id %d",
+                    label, id, exoid);
+            ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+            return status;
+          }
+          
+          /* define netCDF variable to store variable values;
+           * the j index cycles from 1 through the number of variables so 
+           * that the index of the EXODUS II variable (which is part of 
+           * the name of the netCDF variable) will begin at 1 instead of 0
+           */
+          status = nc_def_var(exoid, ex_name_var_of_object( obj_type, j, i+1 ),
+			      nc_flt_code(exoid), 2, dims, &varid);
+          if (status != NC_NOERR) {
+            if (status != NC_ENAMEINUSE) {
+              exerrval = status;
+              sprintf(errmsg,
+                      "Error: failed to define %s variable for %s %"PRId64" in file id %d",
+                      label, label, id, exoid);
+              ex_err("ex_put_all_var_param_ext",errmsg,exerrval);
+              return status;
+            }
+          }
+	  ex_compress_variable(exoid, varid, 2);
+        }
+      }  /* if */
+      k++; /* increment truth table pointer */
+    }  /* for j */
+  }  /* for i */
+  return NC_NOERR;
+}
diff --git a/exodus/cbind/src/ex_put_attr.c b/exodus/cbind/src/ex_put_attr.c
new file mode 100644
index 0000000..3dde909
--- /dev/null
+++ b/exodus/cbind/src/ex_put_attr.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expatt - ex_put_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     blk_type                block type
+*       int     blk_id                  block id
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+ * writes the attributes for an edge/face/element block
+ * \param   exoid                   exodus file id
+ * \param   blk_type                block type
+ * \param   blk_id                  block id
+ * \param   attrib                  array of attributes
+ */
+
+int ex_put_attr (int   exoid,
+		 ex_entity_type blk_type,
+		 ex_entity_id   blk_id,
+		 const void *attrib)
+{
+  int status;
+  int attrid, blk_id_ndx;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if ( blk_type != EX_NODAL ) {
+    /* Determine index of blk_id in VAR_ID_EL_BLK array */
+    blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+        sprintf(errmsg,
+		"Warning: no attributes allowed for NULL %s %"PRId64" in file id %d",
+                ex_name_of_object(blk_type),blk_id,exoid);
+        ex_err("ex_put_attr",errmsg,EX_NULLENTITY);
+        return (EX_WARN);              /* no attributes for this block */
+      } else {
+        sprintf(errmsg,
+		"Error: no %s id %"PRId64" in in file id %d",
+                ex_name_of_object(blk_type), blk_id, exoid);
+        ex_err("ex_put_attr",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+    }
+  }
+
+  switch (blk_type) {
+  case EX_SIDE_SET:
+    status = nc_inq_varid (exoid, VAR_SSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_NODE_SET:
+    status = nc_inq_varid (exoid, VAR_NSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_EDGE_SET:
+    status = nc_inq_varid (exoid, VAR_ESATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_FACE_SET:
+    status = nc_inq_varid (exoid, VAR_FSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_ELEM_SET:
+    status = nc_inq_varid (exoid, VAR_ELSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_NODAL:
+    status = nc_inq_varid (exoid, VAR_NATTRIB, &attrid);
+    break;
+  case EX_EDGE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_EATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_FACE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_FATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_ELEM_BLOCK:
+    status = nc_inq_varid (exoid, VAR_ATTRIB(blk_id_ndx), &attrid);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_put_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attribute variable for %s %"PRId64" in file id %d",
+            ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the attributes  */
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_var_float(exoid, attrid, attrib);
+  } else {
+    status = nc_put_var_double(exoid, attrid, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put attributes for %s %"PRId64" in file id %d",
+            ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_attr_names.c b/exodus/cbind/src/ex_put_attr_names.c
new file mode 100644
index 0000000..081a23b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_attr_names.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expatn - ex_put_attr_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     blk_type                block type (edge, face, elem)
+*       int     blk_id                  block id
+*       char*   names                   ptr to array of attribute names
+
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for nc_inq_dimid, nc_inq_varid, etc
+
+/*!
+ * writes the attribute names for a block
+ * \param   exoid                   exodus file id
+ * \param   blk_type                block type (edge, face, elem)
+ * \param   blk_id                  block id
+ * \param   names                   ptr to array of attribute names
+ */
+int ex_put_attr_names(int   exoid,
+		      ex_entity_type blk_type,
+		      ex_entity_id   blk_id,
+		      char* names[])
+{
+  int varid, numattrdim, blk_id_ndx;
+  size_t num_attr;
+
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+   
+  exerrval = 0; /* clear error code */
+
+  blk_id_ndx = ex_id_lkup(exoid, blk_type, blk_id);
+
+  /* Determine index of blk_id in blk_id_ndx array */
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: no attributes allowed for NULL %s %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_put_attr_names",errmsg,EX_NULLENTITY);
+      return (EX_WARN);              /* no attributes for this block */
+    } else {
+      sprintf(errmsg,
+	      "Error: no %s id %"PRId64" in %s array in file id %d",
+	      ex_name_of_object(blk_type), blk_id, VAR_ID_EL_BLK, exoid);
+      ex_err("ex_put_attr_names",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  switch (blk_type) {
+  case EX_SIDE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_SS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_NODE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_NS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_EDGE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_ES(blk_id_ndx), &numattrdim);
+    break;
+  case EX_FACE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_FS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_ELEM_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_ELS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_NODAL:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_NBLK, &numattrdim);
+    break;
+  case EX_EDGE_BLOCK:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_EBLK(blk_id_ndx), &numattrdim);
+    break;
+  case EX_FACE_BLOCK:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_FBLK(blk_id_ndx), &numattrdim);
+    break;
+  case EX_ELEM_BLOCK:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_BLK(blk_id_ndx), &numattrdim);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_put_attr_names",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: number of attributes not defined for %s %"PRId64" in file id %d",
+	    ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_attr_names",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numattrdim, &num_attr)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_attr_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  switch (blk_type) {
+  case EX_SIDE_SET:
+    status = nc_inq_varid (exoid, VAR_NAME_SSATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_NODE_SET:
+    status = nc_inq_varid (exoid, VAR_NAME_NSATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_EDGE_SET:
+    status = nc_inq_varid (exoid, VAR_NAME_ESATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_FACE_SET:
+    status = nc_inq_varid (exoid, VAR_NAME_FSATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_ELEM_SET:
+    status = nc_inq_varid (exoid, VAR_NAME_ELSATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_NODAL:
+    status = nc_inq_varid (exoid, VAR_NAME_NATTRIB, &varid);
+    break;
+  case EX_EDGE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_NAME_EATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_FACE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_NAME_FATTRIB(blk_id_ndx), &varid);
+    break;
+  case EX_ELEM_BLOCK:
+    status = nc_inq_varid (exoid, VAR_NAME_ATTRIB(blk_id_ndx), &varid);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_put_attr_names",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s attribute names for %s %"PRId64" in file id %d",
+	    ex_name_of_object(blk_type),ex_name_of_object(blk_type),blk_id, exoid);
+    ex_err("ex_put_attr_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the attributes  */
+  status = ex_put_names_internal(exoid, varid, num_attr, names, blk_type,
+				 "attribute", "ex_put_attr_names");
+
+  return(status);
+}
diff --git a/exodus/cbind/src/ex_put_attr_param.c b/exodus/cbind/src/ex_put_attr_param.c
new file mode 100644
index 0000000..02cce3f
--- /dev/null
+++ b/exodus/cbind/src/ex_put_attr_param.c
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expmp - ex_put_attr_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid           exodus file id
+*       int     obj_type        block/set type (node, edge, face, elem)
+*       int     obj_id          block/set id (ignored for NODAL)       
+*       int     num_attrs       number of attributes
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+/*!
+ * defines the number of attributes.
+ * \param   exoid           exodus file id
+ * \param   obj_type        block/set type (node, edge, face, elem)
+ * \param   obj_id          block/set id (ignored for NODAL)       
+ * \param   num_attrs       number of attributes
+ */
+
+int ex_put_attr_param (int   exoid,
+		       ex_entity_type obj_type,
+		       ex_entity_id   obj_id,
+		       int   num_attrs)
+{
+  int status;
+  int dims[2];
+  int strdim, varid;
+  
+  char errmsg[MAX_ERR_LENGTH];
+  const char *dnumobjent;
+  const char *dnumobjatt;
+  const char *vobjatt;
+  const char *vattnam;
+  int numobjentdim;
+  int obj_id_ndx;
+  int numattrdim;
+  
+  /* Determine index of obj_id in obj_type id array */
+  if (obj_type == EX_NODAL)
+    obj_id_ndx = 0;
+  else {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes found for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_put_attr_param",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this object */
+      } else {
+	sprintf(errmsg,
+		"Warning: failed to locate %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type),obj_id, exoid);
+	ex_err("ex_put_attr_param",errmsg,exerrval);
+	return (EX_WARN);
+      }
+    }
+  }
+
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vobjatt = VAR_SSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vobjatt = VAR_NSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vobjatt = VAR_ESATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vobjatt = VAR_FSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vobjatt = VAR_ELSATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vobjatt = VAR_NATTRIB;
+    vattnam = VAR_NAME_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vobjatt = VAR_EATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vobjatt = VAR_FATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vobjatt = VAR_ATTRIB(obj_id_ndx);
+    vattnam = VAR_NAME_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Bad block type (%d) specified for file id %d",
+	    obj_type, exoid );
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  exerrval = 0; /* clear error code */
+
+  if ((status = nc_inq_dimid(exoid, dnumobjent, &numobjentdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of entries for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  if ((status = nc_def_dim(exoid, dnumobjatt, num_attrs, &numattrdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define number of attributes in %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+
+  dims[0] = numobjentdim;
+  dims[1] = numattrdim;
+  
+  if ((status = nc_def_var(exoid, vobjatt, nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error:  failed to define attributes for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type), obj_id,exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+  ex_compress_variable(exoid, varid, 2);
+  
+  /* inquire previously defined dimensions  */
+  if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get string length in file id %d",exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Attribute names... */
+  dims[0] = numattrdim;
+  dims[1] = strdim;
+
+  if ((status = nc_def_var(exoid, vattnam, NC_CHAR, 2, dims, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define %s attribute name array in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete %s attribute parameter definition in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR) {     /* exit define mode */       
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_attr_param",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_block.c b/exodus/cbind/src/ex_put_block.c
new file mode 100644
index 0000000..0dfd5ef
--- /dev/null
+++ b/exodus/cbind/src/ex_put_block.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expblk - ex_put_block: write edge, face, or element block parameters
+*
+* entry conditions - 
+*   input parameters:
+*       int     idexo                   exodus file id
+*       int     blk_type                type of block (edge, face, or element)
+*       int     blk_id                  block identifer
+*       char*   entry_descrip           string describing shape of entries in the block
+*       int     num_entries_this_blk    number of entries(records) in the block
+*       int     num_nodes_per_entry     number of nodes per block entry
+*       int     num_edges_per_entry     number of edges per block entry
+*       int     num_faces_per_entry     number of faces per block entry
+*       int     num_attr_per_entry      number of attributes per block entry
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <string.h>                     // for strcpy
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_block, etc
+
+/*!
+ * writes the parameters used to describe an element/face/edge block
+ * \param   exoid                   exodus file id
+ * \param   blk_type                type of block (edge, face, or element)
+ * \param   blk_id                  block identifer
+ * \param   entry_descrip           string describing shape of entries in the block
+ * \param   num_entries_this_blk    number of entries(records) in the block
+ * \param   num_nodes_per_entry     number of nodes per block entry
+ * \param   num_edges_per_entry     number of edges per block entry
+ * \param   num_faces_per_entry     number of faces per block entry
+ * \param   num_attr_per_entry      number of attributes per block entry
+ */
+
+int ex_put_block( int         exoid,
+                  ex_entity_type blk_type,
+                  ex_entity_id   blk_id,
+                  const char* entry_descrip,
+                  int64_t     num_entries_this_blk,
+                  int64_t     num_nodes_per_entry,
+                  int64_t     num_edges_per_entry,
+                  int64_t     num_faces_per_entry,
+                  int64_t     num_attr_per_entry )
+{
+  ex_block block;
+  block.type = blk_type;
+  block.id   = blk_id;
+  strncpy(block.topology, entry_descrip, MAX_STR_LENGTH+1);
+  block.topology[MAX_STR_LENGTH] = '\0';
+  block.num_entry           = num_entries_this_blk;
+  block.num_nodes_per_entry = num_nodes_per_entry;
+  block.num_edges_per_entry = num_edges_per_entry;
+  block.num_faces_per_entry = num_faces_per_entry;
+  block.num_attribute       = num_attr_per_entry;
+
+  return ex_put_block_param(exoid, block);
+}
+
diff --git a/exodus/cbind/src/ex_put_block_param.c b/exodus/cbind/src/ex_put_block_param.c
new file mode 100644
index 0000000..1271fa0
--- /dev/null
+++ b/exodus/cbind/src/ex_put_block_param.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"                   // for ex_put_block_params, etc
+
+/*!
+ * writes the parameters used to describe an element/face/edge block
+ * \param   exoid                   exodus file id
+ * \param   block                   ex_block structure describing block counts
+ */
+
+int ex_put_block_param( int         exoid,
+			const ex_block block)
+{
+  return ex_put_block_params(exoid, 1, &block);
+}
+
diff --git a/exodus/cbind/src/ex_put_block_params.c b/exodus/cbind/src/ex_put_block_params.c
new file mode 100644
index 0000000..6770b9e
--- /dev/null
+++ b/exodus/cbind/src/ex_put_block_params.c
@@ -0,0 +1,585 @@
+/*
+ * Copyright (c) 2014 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <string.h>                     // for NULL, strcpy, strlen
+#include "exodusII.h"                   // for ex_block, ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+/*!
+ * writes the parameters used to describe an element/face/edge block
+ * \param   exoid                   exodus file id
+ * \param   block_count             number of blocks being defined
+ * \param   block                   array of ex_block structures describing block counts
+ */
+
+int ex_put_block_params( int         exoid,
+			 size_t      block_count,
+			 const struct ex_block *blocks)
+{
+  size_t i;
+  int conn_int_type;
+  int status;
+  int arbitrary_polyhedra = 0; /* 1 if block is arbitrary 2d polyhedra type; 2 if 3d polyhedra */
+  int att_name_varid = -1;
+  int varid, dimid, dims[2], blk_id_ndx, blk_stat, strdim;
+  size_t start[2];
+  size_t num_blk;
+  int cur_num_blk, numblkdim, numattrdim;
+  int nnodperentdim = -1;
+  int nedgperentdim = -1;
+  int nfacperentdim = -1;
+  int connid;
+  int npeid;
+  char errmsg[MAX_ERR_LENGTH];
+  char entity_type1[5];
+  char entity_type2[5];
+  int* blocks_to_define = NULL;
+  const char* dnumblk = NULL;
+  const char* vblkids = NULL;
+  const char* vblksta = NULL;
+  const char* vnodcon = NULL;
+  const char* vnpecnt = NULL;
+  const char* vedgcon = NULL;
+  const char* vfaccon = NULL;
+  const char* vconn   = NULL;
+  const char* vattnam = NULL;
+  const char* vblkatt = NULL;
+  const char* dneblk  = NULL;
+  const char* dnape   = NULL;
+  const char* dnnpe   = NULL;
+  const char* dnepe   = NULL;
+  const char* dnfpe   = NULL;
+
+  exerrval  = 0; /* clear error code */
+
+  blocks_to_define = malloc(block_count*sizeof(int));
+
+  for (i=0; i < block_count; i++) {
+    switch (blocks[i].type) {
+    case EX_EDGE_BLOCK:
+      dnumblk = DIM_NUM_ED_BLK;
+      vblkids = VAR_ID_ED_BLK;
+      vblksta = VAR_STAT_ED_BLK;
+      break;
+    case EX_FACE_BLOCK:
+      dnumblk = DIM_NUM_FA_BLK;
+      vblkids = VAR_ID_FA_BLK;
+      vblksta = VAR_STAT_FA_BLK;
+      break;
+    case EX_ELEM_BLOCK:
+      dnumblk = DIM_NUM_EL_BLK;
+      vblkids = VAR_ID_EL_BLK;
+      vblksta = VAR_STAT_EL_BLK;
+      break;
+    default:
+      exerrval = EX_BADPARAM;
+      sprintf( errmsg, "Error: Bad block type (%d) specified for entry %d file id %d",
+	       blocks[i].type, (int)i, exoid );
+      ex_err( "ex_put_block_params", errmsg, exerrval );
+      free(blocks_to_define);
+      return (EX_FATAL);
+    }
+
+    /* first check if any blocks of that type are specified */
+    if ((status = ex_get_dimension(exoid, dnumblk, ex_name_of_object(blocks[i].type),
+				   &num_blk, &dimid, "ex_put_block_params")) != NC_NOERR) {
+      sprintf(errmsg,
+	      "Error: No %ss defined in file id %d",
+	      ex_name_of_object(blocks[i].type), exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return EX_FATAL;
+    }
+
+    /* Next: Make sure that there are not any duplicate block ids by
+       searching the vblkids array.
+       WARNING: This must be done outside of define mode because id_lkup accesses
+       the database to determine the position
+    */
+
+    if ((status = nc_inq_varid(exoid, vblkids, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %s ids in file id %d",
+	      ex_name_of_object(blocks[i].type), exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return EX_FATAL;
+    }
+
+    ex_id_lkup(exoid,blocks[i].type,blocks[i].id); /* Error value used, but don't need return value */
+    if (exerrval != EX_LOOKUPFAIL) {   /* found the element block id */
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: %s id %"PRId64" already exists in file id %d",
+	      ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return (EX_FATAL);
+    }
+
+    /* Keep track of the total number of element blocks defined using a counter 
+       stored in a linked list keyed by exoid.
+       NOTE: ex_get_file_item  is a function that finds the number of element 
+       blocks for a specific file and returns that value.
+    */
+    cur_num_blk=ex_get_file_item(exoid, ex_get_counter_list(blocks[i].type));
+    if (cur_num_blk >= (int)num_blk) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of %ss (%d) defined in file id %d",
+	      ex_name_of_object(blocks[i].type), (int)num_blk,exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return (EX_FATAL);
+    }
+
+    /*   NOTE: ex_inc_file_item  is a function that finds the number of element
+	 blocks for a specific file and returns that value incremented. */
+    cur_num_blk=ex_inc_file_item(exoid, ex_get_counter_list(blocks[i].type));
+    start[0] = cur_num_blk;
+
+    /* write out block id to previously defined id array variable*/
+    status = nc_put_var1_longlong(exoid, varid, start, (long long*)&blocks[i].id);
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store %s id to file id %d",
+	      ex_name_of_object(blocks[i].type), exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return (EX_FATAL);
+    }
+
+    blocks_to_define[i] = start[0]+1; /* element id index into vblkids array*/
+
+    if (blocks[i].num_entry == 0) /* Is this a NULL element block? */
+      blk_stat = 0; /* change element block status to NULL */
+    else
+      blk_stat = 1; /* change element block status to EX_EX_TRUE */
+
+    if ((status = nc_inq_varid (exoid, vblksta, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %s status in file id %d",
+	      ex_name_of_object(blocks[i].type), exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_put_var1_int(exoid, varid, start, &blk_stat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store %s id %"PRId64" status to file id %d",
+	      ex_name_of_object(blocks[i].type), blocks[i].id, exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      free(blocks_to_define);
+      return (EX_FATAL);
+    }
+  }
+
+  /* put netcdf file into define mode  */
+  if ((status=nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+    ex_err("ex_put_block_params",errmsg,exerrval);
+    free(blocks_to_define);
+    return (EX_FATAL);
+  }
+
+
+  for (i=0; i < block_count; i++) {
+    if (blocks[i].num_entry == 0) {/* Is this a NULL element block? */
+      continue;
+    }
+
+    blk_id_ndx = blocks_to_define[i];
+
+    switch (blocks[i].type) {
+    case EX_EDGE_BLOCK:
+      dneblk = DIM_NUM_ED_IN_EBLK(blk_id_ndx);
+      dnnpe = DIM_NUM_NOD_PER_ED(blk_id_ndx);
+      dnepe = 0;
+      dnfpe = 0;
+      dnape = DIM_NUM_ATT_IN_EBLK(blk_id_ndx);
+      vblkatt = VAR_EATTRIB(blk_id_ndx);
+      vattnam = VAR_NAME_EATTRIB(blk_id_ndx);
+      vnodcon = VAR_EBCONN(blk_id_ndx);
+      vedgcon = 0;
+      vfaccon = 0;
+      break;
+    case EX_FACE_BLOCK:
+      dneblk = DIM_NUM_FA_IN_FBLK(blk_id_ndx);
+      dnnpe = DIM_NUM_NOD_PER_FA(blk_id_ndx);
+      dnepe = 0;
+      dnfpe = 0;
+      dnape = DIM_NUM_ATT_IN_FBLK(blk_id_ndx);
+      vblkatt = VAR_FATTRIB(blk_id_ndx);
+      vattnam = VAR_NAME_FATTRIB(blk_id_ndx);
+      vnodcon = VAR_FBCONN(blk_id_ndx);
+      vnpecnt = VAR_FBEPEC(blk_id_ndx);
+      vedgcon = 0;
+      vfaccon = 0;
+      break;
+    case EX_ELEM_BLOCK:
+      dneblk = DIM_NUM_EL_IN_BLK(blk_id_ndx);
+      dnnpe = DIM_NUM_NOD_PER_EL(blk_id_ndx);
+      dnepe = DIM_NUM_EDG_PER_EL(blk_id_ndx);
+      dnfpe = DIM_NUM_FAC_PER_EL(blk_id_ndx);
+      dnape = DIM_NUM_ATT_IN_BLK(blk_id_ndx);
+      vblkatt = VAR_ATTRIB(blk_id_ndx);
+      vattnam = VAR_NAME_ATTRIB(blk_id_ndx);
+      vnodcon = VAR_CONN(blk_id_ndx);
+      vnpecnt = VAR_EBEPEC(blk_id_ndx);
+      vedgcon = VAR_ECONN(blk_id_ndx);
+      vfaccon = VAR_FCONN(blk_id_ndx);
+      break;
+    default:
+      goto error_ret;
+    }
+
+    /* define some dimensions and variables*/
+    if ((status = nc_def_dim(exoid,dneblk,blocks[i].num_entry, &numblkdim )) != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {        /* duplicate entry */
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: %s %"PRId64" already defined in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of entities/block for %s %"PRId64" file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+      }
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    if ( dnnpe && blocks[i].num_nodes_per_entry > 0) {
+      /* A nfaced block would not have any nodes defined... */
+      if ((status = nc_def_dim(exoid,dnnpe,blocks[i].num_nodes_per_entry, &nnodperentdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of nodes/entity for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    }
+
+    if (dnepe && blocks[i].num_edges_per_entry > 0 ) {
+      if ((status = nc_def_dim (exoid,dnepe,blocks[i].num_edges_per_entry, &nedgperentdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of edges/entity for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    }
+
+    if ( dnfpe && blocks[i].num_faces_per_entry > 0 ) {
+      if ((status = nc_def_dim(exoid,dnfpe,blocks[i].num_faces_per_entry, &nfacperentdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of faces/entity for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    }
+
+    /* element attribute array */
+    if (blocks[i].num_attribute > 0) {
+
+      if ((status = nc_def_dim(exoid, dnape, blocks[i].num_attribute, &numattrdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of attributes in %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+      dims[0] = numblkdim;
+      dims[1] = numattrdim;
+
+      if ((status = nc_def_var(exoid, vblkatt, nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error:  failed to define attributes for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+      ex_compress_variable(exoid, varid, 2);
+
+      /* inquire previously defined dimensions  */
+      if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get string length in file id %d",exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;
+      }
+     
+      /* Attribute names... */
+      dims[0] = numattrdim;
+      dims[1] = strdim;
+	    
+      if ((status = nc_def_var(exoid, vattnam, NC_CHAR, 2, dims, &att_name_varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define %s attribute name array in file id %d",
+		ex_name_of_object(blocks[i].type), exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    }
+
+    conn_int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+      conn_int_type = NC_INT64;
+    }
+
+    /* See if storing an 'nsided' element block (arbitrary 2d polyhedra or super element) */
+    if (strlen(blocks[i].topology) >= 3) {
+      if ((blocks[i].topology[0] == 'n' || blocks[i].topology[0] == 'N') &&
+	  (blocks[i].topology[1] == 's' || blocks[i].topology[1] == 'S') &&
+	  (blocks[i].topology[2] == 'i' || blocks[i].topology[2] == 'I'))
+	arbitrary_polyhedra = 1;
+      else if ((blocks[i].topology[0] == 'n' || blocks[i].topology[0] == 'N') &&
+	       (blocks[i].topology[1] == 'f' || blocks[i].topology[1] == 'F') &&
+	       (blocks[i].topology[2] == 'a' || blocks[i].topology[2] == 'A'))
+	/* If a FACE_BLOCK, then we are dealing with the faces of the nfaced blocks[i]. */
+	arbitrary_polyhedra = blocks[i].type == EX_FACE_BLOCK ? 1 : 2;
+    }
+
+    /* element connectivity array */
+    if (arbitrary_polyhedra > 0) {
+      if (blocks[i].type != EX_FACE_BLOCK && blocks[i].type != EX_ELEM_BLOCK) {
+	exerrval = EX_BADPARAM;
+	sprintf( errmsg, "Error: Bad block type (%d) for nsided/nfaced block in file id %d",
+		 blocks[i].type, exoid );
+	ex_err( "ex_put_block_params", errmsg, exerrval );
+	goto error_ret;
+      }
+
+      if (arbitrary_polyhedra == 1) {
+	dims[0] = nnodperentdim;
+	vconn = vnodcon;
+
+	/* store entity types as attribute of npeid variable -- node/elem, node/face, face/elem*/
+	strcpy(entity_type1, "NODE");
+	if (blocks[i].type == EX_ELEM_BLOCK)
+	  strcpy(entity_type2, "ELEM");
+	else
+	  strcpy(entity_type2, "FACE");
+      } else if (arbitrary_polyhedra == 2) {
+	dims[0] = nfacperentdim;
+	vconn = vfaccon;
+
+	/* store entity types as attribute of npeid variable -- node/elem, node/face, face/elem*/
+	strcpy(entity_type1, "FACE");
+	strcpy(entity_type2, "ELEM");
+      }
+
+      if ((status = nc_def_var(exoid, vconn, conn_int_type, 1, dims, &connid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to create connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    
+      /* element face-per-element or node-per-element count array */
+      dims[0] = numblkdim;
+    
+      if ((status = nc_def_var(exoid, vnpecnt, conn_int_type, 1, dims, &npeid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to create face- or node- per-entity count array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id, exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+      if ((status = nc_put_att_text(exoid, npeid, "entity_type1", strlen(entity_type1)+1,
+				    entity_type1)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to store entity type attribute text for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id, exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+      if ((status = nc_put_att_text(exoid, npeid, "entity_type2", strlen(entity_type2)+1,
+				    entity_type2)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to store entity type attribute text for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id, exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    } else {
+      /* "Normal" (non-polyhedra) element block type */
+      dims[0] = numblkdim;
+      dims[1] = nnodperentdim;
+    
+      if ((status = nc_def_var(exoid, vnodcon, conn_int_type, 2, dims, &connid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to create connectivity array for %s %"PRId64" in file id %d",
+		ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	ex_err("ex_put_block_params",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+      ex_compress_variable(exoid, connid, 1);
+    }
+    /* store element type as attribute of connectivity variable */
+    if ((status = nc_put_att_text(exoid, connid, ATT_NAME_ELB, strlen(blocks[i].topology)+1, 
+				  blocks[i].topology)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store %s type name %s in file id %d",
+	      ex_name_of_object(blocks[i].type), blocks[i].topology,exoid);
+      ex_err("ex_put_block_params",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    if (arbitrary_polyhedra == 0) {
+      if (vedgcon && blocks[i].num_edges_per_entry ) {
+	dims[0] = numblkdim;
+	dims[1] = nedgperentdim;
+      
+	if ((status = nc_def_var(exoid, vedgcon, conn_int_type, 2, dims, &varid)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to create edge connectivity array for %s %"PRId64" in file id %d",
+		  ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	  ex_err("ex_put_block_params",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+      }
+    
+      if ( vfaccon && blocks[i].num_faces_per_entry ) {
+	dims[0] = numblkdim;
+	dims[1] = nfacperentdim;
+      
+	if ((status = nc_def_var(exoid, vfaccon, conn_int_type, 2, dims, &varid)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to create face connectivity array for %s %"PRId64" in file id %d",
+		  ex_name_of_object(blocks[i].type), blocks[i].id,exoid);
+	  ex_err("ex_put_block_params",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+      }
+    }
+  }
+
+  free(blocks_to_define);
+
+  /* leave define mode  */
+  if ((exerrval=nc_enddef (exoid)) != NC_NOERR) {
+    sprintf(errmsg,
+	    "Error: failed to complete %s definition in file id %d", 
+	    ex_name_of_object(blocks[i].type), exoid);
+    ex_err("ex_put_block_params",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  for (i=0; i < block_count; i++) {
+    switch (blocks[i].type) {
+    case EX_EDGE_BLOCK:
+      vblkids = VAR_ID_ED_BLK;
+      break;
+    case EX_FACE_BLOCK:
+      vblkids = VAR_ID_FA_BLK;
+      break;
+    case EX_ELEM_BLOCK:
+      vblkids = VAR_ID_EL_BLK;
+      break;
+    default:
+      return (EX_FATAL); /* should have been handled earlier; quiet compiler here */
+    }
+
+    nc_inq_varid(exoid, vblkids, &att_name_varid);
+
+    if (blocks[i].num_attribute > 0 && att_name_varid >= 0) {
+      /* Output a dummy empty attribute name in case client code doesn't
+	 write anything; avoids corruption in some cases.
+      */
+      size_t  count[2];
+      char *text = "";
+      size_t j;
+
+      count[0] = 1;
+      start[1] = 0;
+      count[1] = strlen(text)+1;
+  
+      for (j = 0; j < blocks[i].num_attribute; j++) {
+	start[0] = j;
+	nc_put_vara_text(exoid, att_name_varid, start, count, text);
+      }
+    }
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  free(blocks_to_define);
+
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_block_params",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_cmap_params.c b/exodus/cbind/src/ex_put_cmap_params.c
new file mode 100644
index 0000000..a5570c2
--- /dev/null
+++ b/exodus/cbind/src/ex_put_cmap_params.c
@@ -0,0 +1,483 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_cmap_params()
+ *****************************************************************************
+ * This function outputs the communication map parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid                - The NetCDF ID of an already open NemesisI file.
+ *      node_cmap_ids       - Pointer to vector of nodal communication
+ *                            set IDs.
+ *      node_cmap_node_cnts - Pointer to a vector which contains a count of
+ *                            the number of FEM nodes for each nodal
+ *                            communication map.
+ *      elem_cmap_ids       - Pointer to vector for retrieval of elemental
+ *                            communication set IDs.
+ *      elem_cmap_elem_cnts - Pointer to a vector which contains a count of
+ *                            the number of FEM elements for each elemental
+ *                            communication map.
+ *      processor           - The processor the file being read was written
+ *                            for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, ex_leavedef, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_def_var, etc
+#include <stddef.h>                     // for size_t
+#include <stdint.h>                     // for int64_t
+#include <stdio.h>                      // for sprintf
+
+
+
+int ex_put_cmap_params(int  exoid,
+                       void_int *node_cmap_ids,
+                       void_int *node_cmap_node_cnts,
+                       void_int *elem_cmap_ids,
+                       void_int *elem_cmap_elem_cnts,
+                       int64_t  processor
+                       )
+{
+  const char   *func_name="ex_put_cmap_params";
+
+  size_t  num_n_comm_maps, num_e_comm_maps;
+  size_t  ncnt_cmap, ecnt_cmap;
+  size_t  icm;
+  int     varid, dimid[1], n_varid, e_varid, status;
+  int     n_varid_idx, e_varid_idx;
+  size_t  start[1];
+  char    ftype[2];
+  int64_t nl_ncnt_cmap, nl_ecnt_cmap;
+  int  nmstat;
+
+  char    errmsg[MAX_ERR_LENGTH];
+
+  int index_type = NC_INT;
+  int id_type  = NC_INT;
+  int format;
+  nc_inq_format(exoid, &format);
+  if ((ex_int64_status(exoid) & EX_BULK_INT64_DB) || (format == NC_FORMAT_NETCDF4)) {
+    index_type = NC_INT64;
+  }
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    id_type = NC_INT64;
+  }
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /*
+  ** with the new database format, this function sould only
+  ** be used for writing a parallel file
+  */
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: failed to get file type from file ID %d\n",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* make sure that this is a parallel file */
+  if (ftype[0] != 'p') {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: function for use with parallel files only, file ID %d\n",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Put NetCDF file into define mode */
+  if ((status = nc_redef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to file ID %d into define mode", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check to see if there are nodal communications maps in the file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_N_CMAPS, &dimid[0])) != NC_NOERR) {
+    num_n_comm_maps = 0;
+  }
+  else {
+    if ((status = nc_inq_dimlen(exoid, dimid[0], &num_n_comm_maps)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+              DIM_NUM_N_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /*
+   * Add dimensions for the size of the number of nodal
+   * communication maps.
+   */
+  if (num_n_comm_maps > 0) {
+
+    /* add the communications data index variable */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_DATA_IDX, index_type, 1,
+			     dimid, &n_varid_idx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_N_COMM_DATA_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Add dimensions for all of the nodal communication maps */
+    ncnt_cmap = 0;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      for(icm=0; icm < num_n_comm_maps; icm++) {
+	ncnt_cmap += ((int64_t*)node_cmap_node_cnts)[icm];
+      }
+    } else {
+      for(icm=0; icm < num_n_comm_maps; icm++) {
+	ncnt_cmap += ((int*)node_cmap_node_cnts)[icm];
+      }
+    }
+
+    if ((status = nc_def_dim(exoid, DIM_NCNT_CMAP, ncnt_cmap, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add dimension for \"%s\" in file ID %d",
+              DIM_NCNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define variables for the nodal IDS and processor vectors */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_NIDS, id_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_N_COMM_NIDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_N_COMM_PROC, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_N_COMM_PROC, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_n_comm_maps > 0)" */
+
+  /* Check to see if there are elemental communications maps in the file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_E_CMAPS, &dimid[0])) != NC_NOERR) {
+    num_e_comm_maps = 0;
+  }
+  else{
+    if ((status = nc_inq_dimlen(exoid, dimid[0], &num_e_comm_maps)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+              DIM_NUM_E_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  }
+
+  /*
+   * Add dimensions for the size of the number of elemental
+   * communication maps.
+   */
+  if (num_e_comm_maps > 0) {
+
+    /* add the communications data index variable */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_DATA_IDX, index_type, 1,
+			     dimid, &e_varid_idx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_E_COMM_DATA_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Add dimensions for each of the nodal communication maps */
+    ecnt_cmap = 0;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      for(icm=0; icm < num_e_comm_maps; icm++)
+	ecnt_cmap += ((int64_t*)elem_cmap_elem_cnts)[icm];
+    } else {
+      for(icm=0; icm < num_e_comm_maps; icm++)
+	ecnt_cmap += ((int*)elem_cmap_elem_cnts)[icm];
+    }
+    if ((status = nc_def_dim(exoid, DIM_ECNT_CMAP, ecnt_cmap, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add dimension for \"%s\" in file ID %d",
+              DIM_ECNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define variables for the element IDS and processor vectors */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_EIDS, id_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_E_COMM_EIDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_E_COMM_PROC, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_E_COMM_PROC, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_E_COMM_SIDS, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add variable \"%s\" in file ID %d",
+              VAR_E_COMM_SIDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_e_comm_maps > 0)" */
+
+  /* Exit define mode */
+  ex_leavedef(exoid, func_name);
+
+  /* Set the status of the nodal communication maps */
+  if (num_n_comm_maps > 0) {
+
+    if ((status = nc_inq_varid(exoid, VAR_N_COMM_STAT, &n_varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_N_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    nl_ncnt_cmap = 0; /* reset this for index */
+    for(icm=0; icm < num_n_comm_maps; icm++) {
+
+      size_t ncnc;
+      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	ncnc = ((int64_t*)node_cmap_node_cnts)[icm];
+      } else {
+	ncnc = ((int*)node_cmap_node_cnts)[icm];
+      }
+
+      start[0] = icm;
+      if (ncnc > 0)
+        nmstat = 1;
+      else
+        nmstat = 0;
+
+      if ((status = nc_put_var1_int(exoid, n_varid, start, &nmstat)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: unable to output variable in file ID %d", exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      /* increment to the next starting position */
+      nl_ncnt_cmap += ncnc;
+
+      /* fill the cmap data index */
+      if ((status = nc_put_var1_longlong(exoid, n_varid_idx, start, (long long*)&nl_ncnt_cmap)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output int elem map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    } /* End "for(icm=0; icm < num_n_comm_maps; icm++)" */
+
+    /* Get the variable ID for the comm map IDs vector */
+    if ((status = nc_inq_varid(exoid, VAR_N_COMM_IDS, &n_varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_N_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Output the nodal comm map IDs */
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      status  = nc_put_var_longlong(exoid, n_varid, node_cmap_ids);
+    } else {
+      status  = nc_put_var_int(exoid, n_varid, node_cmap_ids);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable in file ID %d", exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_n_comm_maps > 0)" */
+
+  /* Set the status of the elemental communication maps */
+  if (num_e_comm_maps > 0) {
+
+    /* Get variable ID for elemental status vector */
+    if ((status = nc_inq_varid(exoid, VAR_E_COMM_STAT, &e_varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_E_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    nl_ecnt_cmap = 0; /* reset this for index */
+    for(icm=0; icm < num_e_comm_maps; icm++) {
+      size_t ecec;
+      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	ecec = ((int64_t*)elem_cmap_elem_cnts)[icm];
+      } else {
+	ecec = ((int*)elem_cmap_elem_cnts)[icm];
+      }
+      start[0] = icm;
+      if (ecec > 0)
+        nmstat = 1;
+      else
+        nmstat = 0;
+
+      if ((status = nc_put_var1_int(exoid, e_varid, start, &nmstat)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: unable to output variable in file ID %d", exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      /* increment to the next starting position */
+      nl_ecnt_cmap += ecec;
+
+      /* fill the cmap data index */
+      if ((status = nc_put_var1_longlong(exoid, e_varid_idx, start, (long long*)&nl_ecnt_cmap)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output int elem map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+     } /* End "for(icm=0; icm < num_e_comm_maps; icm++)" */
+
+    /* Get the variable ID for the elemental comm map IDs vector */
+    if ((status = nc_inq_varid(exoid, VAR_E_COMM_IDS, &e_varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_E_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Output the elemental comm map IDs */
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      status = nc_put_var_longlong(exoid, e_varid, elem_cmap_ids);
+    } else {
+      status = nc_put_var_int(exoid, e_varid, elem_cmap_ids);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable in file ID %d", exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_e_comm_maps > 0)" */
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_cmap_params_cc.c b/exodus/cbind/src/ex_put_cmap_params_cc.c
new file mode 100644
index 0000000..952dfcb
--- /dev/null
+++ b/exodus/cbind/src/ex_put_cmap_params_cc.c
@@ -0,0 +1,630 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_cmap_params_cc()
+ *****************************************************************************
+ * This function outputs the concantenated list of communication map
+ * parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid                - The NetCDF ID of an already open NemesisI file.
+ *      node_cmap_ids       - Pointer to vector of nodal communication
+ *                            set IDs.
+ *      node_cmap_node_cnts - Pointer to a vector which contains a count of
+ *                            the number of FEM nodes for each nodal
+ *                            communication map.
+ *      elem_cmap_ids       - Pointer to vector for retrieval of elemental
+ *                            communication set IDs.
+ *      elem_cmap_elem_cnts - Pointer to a vector which contains a count of
+ *                            the number of FEM elements for each elemental
+ *                            communication map.
+ *      proc_ids            - The processor the file being read was written
+ *                            for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, ex_leavedef, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_def_var, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <stdlib.h>                     // for free, malloc
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_cmap_params_cc(int  exoid,
+                          void_int *node_cmap_ids,
+                          void_int *node_cmap_node_cnts,
+                          void_int *node_proc_ptrs,
+                          void_int *elem_cmap_ids,
+                          void_int *elem_cmap_elem_cnts,
+                          void_int *elem_proc_ptrs
+                          )
+{
+  const char   *func_name="ex_put_cmap_params_cc";
+
+  size_t  num_n_comm_maps, num_e_comm_maps, num_procs_in_file;
+  int     status, icm, n_varid[2], e_varid[2], iproc;
+  int     varid, n_dimid[1], e_dimid[1];
+  int     n_varid_idx, e_varid_idx;
+  int     num_icm;
+  size_t start[1], count[1];
+  size_t ecnt_cmap, ncnt_cmap;
+
+  long long nl_ecnt_cmap, nl_ncnt_cmap;
+  long long *n_var_idx = NULL;
+  long long *e_var_idx = NULL;
+
+  int  nmstat;
+
+  char    errmsg[MAX_ERR_LENGTH];
+  int     format;
+  int     index_type, bulk_type;
+  /*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* See if using NC_FORMAT_NETCDF4 format... */
+  nc_inq_format(exoid, &format);
+  if ((ex_int64_status(exoid) & EX_BULK_INT64_DB) || (format == NC_FORMAT_NETCDF4)) {
+    index_type = NC_INT64;
+  } else {
+    index_type = NC_INT;
+  }
+  if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+    bulk_type = NC_INT64;
+  } else {
+    bulk_type = NC_INT;
+  }
+  
+  /* Get the number of processors in the file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_PROCS_F, &n_dimid[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_PROCS_F, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, n_dimid[0], &num_procs_in_file)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find length of dimension \"%s\" in file ID %d",
+            DIM_NUM_PROCS_F, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /*
+   * since I cannot get variables while in define mode, I need to
+   * get the cmap information index variables before I go into
+   * define mode
+   */
+
+  /* Check to see if there are nodal communications maps in the file */
+  if (nc_inq_dimid(exoid, DIM_NUM_N_CMAPS, &n_dimid[0]) != NC_NOERR) {
+    num_n_comm_maps = 0;
+  }
+  else {
+    if ((status = nc_inq_dimlen(exoid, n_dimid[0], &num_n_comm_maps)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in \
+file ID %d",
+              DIM_NUM_N_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if (num_n_comm_maps > 0) {
+    /* Get the variable ID for the comm map index vector */
+    if ((status = nc_inq_varid(exoid, VAR_N_COMM_INFO_IDX, &n_varid_idx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_N_COMM_INFO_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* allocate space for the index variable */
+    n_var_idx = malloc((num_procs_in_file + 1) * sizeof(long long));
+    if (!n_var_idx) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+              "Error: insufficient memory to read index variable from file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* and set the last value of the index */
+    n_var_idx[0] = 0;
+
+    /* get the communication map info index */
+#if defined(NC_NETCDF4)
+    status = nc_get_var_longlong(exoid, n_varid_idx, &(n_var_idx[1]));
+#else
+    status = nc_get_var_int(exoid, n_varid_idx, &(n_var_idx[1]));
+#endif
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get variable \"%s\" from file ID %d",
+	      VAR_N_COMM_INFO_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* "if (num_n_comm_maps > 0)" */
+
+    /* Check to see if there are elemental communications maps in the file */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_E_CMAPS, &e_dimid[0])) != NC_NOERR) {
+    num_e_comm_maps = 0;
+  }
+  else {
+    if ((status = nc_inq_dimlen(exoid, e_dimid[0], &num_e_comm_maps)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find length of dimension \"%s\" in \
+file ID %d",
+	      DIM_NUM_E_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if (num_e_comm_maps > 0) {
+    /* Get the variable ID for the comm map index vector */
+    if ((status = nc_inq_varid(exoid, VAR_E_COMM_INFO_IDX, &e_varid_idx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find variable ID for \"%s\" in file ID %d",
+	      VAR_E_COMM_INFO_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* allocate space for the index variable */
+    e_var_idx = malloc((num_procs_in_file + 1) * sizeof(long long));
+    if (!e_var_idx) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+	      "Error: insufficient memory to read index variable from file ID %d",
+	      exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* and set the first value of the index */
+    e_var_idx[0] = 0;
+
+    /* get the communication map info index */
+#if defined NC_NETCDF4
+    status = nc_get_var_longlong(exoid, e_varid_idx, &(e_var_idx[1]));
+#else
+    status = nc_get_var_int(exoid, e_varid_idx, &(e_var_idx[1]));
+#endif
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get variable \"%s\" from file ID %d",
+	      VAR_E_COMM_INFO_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* "if (num_e_comm_maps >0)" */
+
+    /* Put NetCDF file into define mode */
+  if ((status = nc_redef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to put file ID %d into define mode", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /*
+   * Add dimensions for the size of the number of nodal
+   * communication maps.
+   */
+  if (num_n_comm_maps > 0) {
+    /* add the communications data index variable */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_DATA_IDX, index_type, 1,
+			     n_dimid, &n_varid_idx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_N_COMM_DATA_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* now add up all of the nodal communications maps */
+    ncnt_cmap = 0;
+    for(iproc=0; iproc < num_procs_in_file; iproc++) {
+      num_icm = n_var_idx[iproc+1] - n_var_idx[iproc];
+      for(icm=0; icm < num_icm; icm++)
+	if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	  ncnt_cmap += ((int64_t*)node_cmap_node_cnts)[((int64_t*)node_proc_ptrs)[iproc]+icm];
+	} else {
+	  ncnt_cmap += ((int*)node_cmap_node_cnts)[((int*)node_proc_ptrs)[iproc]+icm];
+	}
+    }
+
+    if ((status = nc_def_dim(exoid, DIM_NCNT_CMAP, ncnt_cmap, &n_dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add dimension for \"%s\" of size %"ST_ZU" in file ID %d",
+	      DIM_NCNT_CMAP, ncnt_cmap, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define variables for the nodal IDS and processor vectors */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_NIDS, bulk_type, 1, n_dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_N_COMM_NIDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_N_COMM_PROC, NC_INT, 1, n_dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_N_COMM_PROC, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_n_comm_maps > 0)" */
+
+    /*
+     * Add dimensions for the size of the number of elemental
+     * communication maps.
+     */
+  if (num_e_comm_maps > 0) {
+    /* add the communications data index variable */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_DATA_IDX, index_type, 1,
+			     e_dimid, &e_varid_idx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_E_COMM_DATA_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* now add up all of the nodal communications maps */
+    ecnt_cmap = 0;
+    for(iproc=0; iproc < num_procs_in_file; iproc++) {
+      num_icm = e_var_idx[iproc+1] - e_var_idx[iproc];
+      for(icm=0; icm < num_icm; icm++)
+	if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	  ecnt_cmap += ((int64_t*)elem_cmap_elem_cnts)[((int64_t*)elem_proc_ptrs)[iproc]+icm];
+	} else {
+	  ecnt_cmap += ((int*)elem_cmap_elem_cnts)[((int*)elem_proc_ptrs)[iproc]+icm];
+	}
+    }
+
+    /* Add dimensions for elemental communications maps */
+    if ((status = nc_def_dim(exoid, DIM_ECNT_CMAP, ecnt_cmap, &e_dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add dimension for \"%s\" in file ID %d",
+	      DIM_ECNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define variables for the element IDS and processor vectors */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_EIDS, bulk_type, 1, e_dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_E_COMM_EIDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_E_COMM_PROC, NC_INT, 1, e_dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_E_COMM_PROC, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_E_COMM_SIDS, bulk_type, 1, e_dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to add variable \"%s\" in file ID %d",
+	      VAR_E_COMM_SIDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_e_comm_maps > 0)" */
+
+
+    /* Exit define mode */
+  ex_leavedef(exoid, func_name);
+
+  /* Set the status of the nodal communication maps */
+  if (num_n_comm_maps > 0) {
+
+    /* need to get the two "n_comm_*" variable ids */
+
+    if ((status = nc_inq_varid(exoid, VAR_N_COMM_STAT, &n_varid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find variable ID for \"%s\" in file ID %d",
+	      VAR_N_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Get the variable ID for the comm map IDs vector */
+    if ((status = nc_inq_varid(exoid, VAR_N_COMM_IDS, &n_varid[1])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find variable ID for \"%s\" in file ID %d",
+	      VAR_N_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* reset the index variable */
+    nl_ncnt_cmap = 0;
+
+    for(iproc=0; iproc < num_procs_in_file; iproc++) {
+      size_t proc_ptr;
+      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	proc_ptr = ((int64_t*)node_proc_ptrs)[iproc];
+      } else {
+	proc_ptr = ((int*)node_proc_ptrs)[iproc];
+      }
+
+      num_icm = n_var_idx[iproc+1] - n_var_idx[iproc];
+      for(icm=0; icm < num_icm; icm++) {
+	size_t cnt;
+	if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	  cnt = ((int64_t*)node_cmap_node_cnts)[proc_ptr+icm];
+	} else {
+	  cnt = ((int*)node_cmap_node_cnts)[proc_ptr+icm];
+	}
+	
+	start[0] = n_var_idx[iproc] + icm;
+	if (cnt > 0)
+	  nmstat = 1;
+	else
+	  nmstat = 0;
+
+	if ((status = nc_put_var1_int(exoid, n_varid[0], start, &nmstat)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: unable to output variable in file ID %d", exoid);
+	  ex_err(func_name, errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	/* increment to the next starting position */
+	nl_ncnt_cmap += cnt;
+
+	/* fill the data index variable */
+	status = nc_put_var1_longlong(exoid, n_varid_idx, start, &nl_ncnt_cmap);
+
+	if (status != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to output int elem map index in file ID %d",
+		  exoid);
+	  ex_err(func_name, errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+      } /* End "for(icm=0; icm < num_icm; icm++)" */
+
+      if (num_icm > 0) {
+	/* Output the nodal comm map IDs */
+	start[0] = n_var_idx[iproc];
+	count[0] =  num_icm;
+	if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	  status = nc_put_vara_longlong(exoid, n_varid[1], start, count,
+					&((long long*)node_cmap_ids)[proc_ptr]);
+	} else {
+	  status = nc_put_vara_int(exoid, n_varid[1], start, count,
+				   &((int*)node_cmap_ids)[proc_ptr]);
+	}
+	if (status != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to output variable in file ID %d", exoid);
+	  ex_err(func_name, errmsg, exerrval);
+
+	  return (EX_FATAL);
+	}
+      }
+    } /* End "for(iproc=0; iproc < num_procs_in_file; iproc++)" */
+
+      /* free up memory for index */
+    free(n_var_idx);
+
+  } /* End "if (num_n_comm_maps > 0)" */
+
+
+    /* Set the status of the elemental communication maps */
+  if (num_e_comm_maps > 0) {
+
+    /* need to get the two "e_comm_*" variables" */
+
+    /* Get variable ID for elemental status vector */
+    if ((status = nc_inq_varid(exoid, VAR_E_COMM_STAT, &e_varid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find variable ID for \"%s\" in file ID %d",
+	      VAR_E_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Get the variable ID for the elemental comm map IDs vector */
+    if ((status = nc_inq_varid(exoid, VAR_E_COMM_IDS, &e_varid[1])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to find variable ID for \"%s\" in file ID %d",
+	      VAR_E_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* reset the index variable */
+    nl_ecnt_cmap = 0;
+
+    for(iproc=0; iproc < num_procs_in_file; iproc++) {
+      size_t proc_ptr;
+      if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	proc_ptr = ((int64_t*)elem_proc_ptrs)[iproc];
+      } else {
+	proc_ptr = ((int*)elem_proc_ptrs)[iproc];
+      }
+      num_icm = e_var_idx[iproc+1] - e_var_idx[iproc];
+      for(icm=0; icm < num_icm; icm++) {
+
+	size_t cnt;
+	if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+	  cnt = ((int64_t*)elem_cmap_elem_cnts)[proc_ptr+icm];
+	} else {
+	  cnt = ((int*)elem_cmap_elem_cnts)[proc_ptr+icm];
+	}
+
+	start[0] = e_var_idx[iproc] + icm;
+	if (cnt > 0)
+	  nmstat = 1;
+	else
+	  nmstat = 0;
+
+	if ((status = nc_put_var1_int(exoid, e_varid[0], start, &nmstat)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: unable to output variable in file ID %d", exoid);
+	  ex_err(func_name, errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	/* increment to the next starting position */
+	nl_ecnt_cmap += cnt;
+
+	/* fill the data index variable */
+	status = nc_put_var1_longlong(exoid, e_varid_idx, start, &nl_ecnt_cmap);
+
+	if (status != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to output int elem map index in file ID %d",
+		  exoid);
+	  ex_err(func_name, errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+      } /* End "for(icm=0; icm < num_icm; icm++)" */
+
+      if (num_icm > 0) {
+	/* Output the elemental comm map IDs */
+	start[0] = e_var_idx[iproc];
+	count[0] = num_icm;
+	if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	  status = nc_put_vara_longlong(exoid, e_varid[1], start, count,
+					&((long long*)elem_cmap_ids)[proc_ptr]);
+	} else {
+	  status = nc_put_vara_int(exoid, e_varid[1], start, count,
+				   &((int*)elem_cmap_ids)[proc_ptr]);
+	}
+	if (status != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to output variable in file ID %d", exoid);
+	  ex_err(func_name, errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+      }
+    } /* End "for(iproc=0; iproc < num_procs_in_file; iproc++)" */
+
+    free(e_var_idx);
+
+  } /* End "if (num_e_comm_maps > 0)" */
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_concat_all_blocks.c b/exodus/cbind/src/ex_put_concat_all_blocks.c
new file mode 100644
index 0000000..b24137b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_concat_all_blocks.c
@@ -0,0 +1,628 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expclb - ex_put_concat_all_blocks: write elem, edge, & face block parameters
+*
+* entry conditions - 
+*   input parameters:
+*       int                    exoid          exodus file id
+*       const ex_block_params* bparam         block parameters structure
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL, free, malloc
+#include <string.h>                     // for strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+
+/*!
+ * writes the parameters used to describe all element, edge, and face blocks
+ * \param     exoid          exodus file id
+ * \param     param         block parameters structure
+ */
+int ex_put_concat_all_blocks (int    exoid,
+                              const ex_block_params *param)
+{
+  int varid, dimid, dims[2], strdim, *eb_stat, *ed_stat, *fa_stat;
+  int temp;
+  size_t iblk;
+  size_t i;
+  int status;
+  size_t num_elem_blk = 0;
+  size_t num_edge_blk = 0;
+  size_t num_face_blk = 0;
+  int cur_num_elem_blk, nelnoddim, numelbdim, numattrdim, connid=-1;
+  int cur_num_edge_blk, numedbdim, nednoddim, cur_num_face_blk, numfabdim, nfanoddim;
+  int neledgdim=-1, nelfacdim=-1;
+  char errmsg[MAX_ERR_LENGTH];
+  int elem_work = 0; /* is DIM_NUM_EL_BLK defined? If so, there's work to do */
+  int edge_work = 0; /* is DIM_NUM_ED_BLK defined? If so, there's work to do */
+  int face_work = 0; /* is DIM_NUM_FA_BLK defined? If so, there's work to do */
+
+  int* edge_id_int = NULL;
+  int* face_id_int = NULL;
+  int* elem_id_int = NULL;
+
+  int64_t* edge_id_int64 = NULL;
+  int64_t* face_id_int64 = NULL;
+  int64_t* elem_id_int64 = NULL;
+
+  int ids_int64 = ex_int64_status(exoid) & EX_IDS_INT64_API;
+    
+  static const char* dim_num_maps[] = {
+    DIM_NUM_NM,
+    DIM_NUM_EDM,
+    DIM_NUM_FAM,
+    DIM_NUM_EM,
+  };
+  static const char* dim_size_maps[] = {
+    DIM_NUM_NODES,
+    DIM_NUM_EDGE,
+    DIM_NUM_FACE,
+    DIM_NUM_ELEM,
+  };
+  static const ex_entity_type map_enums[] = {
+    EX_NODE_MAP,
+    EX_EDGE_MAP,
+    EX_FACE_MAP,
+    EX_ELEM_MAP
+  };
+
+  /* If param->define_maps is true, we must fill these with values from ex_put_init_ext
+     before entering define mode */
+  size_t num_maps[sizeof(dim_num_maps)/sizeof(dim_num_maps[0])];
+  size_t num_map_dims = sizeof(dim_num_maps)/sizeof(dim_num_maps[0]);
+
+  if (ids_int64) {
+    edge_id_int64 = param->edge_blk_id;
+    face_id_int64 = param->face_blk_id;
+    elem_id_int64 = param->elem_blk_id;
+  } else {
+    edge_id_int = param->edge_blk_id;
+    face_id_int = param->face_blk_id;
+    elem_id_int = param->elem_blk_id;
+  }
+
+  exerrval  = 0; /* clear error code */
+
+  /* inquire previously defined dimensions  */
+  if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get string length in file id %d",exoid);
+    ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ( param->define_maps ) {
+    for ( i = 0; i < num_map_dims; ++i ) {
+      if ((status = nc_inq_dimid(exoid, dim_num_maps[i], &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf( errmsg, "Error: failed to find node map size of file id %d", exoid );
+        ex_err( "ex_put_concat_all_blocks", errmsg, exerrval );
+        return (EX_FATAL);
+      }
+      if ((status = nc_inq_dimlen(exoid, dimid, num_maps+i)) != NC_NOERR) {
+	exerrval = status;
+	sprintf( errmsg, "Error: failed to retrieve node map size of file id %d", exoid );
+	ex_err( "ex_put_concat_all_blocks", errmsg, exerrval );
+	return (EX_FATAL);
+      }
+    }
+  }
+
+#define EX_PREPARE_BLOCK(TNAME,WNAME,DNUMNAME,VSTATNAME,VIDNAME,LNUMNAME,SNUMNAME,SIDNAME,GSTAT) \
+  /* first check if any TNAME blocks are specified			\
+   * OK if zero...							\
+   */									\
+    if ((status = (nc_inq_dimid(exoid, DNUMNAME, &dimid))) == NC_NOERR) { \
+      WNAME = 1;							\
+									\
+      /* Get number of TNAME blocks defined for this file */		\
+      if ((status = nc_inq_dimlen(exoid,dimid,&LNUMNAME)) != NC_NOERR) { \
+	exerrval = status;						\
+	sprintf(errmsg,							\
+		"Error: failed to get number of " TNAME " blocks in file id %d", \
+		exoid);							\
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+	return (EX_FATAL);						\
+      }									\
+									\
+      /* Fill out the TNAME block status array */			\
+      if (!(GSTAT = malloc(LNUMNAME*sizeof(int)))) {			\
+	exerrval = EX_MEMFAIL;						\
+	sprintf(errmsg,							\
+		"Error: failed to allocate space for " TNAME " block status array in file id %d", \
+		exoid);							\
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+	return (EX_FATAL);						\
+      }									\
+									\
+      for (i=0;i<LNUMNAME;i++) {					\
+	if (SNUMNAME[i] == 0) /* Is this a NULL TNAME block? */		\
+	  GSTAT[i] = 0; /* change TNAME block status to NULL */		\
+	else								\
+	  GSTAT[i] = 1; /* change TNAME block status to EX_TRUE */		\
+      }									\
+									\
+      /* Next, get variable id of status array */			\
+      if ((status = nc_inq_varid(exoid, VSTATNAME, &varid)) != NC_NOERR) { \
+	exerrval = status;						\
+	sprintf(errmsg,							\
+		"Error: failed to locate " TNAME " block status in file id %d", \
+		exoid);							\
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+	ex_safe_free(GSTAT);                                               \
+	return (EX_FATAL);						\
+      }									\
+									\
+      status = nc_put_var_int(exoid, varid, GSTAT);			\
+									\
+      if (status != NC_NOERR) {						\
+	exerrval = status;						\
+	sprintf(errmsg,							\
+		"Error: failed to store " TNAME " block status array to file id %d", \
+		exoid);							\
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+	ex_safe_free(GSTAT);                                               \
+	return (EX_FATAL);						\
+      }									\
+									\
+      free(GSTAT);							\
+									\
+      /* Next, fill out ids array */					\
+      /* first get id of ids array variable */				\
+      if ((status = nc_inq_varid(exoid, VIDNAME, &varid)) != NC_NOERR) { \
+	exerrval = status;						\
+	sprintf(errmsg,							\
+		"Error: failed to locate " TNAME " block ids array in file id %d", \
+		exoid);							\
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+	return (EX_FATAL);						\
+      }									\
+									\
+      /* then, write out id list */					\
+      if (ids_int64) {                                                  \
+         status = nc_put_var_longlong(exoid, varid, SIDNAME);		\
+      } else {                                                          \
+         status = nc_put_var_int(exoid, varid, SIDNAME);		\
+      }                                                                 \
+									\
+      if (status != NC_NOERR) {						\
+	exerrval = status;						\
+	sprintf(errmsg,							\
+		"Error: failed to store " TNAME " block id array in file id %d", \
+		exoid);							\
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+	return (EX_FATAL);						\
+      }									\
+    }
+
+  EX_PREPARE_BLOCK("element",elem_work,DIM_NUM_EL_BLK,VAR_STAT_EL_BLK,VAR_ID_EL_BLK,
+		   num_elem_blk,param->num_elem_this_blk,param->elem_blk_id,eb_stat);
+  EX_PREPARE_BLOCK(   "edge",edge_work,DIM_NUM_ED_BLK,VAR_STAT_ED_BLK,VAR_ID_ED_BLK,
+		      num_edge_blk,param->num_edge_this_blk,param->edge_blk_id,ed_stat);
+  EX_PREPARE_BLOCK(   "face",face_work,DIM_NUM_FA_BLK,VAR_STAT_FA_BLK,VAR_ID_FA_BLK,
+		      num_face_blk,param->num_face_this_blk,param->face_blk_id,fa_stat);
+
+  if ( elem_work == 0 && edge_work == 0 && face_work == 0 && param->define_maps == 0 ) {
+    /* Nothing to do. This is not an error, but we can save
+     * ourselves from entering define mode by returning here.
+     */
+    return (EX_NOERR);
+  }
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef(exoid)) != NC_NOERR)  {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+    ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+#define EX_PREPARE_ATTRIB_ARRAY(TNAME,CURBLK,DNAME,DVAL,ID,VANAME,VADIM0,VADIM1,VANNAME) \
+  if (DVAL[iblk] > 0) {							\
+    if ((status = nc_def_dim (exoid,					\
+			      DNAME(CURBLK+1),				\
+			      DVAL[iblk], &VADIM1)) != NC_NOERR) { \
+      exerrval = status;						\
+      sprintf(errmsg,							\
+	      "Error: failed to define number of attributes in " TNAME " block %"PRId64" in file id %d", \
+	      ID,exoid);						\
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+      goto error_ret;         /* exit define mode and return */		\
+    }									\
+									\
+    dims[0] = VADIM0;							\
+    dims[1] = VADIM1;							\
+									\
+    if ((status = nc_def_var (exoid, VANAME(CURBLK+1),			\
+			      nc_flt_code(exoid), 2, dims, &temp)) != NC_NOERR) { \
+      exerrval = status;						\
+      sprintf(errmsg,							\
+	      "Error:  failed to define attributes for " TNAME " block %"PRId64" in file id %d", \
+	      ID,exoid);						\
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+      goto error_ret;         /* exit define mode and return */		\
+    }									\
+    ex_compress_variable(exoid, temp, 2);                               \
+									\
+    /* Attribute names... */						\
+    dims[0] = VADIM1;							\
+    dims[1] = strdim;							\
+									\
+    if ((status = nc_def_var(exoid, VANNAME(CURBLK+1), NC_CHAR, 2, dims, &temp)) != NC_NOERR) { \
+      exerrval = status;						\
+      sprintf(errmsg,							\
+	      "Error: failed to define " TNAME " attribute name array in file id %d",exoid); \
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+      goto error_ret;         /* exit define mode and return */		\
+    }									\
+  }
+
+#define EX_PREPARE_CONN(TNAME,BLK,BLKID,BLKSZ,VNAME,DNAME)		\
+    if ( DNAME > 0 ) {							\
+    int conn_int_type = NC_INT;                                         \
+    if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {                    \
+      conn_int_type = NC_INT64;                                         \
+    }                                                                   \
+    dims[0] = BLKSZ;							\
+    dims[1] = DNAME;							\
+									\
+    if ((status = nc_def_var(exoid, VNAME(BLK+1),			\
+			     conn_int_type, 2, dims, &connid)) != NC_NOERR) {	\
+      exerrval = status;						\
+      sprintf(errmsg,							\
+	      "Error: failed to create " TNAME " connectivity array for block %"PRId64" in file id %d", \
+	      BLKID,exoid);					\
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);		\
+      goto error_ret;         /* exit define mode and return */		\
+    }									\
+    ex_compress_variable(exoid, connid, 1);                             \
+  }
+
+
+  /* Iterate over edge blocks ... */
+  for (iblk = 0; iblk < num_edge_blk; ++iblk) {
+    ex_entity_id eb_id;
+    if (ids_int64)
+      eb_id = edge_id_int64[iblk];
+    else
+      eb_id = edge_id_int[iblk];
+      
+    cur_num_edge_blk=ex_get_file_item(exoid, ex_get_counter_list(EX_EDGE_BLOCK));
+    if (cur_num_edge_blk >= (int)num_edge_blk) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of edge blocks (%ld) defined in file id %d",
+	      (long)num_edge_blk,exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;
+    }
+
+    /* NOTE: ex_inc_file_item  is used to find the number of edge blocks
+       for a specific file and returns that value incremented. */
+    cur_num_edge_blk=ex_inc_file_item(exoid, ex_get_counter_list(EX_EDGE_BLOCK));
+
+    if (param->num_edge_this_blk[iblk] == 0) /* Is this a NULL edge block? */
+      continue;
+
+    /* define some dimensions and variables*/
+    if ((status = nc_def_dim(exoid,
+			     DIM_NUM_ED_IN_EBLK(cur_num_edge_blk+1),
+			     param->num_edge_this_blk[iblk],&numedbdim)) != NC_NOERR) {
+      exerrval = status;
+      if (status == NC_ENAMEINUSE) {     /* duplicate entry */
+	sprintf(errmsg,
+		"Error: edge block %"PRId64" already defined in file id %d",
+		eb_id,exoid);
+      } else {
+	sprintf(errmsg,
+		"Error: failed to define number of edges/block for block %"PRId64" file id %d",
+		eb_id,exoid);
+      }
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    if ((status = nc_def_dim(exoid,
+			     DIM_NUM_NOD_PER_ED(cur_num_edge_blk+1),
+			     param->num_nodes_per_edge[iblk],&nednoddim)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define number of nodes/edge for block %"PRId64" in file id %d",
+	      eb_id,exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    /* edge attribute array */
+    EX_PREPARE_ATTRIB_ARRAY("edge",cur_num_edge_blk,DIM_NUM_ATT_IN_EBLK,param->num_attr_edge,
+			    eb_id,VAR_EATTRIB,numedbdim,numattrdim,VAR_NAME_EATTRIB);
+    
+    EX_PREPARE_CONN("edge block",cur_num_edge_blk,
+		    eb_id,numedbdim,VAR_EBCONN,nednoddim);
+
+    /* store edge type as attribute of connectivity variable */
+    if ((status = nc_put_att_text(exoid, connid, ATT_NAME_ELB, strlen(param->edge_type[iblk])+1,
+				  (void*)param->edge_type[iblk])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store edge type name %s in file id %d",
+	      param->edge_type[iblk],exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+  }
+
+  /* Iterate over face blocks ... */
+  for (iblk = 0; iblk < num_face_blk; ++iblk) {
+    ex_entity_id fb_id;
+    if (ids_int64)
+      fb_id = face_id_int64[iblk];
+    else
+      fb_id = face_id_int[iblk];
+
+    cur_num_face_blk=ex_get_file_item(exoid, ex_get_counter_list(EX_FACE_BLOCK));
+    if (cur_num_face_blk >= (int)num_face_blk) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of face blocks (%ld) defined in file id %d",
+	      (long)num_face_blk,exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;
+    }
+
+    /* NOTE: ex_inc_file_item  is used to find the number of edge blocks
+       for a specific file and returns that value incremented. */
+    cur_num_face_blk=ex_inc_file_item(exoid, ex_get_counter_list(EX_FACE_BLOCK));
+
+    if (param->num_face_this_blk[iblk] == 0) /* Is this a NULL face block? */
+      continue;
+
+    /* define some dimensions and variables*/
+    if ((status = nc_def_dim (exoid,
+			      DIM_NUM_FA_IN_FBLK(cur_num_face_blk+1),
+			      param->num_face_this_blk[iblk],&numfabdim)) != NC_NOERR) {
+      exerrval = status;
+      if (status == NC_ENAMEINUSE) {     /* duplicate entry */
+	sprintf(errmsg,
+		"Error: face block %"PRId64" already defined in file id %d",
+		fb_id,exoid);
+      } else {
+	sprintf(errmsg,
+		"Error: failed to define number of faces/block for block %"PRId64" file id %d",
+		fb_id,exoid);
+      }
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    if ((status = nc_def_dim (exoid,
+			      DIM_NUM_NOD_PER_FA(cur_num_face_blk+1),
+			      param->num_nodes_per_face[iblk],&nfanoddim)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define number of nodes/face for block %"PRId64" in file id %d",
+	      fb_id,exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    /* face attribute array */
+    EX_PREPARE_ATTRIB_ARRAY("face",cur_num_face_blk,DIM_NUM_ATT_IN_FBLK,param->num_attr_face,
+			    fb_id,VAR_FATTRIB,numfabdim,numattrdim,VAR_NAME_FATTRIB);
+    
+    EX_PREPARE_CONN("face block",cur_num_face_blk,fb_id,numfabdim,VAR_FBCONN,nfanoddim);
+    
+    /* store face type as attribute of connectivity variable */
+    if ((status = nc_put_att_text(exoid, connid, ATT_NAME_ELB, strlen(param->face_type[iblk])+1,
+				  (void*)param->face_type[iblk])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store face type name %s in file id %d",
+	      param->face_type[iblk],exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+  }
+
+  /* Iterate over element blocks ... */
+  for (iblk = 0; iblk < num_elem_blk; ++iblk) {
+    ex_entity_id eb_id;
+    if (ids_int64)
+      eb_id = elem_id_int64[iblk];
+    else
+      eb_id = elem_id_int[iblk];
+
+    cur_num_elem_blk=ex_get_file_item(exoid, ex_get_counter_list(EX_ELEM_BLOCK));
+    if (cur_num_elem_blk >= (int)num_elem_blk) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of element blocks (%ld) defined in file id %d",
+	      (long)num_elem_blk,exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;
+    }
+
+    /* NOTE: ex_inc_file_item  is used to find the number of element blocks
+       for a specific file and returns that value incremented. */
+    cur_num_elem_blk=ex_inc_file_item(exoid, ex_get_counter_list(EX_ELEM_BLOCK));
+
+    if (param->num_elem_this_blk[iblk] == 0) /* Is this a NULL element block? */
+      continue;
+
+    /* define some dimensions and variables*/
+    if ((status = nc_def_dim (exoid,
+			      DIM_NUM_EL_IN_BLK(cur_num_elem_blk+1),
+			      param->num_elem_this_blk[iblk], &numelbdim)) != NC_NOERR) {
+      exerrval = status;
+      if (status == NC_ENAMEINUSE) {     /* duplicate entry */
+	sprintf(errmsg,
+		"Error: element block %"PRId64" already defined in file id %d",
+		eb_id,exoid);
+      } else {
+	sprintf(errmsg,
+		"Error: failed to define number of elements/block for block %"PRId64" file id %d",
+		eb_id,exoid);
+      }
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    /* Always define DIM_NUM_NOD_PER_EL, even if zero.
+     * Do not define DIM_NUM_EDG_PER_EL or DIM_NUM_FAC_PER_EL unless > 0.
+     */
+    if ((status = nc_def_dim (exoid,
+			      DIM_NUM_NOD_PER_EL(cur_num_elem_blk+1),
+			      param->num_nodes_per_elem[iblk], &nelnoddim)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define number of nodes/element for block %"PRId64" in file id %d",
+	      eb_id,exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    if ( param->num_edges_per_elem[iblk] > 0 ) {
+      if ((status = nc_def_dim (exoid,
+				DIM_NUM_EDG_PER_EL(cur_num_elem_blk+1),
+				param->num_edges_per_elem[iblk],&neledgdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of edges/element for block %"PRId64" in file id %d",
+		eb_id,exoid);
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    }
+
+    if ( param->num_faces_per_elem[iblk] > 0 ) {
+      if ((status = nc_def_dim(exoid,
+			       DIM_NUM_FAC_PER_EL(cur_num_elem_blk+1),
+			       param->num_faces_per_elem[iblk],&nelfacdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of faces/element for block %"PRId64" in file id %d",
+		eb_id,exoid);
+	ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+    }
+
+    EX_PREPARE_ATTRIB_ARRAY("element",cur_num_elem_blk,DIM_NUM_ATT_IN_BLK,param->num_attr_elem,
+			    eb_id,VAR_ATTRIB,numelbdim,numattrdim,VAR_NAME_ATTRIB);
+    
+    EX_PREPARE_CONN("nodal",cur_num_elem_blk,eb_id,numelbdim,VAR_CONN,nelnoddim);
+
+    /* store element type as attribute of connectivity variable */
+    if ((status = nc_put_att_text(exoid, connid, ATT_NAME_ELB, strlen(param->elem_type[iblk])+1,
+				  (void*)param->elem_type[iblk])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store element type name %s in file id %d",
+	      param->elem_type[iblk],exoid);
+      ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    EX_PREPARE_CONN( "edge",cur_num_elem_blk,eb_id,numelbdim,VAR_ECONN,neledgdim);
+    EX_PREPARE_CONN( "face",cur_num_elem_blk,eb_id,numelbdim,VAR_FCONN,nelfacdim);
+  }
+
+  /* Define the element map here to avoid a later redefine call */
+  if ( param->define_maps != 0 ) {
+    size_t map_type;
+    for ( map_type = 0; map_type < num_map_dims; ++map_type ) {
+      if ((status = nc_inq_dimid(exoid, dim_size_maps[map_type], &dims[0])) != NC_NOERR) {
+	exerrval = status;
+	sprintf( errmsg,
+		 "Error: could not find map size dimension %s in file id %d",
+		 dim_size_maps[map_type], exoid );
+	ex_err( "ex_put_concat_all_blocks", errmsg, exerrval );
+      }
+      for ( i = 1; i <= num_maps[map_type]; ++i ) {
+	const char* mapname = ex_name_of_map( map_enums[map_type], i );
+	if (nc_inq_varid(exoid, mapname, &temp) != NC_NOERR) {
+	  int map_int_type = NC_INT;
+	  if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+	    map_int_type = NC_INT64;
+	  }
+	  
+	  if ((status = nc_def_var(exoid, mapname, map_int_type, 1, dims, &temp)) != NC_NOERR) {
+	    exerrval = status;
+	    if ( status == NC_ENAMEINUSE ) {
+	      sprintf( errmsg, "Error: number map %s already exists in file id %d", mapname, exoid );
+	    } else {
+	      sprintf( errmsg, "Error: failed to create number map array %s in file id %d", mapname, exoid );
+	    }
+	    ex_err( "ex_put_concat_all_blocks", errmsg, exerrval );
+	    goto error_ret; /* exit define mode and return */
+	  }
+	  ex_compress_variable(exoid, temp, 1);	\
+	}
+      }
+    }
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete element block definition in file id %d", 
+	    exoid);
+    ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+  
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR) {     /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_concat_all_blocks",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_concat_elem_block.c b/exodus/cbind/src/ex_put_concat_elem_block.c
new file mode 100644
index 0000000..202c450
--- /dev/null
+++ b/exodus/cbind/src/ex_put_concat_elem_block.c
@@ -0,0 +1,446 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expclb - ex_put_concat_elem_block: write element block parameters
+*
+* entry conditions - 
+*   input parameters:
+*       int     idexo                   exodus file id
+*       char**  elem_type               element type string
+*       int*    num_elem_this_blk       number of elements in the element blk
+*       int*    num_nodes_per_elem      number of nodes per element block
+*       int*    num_attr_this_blk       number of attributes
+*       int     define_maps             if != 0, write maps, else don't
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <string.h>                     // for strlen
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+/*!
+ * writes the parameters used to describe an element block
+ * \param    exoid                   exodus file id
+ * \param    elem_blk_id             element block id
+ * \param    elem_type               element type string
+ * \param    num_elem_this_blk       number of elements in the element blk
+ * \param    num_nodes_per_elem      number of nodes per element block
+ * \param    num_attr_this_blk       number of attributes
+ * \param    define_maps             if != 0, write maps, else don't
+ */
+int ex_put_concat_elem_block (int    exoid,
+                              const void_int*   elem_blk_id,
+                              char *elem_type[],
+                              const void_int*   num_elem_this_blk,
+                              const void_int*   num_nodes_per_elem,
+                              const void_int*   num_attr_this_blk,
+                              int    define_maps)
+{
+  int i, varid, dimid, dims[2], strdim, *eb_array;
+  int temp;
+  int iblk;
+  int status;
+  int num_elem_blk;
+  int map_int_type, conn_int_type;
+  size_t length;
+  int cur_num_elem_blk, nelnoddim, numelbdim, numattrdim, connid, numelemdim, numnodedim;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval  = 0; /* clear error code */
+
+  /* first check if any element blocks are specified
+   * OK if zero...
+   */
+  if (nc_inq_dimid(exoid, DIM_NUM_EL_BLK, &dimid) != NC_NOERR) {
+    return (EX_NOERR);
+  }
+
+  /* Get number of element blocks defined for this file */
+  if ((status = nc_inq_dimlen(exoid,dimid,&length)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of element blocks in file id %d",
+	    exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  num_elem_blk = length;
+  
+  /* Fill out the element block status array */
+  if (!(eb_array = malloc(num_elem_blk*sizeof(int)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for element block status array in file id %d",
+	    exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    for (i=0;i<num_elem_blk;i++) {
+      eb_array[i] = (((int64_t*)num_elem_this_blk)[i] == 0) ? 0 : 1;
+    }
+  } else {
+    for (i=0;i<num_elem_blk;i++) {
+      eb_array[i] = (((int*)num_elem_this_blk)[i] == 0) ? 0 : 1;
+    }
+  }
+
+  /* Next, get variable id of status array */
+  if ((status = nc_inq_varid(exoid, VAR_STAT_EL_BLK, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate element block status in file id %d",
+	    exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  status = nc_put_var_int(exoid, varid, eb_array);
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store element block status array to file id %d",
+            exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  /* Next, fill out ids array */
+  /* first get id of ids array variable */
+  if ((status = nc_inq_varid(exoid, VAR_ID_EL_BLK, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate element block ids array in file id %d",
+            exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  /* then, write out id list */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, elem_blk_id);
+  } else {
+    status = nc_put_var_int(exoid, varid, elem_blk_id);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store element block id array in file id %d",
+            exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  /* inquire previously defined dimensions  */
+  if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get string length in file id %d",exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR)  {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  conn_int_type = NC_INT;
+  if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+    conn_int_type = NC_INT64;
+  }
+  
+  map_int_type = NC_INT;
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+    map_int_type = NC_INT64;
+  }
+  
+  /* Iterate over element blocks ... */
+  for (iblk = 0; iblk < num_elem_blk; iblk++) {
+    ex_entity_id eb_id;
+    size_t num_elem;
+    size_t num_npe;
+    size_t num_attr;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      eb_id    = ((int64_t*)elem_blk_id)[iblk];
+      num_elem = ((int64_t*)num_elem_this_blk)[iblk];
+      num_npe  = ((int64_t*)num_nodes_per_elem)[iblk];
+      num_attr = ((int64_t*)num_attr_this_blk)[iblk];
+    } else {
+      eb_id    = ((int*)elem_blk_id)[iblk];
+      num_elem = ((int*)num_elem_this_blk)[iblk];
+      num_npe  = ((int*)num_nodes_per_elem)[iblk];
+      num_attr = ((int*)num_attr_this_blk)[iblk];
+    }
+
+    cur_num_elem_blk=ex_get_file_item(exoid, ex_get_counter_list(EX_ELEM_BLOCK));
+    if (cur_num_elem_blk >= num_elem_blk) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of element blocks (%d) defined in file id %d",
+              num_elem_blk,exoid);
+      ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+      goto error_ret;
+    }
+
+    /* NOTE: ex_inc_file_item  is used to find the number of element blocks
+       for a specific file and returns that value incremented. */
+    cur_num_elem_blk=ex_inc_file_item(exoid, ex_get_counter_list(EX_ELEM_BLOCK));
+
+    if (eb_array[iblk] == 0) /* Is this a NULL element block? */
+      continue;
+
+    /* define some dimensions and variables*/
+    if ((status = nc_def_dim(exoid,
+			     DIM_NUM_EL_IN_BLK(cur_num_elem_blk+1),
+			     num_elem, &numelbdim)) != NC_NOERR) {
+      exerrval = status;
+      if (status == NC_ENAMEINUSE) {     /* duplicate entry */
+	sprintf(errmsg,
+		"Error: element block %"PRId64" already defined in file id %d",
+		eb_id,exoid);
+      } else {
+	sprintf(errmsg,
+		"Error: failed to define number of elements/block for block %"PRId64" file id %d",
+		eb_id,exoid);
+      }
+      ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    if ((status = nc_def_dim(exoid,
+			     DIM_NUM_NOD_PER_EL(cur_num_elem_blk+1),
+			     num_npe, &nelnoddim)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define number of nodes/element for block %"PRId64" in file id %d",
+	      eb_id,exoid);
+      ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    /* element connectivity array */
+    dims[0] = numelbdim;
+    dims[1] = nelnoddim;
+
+    if ((status = nc_def_var (exoid, VAR_CONN(cur_num_elem_blk+1),
+			      conn_int_type, 2, dims, &connid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create connectivity array for block %"PRId64" in file id %d",
+	      eb_id,exoid);
+      ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+    ex_compress_variable(exoid, connid, 1);
+
+    /* store element type as attribute of connectivity variable */
+    if ((status = nc_put_att_text(exoid, connid, ATT_NAME_ELB, strlen(elem_type[iblk])+1, 
+				  (void*)elem_type[iblk])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store element type name %s in file id %d",
+	      elem_type[iblk],exoid);
+      ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+    /* element attribute array */
+    if (num_attr > 0) {
+      if ((status = nc_def_dim (exoid, 
+				DIM_NUM_ATT_IN_BLK(cur_num_elem_blk+1),
+				num_attr, &numattrdim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of attributes in block %"PRId64" in file id %d",
+		eb_id,exoid);
+	ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+      
+      /* Attribute names... */
+      dims[0] = numattrdim;
+      dims[1] = strdim;
+      
+      if ((status = nc_def_var(exoid, VAR_NAME_ATTRIB(cur_num_elem_blk+1),
+			       NC_CHAR, 2, dims, &temp)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define element attribute name array in file id %d",exoid);
+	ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+      eb_array[iblk] = temp;
+
+      dims[0] = numelbdim;
+      dims[1] = numattrdim;
+      
+      if ((status = nc_def_var(exoid, VAR_ATTRIB(cur_num_elem_blk+1),
+			       nc_flt_code(exoid), 2, dims, &temp)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error:  failed to define attributes for element block %"PRId64" in file id %d",
+		eb_id,exoid);
+	ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+    }
+    
+  }
+
+  /* Define the element map here to avoid a later redefine call */
+  if (define_maps != 0) {
+    if (nc_inq_varid(exoid, VAR_ELEM_NUM_MAP, &temp) != NC_NOERR) {
+      /* Map does not exist */
+      /* Possible to have zero elements but >0 element blocks.
+       * Only define map if there are nonzero elements
+       */
+      if (nc_inq_dimid(exoid, DIM_NUM_ELEM, &numelemdim) == NC_NOERR) {
+	dims[0] = numelemdim;
+	
+	if ((status = nc_def_var(exoid, VAR_ELEM_NUM_MAP, map_int_type, 1, dims, &temp)) != NC_NOERR) {
+	  exerrval = status;
+	  if (status == NC_ENAMEINUSE) {
+	    sprintf(errmsg,
+		    "Error: element numbering map already exists in file id %d",
+		    exoid);
+	  } else {
+	    sprintf(errmsg,
+		    "Error: failed to create element numbering map in file id %d",
+		    exoid);
+	  }
+	  ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, temp, 1);
+      }
+    }
+
+    /* Do the same for the node numbering map */
+    if (nc_inq_varid(exoid, VAR_NODE_NUM_MAP, &temp) != NC_NOERR) {
+      /* Map does not exist */
+      if ((nc_inq_dimid(exoid, DIM_NUM_NODES, &numnodedim)) == NC_NOERR) {
+	dims[0] = numnodedim;
+	if ((status = nc_def_var(exoid, VAR_NODE_NUM_MAP, map_int_type, 1, dims, &temp)) != NC_NOERR) {
+	  exerrval = status;
+	  if (status == NC_ENAMEINUSE) {
+	    sprintf(errmsg,
+		    "Error: node numbering map already exists in file id %d",
+		    exoid);
+	  } else {
+	    sprintf(errmsg,
+		    "Error: failed to create node numbering map array in file id %d",
+		    exoid);
+	  }
+	  ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, temp, 1);
+      }
+    }
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete element block definition in file id %d", 
+	    exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+    free(eb_array);
+    return (EX_FATAL);
+  }
+
+  {
+  /* Write dummy attribute name. Without this we get corruption in the
+   * attribute name.
+   */
+    size_t  start[2], count[2];
+    char *text = "";
+    count[0] = 1;
+    start[1] = 0;
+    count[1] = strlen(text)+1;
+    
+    for (iblk = 0; iblk < num_elem_blk; iblk++) {
+      size_t num_attr;
+      if (eb_array[iblk] == 0) /* Is this a NULL element block? */
+	continue;
+      if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+	num_attr = ((int64_t*)num_attr_this_blk)[iblk];
+      } else {
+	num_attr = ((int*)num_attr_this_blk)[iblk];
+      }
+      for (i = 0; i < num_attr; i++) {
+	start[0] = i;
+	nc_put_vara_text(exoid, eb_array[iblk], start, count, text);
+      }
+    }
+  }
+  free(eb_array);
+  
+  return (EX_NOERR);
+  
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  free(eb_array);
+  if (nc_enddef (exoid) != NC_NOERR) {     /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_concat_elem_block",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_concat_node_sets.c b/exodus/cbind/src/ex_put_concat_node_sets.c
new file mode 100644
index 0000000..92af34b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_concat_node_sets.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for NULL
+#include "exodusII.h"                   // for ex_set_specs, void_int, etc
+
+/*!
+\deprecated Use ex_put_concat_sets()(exoid, EX_NODE_SET, &set_specs)
+
+The function ex_put_concat_node_sets() writes the node set ID's, node
+sets node count array, node sets distribution factor count array, node
+sets node list pointers array, node sets distribution factor pointer,
+node set node list, and node set distribution factors for all of the
+node sets. ``Concatenated node sets'' refers to the arrays required to
+define all of the node sets (ID array, counts arrays, pointers arrays,
+node list array, and distribution factors array) as described in
+Section 3.10 on page 11. Writing concatenated node sets is more
+efficient than writing individual node sets. See #Efficiency for a
+discussion of efficiency issues.
+
+Because the distribution factors are floating point values, the
+application code must declare the array passed to be the appropriate
+type (\c float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_put_concat_node_sets() returns a
+negative number; a warning will return a positive number.  Possible
+causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  the number of node sets specified in a call to ex_put_init() was zero or has been exceeded.
+  -  a node set with the same ID has already been stored.
+  -  the number of distribution factors specified for one of the
+     node sets is not zero and is not equal to the number of nodes in the
+     same node set.
+
+\param[in] exoid                exodus file ID returned from a previous call to ex_create()
+                                or ex_open().
+
+\param[in] node_set_ids         Array containing the node set ID for each set.
+
+\param[in] num_nodes_per_set    Array containing the number of nodes for each set.
+
+\param[in] num_dist_per_set     Array containing the number of distribution factors for each set.
+
+\param[in] node_sets_node_index Array containing the indices into the \c node_set_node_list which
+                                are the locations of the first node for each set. These indices are
+				0-based. Pass \c NULL for remaining parameters to just set the
+				nodeset parameters and not output nodeset data.
+
+\param[in] node_sets_df_index   Array containing the indices into the \c node_set_dist_list which
+                                are the locations of the first distribution factor for each set. These
+                                indices are 0-based.
+
+\param[in] node_sets_node_list  Array containing the nodes for all sets. Internal node IDs are used in
+                                this list (See Section LocalNodeIds).
+\param[in] node_sets_dist_fact  Array containing the distribution factors for all sets.
+
+
+For example, the following code will write out two node sets 
+in a concatenated format:
+
+\code
+int ids[2], num_nodes_per_set[2], node_ind[2], node_list[8],
+    num_df_per_set[2], df_ind[2], error, exoid;
+
+float dist_fact[8];
+
+ids[0] = 20; ids[1] = 21;
+num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3;
+
+node_ind[0] = 0; node_ind[1] = 5;
+
+node_list[0] = 100; node_list[1] = 101; node_list[2] = 102;
+node_list[3] = 103; node_list[4] = 104;
+node_list[5] = 200; node_list[6] = 201; node_list[7] = 202;
+
+num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+df_ind[0] = 0; df_ind[1] = 5;
+
+dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+dist_fact[5] = 1.1; dist_fact[6] = 2.1; 
+dist_fact[7] = 3.1;
+
+error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set, 
+                                 num_df_per_set, node_ind, df_ind, 
+                                 node_list, dist_fact);
+\endcode
+
+ */
+
+int ex_put_concat_node_sets (int   exoid,
+                             void_int  *node_set_ids,
+                             void_int  *num_nodes_per_set,
+                             void_int  *num_dist_per_set,
+                             void_int  *node_sets_node_index,
+                             void_int  *node_sets_df_index,
+                             void_int  *node_sets_node_list,
+                             void *node_sets_dist_fact)
+{
+  struct ex_set_specs set_specs;
+
+  set_specs.sets_ids = node_set_ids;
+  set_specs.num_entries_per_set = num_nodes_per_set;
+  set_specs.num_dist_per_set = num_dist_per_set;
+  set_specs.sets_entry_index = node_sets_node_index;
+  set_specs.sets_dist_index = node_sets_df_index;
+  set_specs.sets_entry_list = node_sets_node_list;
+  set_specs.sets_extra_list = NULL;
+  set_specs.sets_dist_fact = node_sets_dist_fact;
+
+  return ex_put_concat_sets(exoid, EX_NODE_SET, &set_specs);
+}
diff --git a/exodus/cbind/src/ex_put_concat_sets.c b/exodus/cbind/src/ex_put_concat_sets.c
new file mode 100644
index 0000000..9ddd63e
--- /dev/null
+++ b/exodus/cbind/src/ex_put_concat_sets.c
@@ -0,0 +1,579 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expcss - ex_put_concat_sets
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                type of set
+*       struct ex_set_specs* set_specs  set specs structure
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL, free, malloc
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_dim, etc
+
+/*!
+ * writes the set ID's, set entry count array, set entry pointers array,
+ * set entry list, set extra list, and distribution factors list for 
+ * all the sets of the specified type.
+ * \param  exoid      exodus file id
+ * \param  set_type   type of set
+ * \param  set_specs  set specs structure
+ */
+
+int ex_put_concat_sets (int   exoid,
+			ex_entity_type set_type,
+			const struct ex_set_specs* set_specs)
+{
+  int status;
+  int temp;
+  const void_int  *num_entries_per_set = set_specs->num_entries_per_set;
+  const void_int  *num_dist_per_set = set_specs->num_dist_per_set;
+  const void_int  *sets_entry_index = set_specs->sets_entry_index;
+  const void_int  *sets_dist_index = set_specs->sets_dist_index;
+  const void *sets_dist_fact = set_specs->sets_dist_fact;
+  size_t i, num_df, num_entry;
+  int cur_num_sets, num_sets;
+  int dimid, varid, set_id_ndx, dims[1];
+  int  *set_stat = NULL;
+  int set_int_type, int_size;
+
+  const float *flt_dist_fact = NULL;
+  const double *dbl_dist_fact = NULL;
+  char errmsg[MAX_ERR_LENGTH];
+  char* idsptr = NULL;
+  char* statptr = NULL;
+  char* numdfptr = NULL;
+  char* factptr = NULL;
+  char* elemptr = NULL;
+  char* extraptr = NULL;
+  ex_inquiry ex_inq_val;
+
+  exerrval = 0; /* clear error code */
+
+  int_size = sizeof(int);
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    int_size = sizeof(int64_t);
+  }
+  
+  /* setup pointers based on set_type 
+     NOTE: there is another block that sets more stuff later ... */
+
+  if (set_type == EX_NODE_SET) {
+    ex_inq_val = EX_INQ_NODE_SETS;
+    idsptr = VAR_NS_IDS;
+    statptr = VAR_NS_STAT;
+  }
+  else if (set_type == EX_EDGE_SET) {
+    ex_inq_val = EX_INQ_EDGE_SETS;
+    idsptr = VAR_ES_IDS;
+    statptr = VAR_ES_STAT;
+  }
+  else if (set_type == EX_FACE_SET) {
+    ex_inq_val = EX_INQ_FACE_SETS;
+    idsptr = VAR_FS_IDS;
+    statptr = VAR_FS_STAT;
+  }
+  else if (set_type == EX_SIDE_SET) {
+    ex_inq_val = EX_INQ_SIDE_SETS;
+    idsptr = VAR_SS_IDS;
+    statptr = VAR_SS_STAT;
+  }
+  else if (set_type == EX_ELEM_SET) {
+    ex_inq_val = EX_INQ_ELEM_SETS;
+    idsptr = VAR_ELS_IDS;
+    statptr = VAR_ELS_STAT;
+  }
+  else {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: invalid set type (%d)", set_type);
+    ex_err("ex_put_set_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &temp)) != NC_NOERR) {
+    if (status == NC_EBADDIM) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: no %ss defined for file id %d", ex_name_of_object(set_type), exoid);
+      ex_err("ex_put_concat_sets",errmsg,exerrval);
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %ss defined in file id %d",
+	      ex_name_of_object(set_type), exoid);
+      ex_err("ex_put_concat_sets",errmsg,exerrval);
+    }
+    return (EX_FATAL);
+  }
+   
+  /* inquire how many sets are to be stored */
+  num_sets = ex_inquire_int(exoid, ex_inq_val);
+  if (num_sets < 0) {
+    sprintf(errmsg,
+	    "Error: failed to get number of %ss defined for file id %d",
+	    ex_name_of_object(set_type), exoid);
+    /* use error val from inquire */
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Fill out set status array */
+
+  /* First, allocate space for the status list */
+  if (!(set_stat= malloc(num_sets*sizeof(int)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate space for %s status array in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (int_size == sizeof(int64_t)) {
+    for (i=0;i<num_sets;i++)  {
+      set_stat[i] = (((int64_t*)num_entries_per_set)[i] == 0) ? 0 : 1;
+    }
+  } else {
+    for (i=0;i<num_sets;i++)  {
+      set_stat[i] = (((int*)num_entries_per_set)[i] == 0) ? 0 : 1;
+    }
+  }
+
+  /* Next, get variable id of status array */
+  if ((status = nc_inq_varid(exoid, statptr, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s status in file id %d", 
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    ex_safe_free(set_stat);
+    return (EX_FATAL);
+  }
+
+  status = nc_put_var_int(exoid, varid, set_stat);
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store %s status array to file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_concat_set",errmsg,exerrval);
+    ex_safe_free(set_stat);
+    return (EX_FATAL);
+  }
+
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to put file id %d into define mode",
+	    exoid);
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    ex_safe_free(set_stat);
+    return (EX_FATAL);
+  }
+
+  /* create set definitions */
+  for (i=0; i<num_sets; i++) {
+    int64_t set_id;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      set_id = ((int64_t*)set_specs->sets_ids)[i];
+    } else {
+      set_id = ((int*)set_specs->sets_ids)[i];
+    }
+
+    /* Keep track of the total number of sets defined using a counter stored
+       in a linked list keyed by exoid.
+       NOTE: ex_get_file_item  is used to find the number of sets of type
+       for a specific file and returns that value.
+    */
+    cur_num_sets=ex_get_file_item(exoid, ex_get_counter_list(set_type));
+    if (cur_num_sets >= num_sets) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of %ss (%d) defined in file id %d",
+	      ex_name_of_object(set_type), num_sets,exoid);
+      ex_err("ex_put_concat_sets",errmsg,exerrval);
+      goto error_ret;
+    }
+
+    /*   NOTE: ex_inc_file_item  is used to find the number of sets
+	 for a specific file and returns that value incremented. */
+
+    cur_num_sets=ex_inc_file_item(exoid, ex_get_counter_list(set_type));
+    set_id_ndx = cur_num_sets + 1;
+    
+    /* setup more pointers based on set_type */
+    if (set_type == EX_NODE_SET) {
+      elemptr = VAR_NODE_NS(set_id_ndx);
+      extraptr = NULL;
+      /* note we are using DIM_NUM_NODE_NS instead of DIM_NUM_DF_NS */
+      numdfptr = DIM_NUM_NOD_NS(set_id_ndx);
+      factptr = VAR_FACT_NS(set_id_ndx);
+    }
+    else if (set_type == EX_EDGE_SET) {
+      elemptr = VAR_EDGE_ES(set_id_ndx);
+      extraptr = VAR_ORNT_ES(set_id_ndx);
+      numdfptr = DIM_NUM_DF_ES(set_id_ndx);
+      factptr = VAR_FACT_ES(set_id_ndx);
+    }
+    else if (set_type == EX_FACE_SET) {
+      elemptr = VAR_FACE_FS(set_id_ndx);
+      extraptr = VAR_ORNT_FS(set_id_ndx);
+      numdfptr = DIM_NUM_DF_FS(set_id_ndx);
+      factptr = VAR_FACT_FS(set_id_ndx);
+    }
+    else if (set_type == EX_SIDE_SET) {
+      elemptr = VAR_ELEM_SS(set_id_ndx);
+      extraptr = VAR_SIDE_SS(set_id_ndx);
+      numdfptr = DIM_NUM_DF_SS(set_id_ndx);
+      factptr = VAR_FACT_SS(set_id_ndx);
+    }
+    if (set_type == EX_ELEM_SET) {
+      elemptr = VAR_ELEM_ELS(set_id_ndx);
+      extraptr = NULL;
+      numdfptr = DIM_NUM_DF_ELS(set_id_ndx);
+      factptr = VAR_FACT_ELS(set_id_ndx);
+    }
+
+    /*  define dimension for number of entries per set */
+    if (set_stat[i] == 0) /* Is this a NULL set? */
+      continue; /* Do not create anything for NULL sets! */
+
+    if (int_size == sizeof(int)) {
+      status = nc_def_dim(exoid, ex_dim_num_entries_in_object(set_type, set_id_ndx),
+			  ((int*)num_entries_per_set)[i], &dimid);
+    } else {
+      status = nc_def_dim(exoid, ex_dim_num_entries_in_object(set_type, set_id_ndx),
+			  ((int64_t*)num_entries_per_set)[i], &dimid);
+    }
+    
+    if (status != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: %s entry count %"PRId64" already defined in file id %d",
+		ex_name_of_object(set_type), set_id,exoid);
+	ex_err("ex_put_concat_sets",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of entries for %s %"PRId64" in file id %d",
+		ex_name_of_object(set_type), set_id,exoid);
+	ex_err("ex_put_concat_sets",errmsg,exerrval);
+      }
+      goto error_ret;
+    }
+
+    /* create element list variable for set */
+    set_int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+      set_int_type = NC_INT64;
+    }
+
+    dims[0] = dimid;
+    if ((status = nc_def_var(exoid,elemptr,set_int_type,1,dims, &temp)) != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: element list already exists for %s %"PRId64" in file id %d",
+		ex_name_of_object(set_type), set_id,exoid);
+	ex_err("ex_put_concat_sets",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to create element list for %s %"PRId64" in file id %d",
+		ex_name_of_object(set_type), set_id,exoid);
+	ex_err("ex_put_concat_sets",errmsg,exerrval);
+      }
+      goto error_ret;            /* exit define mode and return */
+    }
+    ex_compress_variable(exoid, temp, 1);
+
+    /* create extra list variable for set  (only for edge, face and side sets) */
+    if (extraptr) {
+      if ((status = nc_def_var(exoid,extraptr,set_int_type,1,dims, &temp)) != NC_NOERR) { 
+	if (status == NC_ENAMEINUSE) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: extra list already exists for %s %"PRId64" in file id %d",
+		  ex_name_of_object(set_type), set_id,exoid);
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	} else {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to create extra list for %s %"PRId64" in file id %d",
+		  ex_name_of_object(set_type), set_id,exoid);
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	}
+	goto error_ret;         /* exit define mode and return */
+      }
+      ex_compress_variable(exoid, temp, 1);
+    }
+
+    /*  define dimension for number of dist factors per set */
+    /*  NOTE: only define df count if the dist factors exist! */
+    if (int_size == sizeof(int64_t)) {
+      num_df = ((int64_t*)num_dist_per_set)[i];
+      num_entry = ((int64_t*)num_entries_per_set)[i];
+    } else {
+      num_df = ((int*)num_dist_per_set)[i];
+      num_entry = ((int*)num_entries_per_set)[i];
+    }
+
+    if (num_df > 0) {
+      
+      if (set_type == EX_NODE_SET) {
+	if (num_df != num_entry) {
+	  exerrval = EX_FATAL;
+	  sprintf(errmsg,
+		  "Error: # dist fact (%"ST_ZU") not equal to # nodes (%"ST_ZU") in node set %"PRId64" file id %d",
+		  num_df, num_entry, set_id,exoid);
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	  goto error_ret;          /* exit define mode and return */
+	}
+
+	/* resuse dimid from entry lists */
+      } else  {
+	if ((status = nc_def_dim(exoid, numdfptr,
+				 num_df, &dimid)) != NC_NOERR) {
+	  if (status == NC_ENAMEINUSE) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: %s df count %"PRId64" already defined in file id %d",
+		    ex_name_of_object(set_type), set_id,exoid);
+	    ex_err("ex_put_concat_sets",errmsg,exerrval);
+	  } else {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to define %s df count for set %"PRId64" in file id %d",
+		    ex_name_of_object(set_type), set_id,exoid);
+	    ex_err("ex_put_concat_sets",errmsg,exerrval);
+	  }
+	  goto error_ret;
+	}
+      }
+
+      /* create distribution factor list variable for set */
+      dims[0] = dimid;
+      if ((status = nc_def_var(exoid, factptr, nc_flt_code(exoid), 1, dims, &temp)) != NC_NOERR) {
+	if (status == NC_ENAMEINUSE) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: dist factor list already exists for %s %"PRId64" in file id %d",
+		  ex_name_of_object(set_type), set_id,exoid);
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	} else {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to create dist factor list for %s %"PRId64" in file id %d",
+		  ex_name_of_object(set_type), set_id,exoid);
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	}
+	goto error_ret;            /* exit define mode and return */
+      }
+      ex_compress_variable(exoid, temp, 2);
+    } /* end define dist factors */
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete definition in file id %d",
+	    exoid);
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    ex_safe_free(set_stat);
+    return (EX_FATAL);
+  }
+
+  /* Next, fill out set ids array */
+
+  /* first get id of set ids array variable */
+  if ((status = nc_inq_varid(exoid, idsptr, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s ids array in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    ex_safe_free(set_stat);
+    return (EX_FATAL);
+  }
+
+  /* then, write out set id list */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, set_specs->sets_ids);
+  } else {
+    status = nc_put_var_int(exoid, varid, set_specs->sets_ids);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store %s id array in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_concat_sets",errmsg,exerrval);
+    ex_safe_free(set_stat);
+    return (EX_FATAL);
+  }
+
+  /* If the sets_entry_index is passed in as a NULL pointer, then
+   *  the user only wants us to define the sets and not populate
+   *  the data structures.
+   */
+  if (sets_entry_index == 0) {
+    ex_safe_free(set_stat);
+    return(EX_NOERR);
+  }
+  
+  /* Now, use ExodusII call to store sets */
+  for (i=0; i<num_sets; i++) {
+    int64_t set_id;
+    size_t df_ndx;
+    
+    if (set_stat[i] == 0) /* Is this a NULL set? */
+      continue; /* Do not create anything for NULL sets! */
+
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      set_id = ((int64_t*)set_specs->sets_ids)[i];
+    } else {
+      set_id = ((int*)set_specs->sets_ids)[i];
+    }
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      int64_t* extra_list = NULL;
+      /* set extra list */
+      if (set_type == EX_EDGE_SET || set_type == EX_FACE_SET || set_type == EX_SIDE_SET)
+	extra_list = &(((int64_t*)set_specs->sets_extra_list)[((int64_t*)sets_entry_index)[i]]);
+      
+      status = ex_put_set(exoid, set_type, set_id, 
+			  &(((int64_t*)set_specs->sets_entry_list)[((int64_t*)sets_entry_index)[i]]),
+			  extra_list);
+    } else {
+      int* extra_list = NULL;
+      /* set extra list */
+      if (set_type == EX_EDGE_SET || set_type == EX_FACE_SET || set_type == EX_SIDE_SET)
+	extra_list = &(((int*)set_specs->sets_extra_list)[((int*)sets_entry_index)[i]]);
+      
+      status = ex_put_set(exoid, set_type, set_id, 
+			  &(((int*)set_specs->sets_entry_list)[((int*)sets_entry_index)[i]]),
+			  extra_list);
+    }
+    if (status != NC_NOERR) {
+      ex_safe_free(set_stat);
+      return(EX_FATAL); /* error will be reported by subroutine */
+    }
+
+    if (int_size == sizeof(int)) {
+      num_df = ((int*)num_dist_per_set)[i];
+      df_ndx = ((int*)sets_dist_index)[i];
+    } else {
+      num_df = ((int64_t*)num_dist_per_set)[i];
+      df_ndx = ((int64_t*)sets_dist_index)[i];
+    }
+
+    if (ex_comp_ws(exoid) == sizeof(float)) {
+      flt_dist_fact = sets_dist_fact;
+      if (num_df > 0) {     /* store dist factors if required */
+	if (ex_put_set_dist_fact(exoid, set_type, set_id,
+				 &(flt_dist_fact[df_ndx])) == -1) {
+	  sprintf(errmsg,
+		  "Error: failed to store %s %"PRId64" dist factors for file id %d",
+		  ex_name_of_object(set_type), set_id,exoid);
+	  /* use error val from exodusII routine */
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	  ex_safe_free(set_stat);
+	  return (EX_FATAL);
+	}
+      }
+    } else if (ex_comp_ws(exoid) == sizeof(double)) {
+      dbl_dist_fact = sets_dist_fact;
+      if (num_df) {             /* only store if they exist */
+	if (ex_put_set_dist_fact(exoid, set_type, set_id,
+				 &(dbl_dist_fact[df_ndx])) == -1) {
+	  sprintf(errmsg,
+		  "Error: failed to store %s %"PRId64" dist factors for file id %d",
+		  ex_name_of_object(set_type), set_id,exoid);
+	  /* use error val from exodusII routine */
+	  ex_err("ex_put_concat_sets",errmsg,exerrval);
+	  ex_safe_free(set_stat);
+	  return (EX_FATAL);
+	}
+      }
+    } else {
+      /* unknown floating point word size */
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Error: unsupported floating point word size %d for file id %d",
+	      ex_comp_ws(exoid), exoid);
+      ex_err("ex_put_concat_sets", errmsg, exerrval);
+      ex_safe_free(set_stat);
+      return (EX_FATAL);
+    }
+  }
+  ex_safe_free(set_stat);
+  return(EX_NOERR);
+
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  ex_safe_free(set_stat);
+
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+	      "Error: failed to complete definition for file id %d",
+	      exoid);
+      ex_err("ex_put_concat_sets",errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_concat_side_sets.c b/exodus/cbind/src/ex_put_concat_side_sets.c
new file mode 100644
index 0000000..f753dd9
--- /dev/null
+++ b/exodus/cbind/src/ex_put_concat_side_sets.c
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expcss - ex_put_concat_side_sets
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     *side_set_ids           array of side set ids
+*       int     *num_elem_per_set       number of elements/sides/faces per set
+*       int     *num_dist_per_set       number of distribution factors per set
+* ----------pass in NULL for remaining args if just want to set params -------------
+*       int     *side_sets_elem_index   index array of elements into elem list
+*       int     *side_sets_dist_index   index array of df into df list
+*       int     *side_sets_elem_list    array of elements
+*       int     *side_sets_side_list    array of sides/faces
+*       void    *side_sets_dist_fact    array of distribution factors
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_set_specs, void_int, etc
+
+/*!
+ * writes the side set ID's, side set element count array,
+ * side set element pointers array, side set element list,
+ * side set side list, and distribution factors list.
+ * \param   exoid                   exodus file id
+ * \param   side_set_ids           array of side set ids
+ * \param   num_elem_per_set       number of elements/sides/faces per set
+ * \param   num_dist_per_set       number of distribution factors per set
+ * \param   side_sets_elem_index   index array of elements into elem list
+ * \param   side_sets_dist_index   index array of df into df list
+ * \param   side_sets_elem_list    array of elements
+ * \param   side_sets_side_list    array of sides/faces
+ * \param   side_sets_dist_fact    array of distribution factors
+ * \deprecated Use ex_put_concat_sets()(exoid, EX_SIDE_SET, set_specs)
+ */
+
+int ex_put_concat_side_sets (int   exoid,
+                             void_int  *side_set_ids,
+                             void_int  *num_elem_per_set,
+                             void_int  *num_dist_per_set,
+                             void_int  *side_sets_elem_index,
+                             void_int  *side_sets_dist_index,
+                             void_int  *side_sets_elem_list,
+                             void_int  *side_sets_side_list,
+                             void *side_sets_dist_fact)
+{
+  struct ex_set_specs set_specs;
+
+  set_specs.sets_ids = side_set_ids;
+  set_specs.num_entries_per_set = num_elem_per_set;
+  set_specs.num_dist_per_set = num_dist_per_set;
+  set_specs.sets_entry_index = side_sets_elem_index;
+  set_specs.sets_dist_index = side_sets_dist_index;
+  set_specs.sets_entry_list = side_sets_elem_list;
+  set_specs.sets_extra_list = side_sets_side_list;
+  set_specs.sets_dist_fact = side_sets_dist_fact;
+
+  return ex_put_concat_sets(exoid, EX_SIDE_SET, &set_specs);
+}
diff --git a/exodus/cbind/src/ex_put_concat_var_param.c b/exodus/cbind/src/ex_put_concat_var_param.c
new file mode 100644
index 0000000..318ac5d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_concat_var_param.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvp - ex_put_concat_var_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid   exodus file id
+*       int     num_g   global variable count
+*       int     num_n   nodal variable count
+*       int     num_e   element variable count
+*       int     num_elem_blk            number of element blocks (unused)
+*       int*    elem_var_tab            element variable truth table array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_all_var_param
+
+/*!
+ * writes the number of global, nodal, and element variables 
+ * that will be written to the database
+ * \param      exoid           int             exodus file id
+ * \param      num_g           int             global variable count
+ * \param      num_n           int             nodal variable count
+ * \param      num_e           int             element variable count
+ * \param      num_elem_blk    int             number of element blocks
+ * \param      elem_var_tab    int*            element variable truth table array
+ * \deprecated Use ex_put_all_var_param()(exoid, num_g, num_n, num_e, elem_var_tab, 0, 0, 0, 0)
+ */
+
+int ex_put_concat_var_param (int   exoid,
+                             int   num_g,
+                             int   num_n,
+                             int   num_e,
+                             int   num_elem_blk, /* unused */
+                             int  *elem_var_tab)
+{
+  return ex_put_all_var_param(exoid, num_g, num_n, num_e, elem_var_tab, 0, 0, 0, 0);
+}
diff --git a/exodus/cbind/src/ex_put_conn.c b/exodus/cbind/src/ex_put_conn.c
new file mode 100644
index 0000000..43b915f
--- /dev/null
+++ b/exodus/cbind/src/ex_put_conn.c
@@ -0,0 +1,244 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*! write out the connectivity array */
+#define EX_WRITE_CONN(TNAME,VARCONN,VARCONNVAL) \
+   if (ex_int64_status(exoid) & EX_BULK_INT64_API) { \
+     status = nc_put_var_longlong(exoid, VARCONN, VARCONNVAL); \
+   } else { \
+     status = nc_put_var_int(exoid, VARCONN, VARCONNVAL); \
+   } \
+   if (status != NC_NOERR) { \
+      exerrval = status; \
+      sprintf(errmsg, \
+      "Error: failed to write connectivity array for %s block %"PRId64" in file id %d", \
+                TNAME,blk_id,exoid); \
+      ex_err("ex_put_conn",errmsg, exerrval); \
+      return(EX_FATAL); \
+   }
+
+/*!
+ * writes the connectivity array for a block
+ * \param exoid           exodus file id
+ * \param blk_type        type of block
+ * \param blk_id          id of block
+ * \param node_conn       node-element connectivity
+ * \param elem_edge_conn  element-edge connectivity (NULL if none)
+ * \param elem_face_conn  element-face connectivity (NULL if none)
+ */
+
+int ex_put_conn (int   exoid,
+                 ex_entity_type blk_type,
+                 ex_entity_id   blk_id,
+                 const void_int  *node_conn,
+                 const void_int  *elem_edge_conn,
+                 const void_int  *elem_face_conn)
+{
+   int connid=-1, blk_id_ndx, status;
+   char errmsg[MAX_ERR_LENGTH];
+
+   exerrval = 0; /* clear error code */
+
+   blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+   if (exerrval != 0) {
+     if (exerrval == EX_NULLENTITY) {
+       sprintf(errmsg,
+         "Warning: connectivity array not allowed for NULL %s %"PRId64" in file id %d",
+	       ex_name_of_object(blk_type),blk_id,exoid);
+       ex_err("ex_put_conn",errmsg,EX_NULLENTITY);
+       return (EX_WARN);
+       }
+     else {
+       sprintf(errmsg,
+         "Error: failed to locate %s id %"PRId64" in id array in file id %d",
+         ex_name_of_object(blk_type),blk_id, exoid);
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return (EX_FATAL);
+       }
+     }
+
+/* inquire id's of previously defined dimensions  */
+   if (node_conn) {
+     switch (blk_type) {
+     case EX_ELEM_BLOCK:
+       status = nc_inq_varid (exoid, VAR_CONN(blk_id_ndx), &connid);
+       break;
+     case EX_FACE_BLOCK:
+       status = nc_inq_varid (exoid, VAR_FBCONN(blk_id_ndx), &connid);
+       break;
+     case EX_EDGE_BLOCK:
+       status = nc_inq_varid (exoid, VAR_EBCONN(blk_id_ndx), &connid);
+       break;
+     default:
+       exerrval = 1005;
+       sprintf(errmsg,
+	       "Internal Error: unrecognized block type in switch: %d in file id %d",
+	       blk_type,exoid);
+       ex_err("ex_putt_conn",errmsg,EX_MSG);
+       return (EX_FATAL);
+     }
+     if (status != NC_NOERR) {
+       exerrval = status;
+       sprintf(errmsg,
+	       "Error: failed to locate connectivity array for %s %"PRId64" in file id %d",
+	       ex_name_of_object(blk_type),blk_id,exoid);
+       ex_err("ex_put_conn",errmsg, exerrval);
+       return(EX_FATAL);
+     }
+     
+     EX_WRITE_CONN(ex_name_of_object(blk_type),connid,node_conn);
+   }
+
+   /* If there are edge and face connectivity arrays that belong with the element
+    * block, write them now. Warn if they are required but not specified or
+    * specified but not required.
+    */
+   if ( blk_type == EX_ELEM_BLOCK ) {
+     int nedpereldim, nfapereldim;
+     size_t num_ed_per_elem, num_fa_per_elem;
+
+     status = nc_inq_dimid (exoid, DIM_NUM_EDG_PER_EL(blk_id_ndx), &nedpereldim);
+     if (status != NC_NOERR && elem_edge_conn != 0)
+       {
+       exerrval = status;
+       sprintf(errmsg,
+         "Error: edge connectivity specified but failed to "
+         "locate number of edges/element in block %"PRId64" in file id %d",
+         blk_id,exoid);
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return(EX_FATAL);
+       }
+
+     status = nc_inq_dimid (exoid, DIM_NUM_FAC_PER_EL(blk_id_ndx), &nfapereldim);
+     if (status != NC_NOERR && elem_face_conn != 0)
+       {
+       exerrval = status;
+       sprintf(errmsg,
+         "Error: face connectivity specified but failed to "
+         "locate number of faces/element in block %"PRId64" in file id %d",
+         blk_id,exoid);
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return(EX_FATAL);
+       }
+
+     num_ed_per_elem = 0;
+     if ((elem_edge_conn != 0) &&
+	 (status = nc_inq_dimlen(exoid, nedpereldim, &num_ed_per_elem) != NC_NOERR))
+       {
+       exerrval = status;
+       sprintf(errmsg,
+         "Error: failed to get number of edges/elem in block %"PRId64" in file id %d",
+         blk_id,exoid);
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return(EX_FATAL);
+       }
+
+     num_fa_per_elem = 0;
+     if ((elem_face_conn != 0) &&
+	 (status = nc_inq_dimlen(exoid, nfapereldim, &num_fa_per_elem) != NC_NOERR))
+       {
+       exerrval = status;
+       sprintf(errmsg,
+         "Error: failed to get number of faces/elem in block %"PRId64" in file id %d",
+         blk_id,exoid);
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return(EX_FATAL);
+       }
+
+     if ( (num_ed_per_elem == 0 && elem_edge_conn != 0) ||
+          (num_ed_per_elem != 0 && elem_edge_conn == 0) )
+       {
+       exerrval = (EX_FATAL);
+       sprintf(errmsg,
+         "Error: number of edges per element (%ld) doesn't "
+         "agree with elem_edge_conn (0x%p)",
+	       (long)num_ed_per_elem, (void*)elem_edge_conn );
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return (EX_FATAL);
+       }
+
+     if ( (num_fa_per_elem == 0 && elem_face_conn != 0) ||
+          (num_fa_per_elem != 0 && elem_face_conn == 0) )
+       {
+       exerrval = (EX_FATAL);
+       sprintf(errmsg,
+         "Error: number of faces per element (%ld) doesn't "
+         "agree with elem_face_conn (0x%p)",
+	       (long)num_fa_per_elem, (void*)elem_face_conn );
+       ex_err("ex_put_conn",errmsg,exerrval);
+       return (EX_FATAL);
+       }
+
+     if ( num_ed_per_elem != 0 ) {
+       status = nc_inq_varid(exoid, VAR_ECONN(blk_id_ndx), &connid);
+       if (status != NC_NOERR)
+         {
+         exerrval = status;
+         sprintf(errmsg,
+           "Error: failed to locate connectivity array for "
+           "element edge block %"PRId64" in file id %d",
+           blk_id,exoid);
+         ex_err("ex_put_conn",errmsg, exerrval);
+         return(EX_FATAL);
+         }
+       EX_WRITE_CONN("element edge",connid,elem_edge_conn);
+     }
+
+     if ( num_fa_per_elem != 0 ) {
+       status = nc_inq_varid (exoid, VAR_FCONN(blk_id_ndx), &connid);
+       if (status != NC_NOERR)
+         {
+         exerrval = status;
+         sprintf(errmsg,
+           "Error: failed to locate connectivity array for "
+           "element face block %"PRId64" in file id %d",
+           blk_id,exoid);
+         ex_err("ex_put_conn",errmsg, exerrval);
+         return(EX_FATAL);
+         }
+       EX_WRITE_CONN("element face",connid,elem_face_conn);
+     }
+   }
+
+   return (EX_NOERR);
+
+}
diff --git a/exodus/cbind/src/ex_put_coord.c b/exodus/cbind/src/ex_put_coord.c
new file mode 100644
index 0000000..ec9830d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_coord.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expcor - ex_put_coord
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       float*  x_coord                 X coord array
+*       float*  y_coord                 y coord array
+*       float*  z_coord                 z coord array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!  
+The function ex_put_coord() writes the nodal coordinates of the nodes
+in the model. The function ex_put_init() must be invoked before this
+call is made.
+
+Because the coordinates are floating point values, the application
+code must declare the arrays passed to be the appropriate type
+(\e float or \e double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_put_coord() returns a negative 
+number; a warning will return a positive number. 
+Possible causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+
+\param[in] exoid   exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] x_coor  The X-coordinates of the nodes. If this is \c NULL, the
+	           X-coordinates will not be written.
+\param[in] y_coor  The Y-coordinates of the nodes. These are stored only if \c num_dim
+                   > 1; otherwise, pass in \c NULL. If this is \c NULL, the
+		   Y-coordinates will not be written.
+\param[in] z_coor  The Z-coordinates of the nodes. These are stored only if \c num_dim
+		   > 2; otherwise, pass in \c NULL. If this is \c NULL, the
+		   Z-coordinates will not be written.
+
+The following will write the nodal coordinates to an open 
+exodus file :
+
+\code
+int error, exoid;
+
+// \comment{if file opened with compute word size of sizeof(float)}
+float x[8], y[8], z[8];
+
+// \comment{write nodal coordinates values to database}
+x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+x[1] = 0.0; y[1] = 0.0; z[1] = 1.0;
+x[2] = 1.0; y[2] = 0.0; z[2] = 1.0;
+x[3] = 1.0; y[3] = 0.0; z[3] = 0.0;
+x[4] = 0.0; y[4] = 1.0; z[4] = 0.0;
+x[5] = 0.0; y[5] = 1.0; z[5] = 1.0;
+x[6] = 1.0; y[6] = 1.0; z[6] = 1.0;
+x[7] = 1.0; y[7] = 1.0; z[7] = 0.0;
+
+error = ex_put_coord(exoid, x, y, z);
+
+// \comment{Do the same as the previous call in three separate calls}
+error = ex_put_coord(exoid, x,    NULL, NULL);
+error = ex_put_coord(exoid, NULL, y,    NULL);
+error = ex_put_coord(exoid, NULL, NULL, z);
+\endcode
+
+ */
+
+int ex_put_coord (int   exoid,
+                  const void *x_coor,
+                  const void *y_coor,
+                  const void *z_coor)
+{
+  int status;
+  int coordid;
+  int coordidx, coordidy, coordidz;
+
+  int numnoddim, ndimdim;
+  size_t num_nod, num_dim, start[2], count[2], i;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_NODES, &numnoddim)) != NC_NOERR) {
+    /* If not found, then this file is storing 0 nodes.
+       Return immediately */
+    return (EX_NOERR);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numnoddim, &num_nod)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: inquire failed to return number of nodes in file id %d",
+	    exoid);
+    ex_err("ex_put_coord",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_DIM, &ndimdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_put_coord",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, ndimdim, &num_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_put_coord",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the coordinates  */
+  if (ex_large_model(exoid) == 0) {
+    if ((status = nc_inq_varid(exoid, VAR_COORD, &coordid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to locate nodal coordinates in file id %d", exoid);
+      ex_err("ex_put_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    } 
+
+    for (i=0; i<num_dim; i++) {
+      char *which = 0;
+      start[0] = i;
+      start[1] = 0;
+
+      count[0] = 1;
+      count[1] = num_nod;
+
+      if (i == 0 && x_coor != NULL) {
+	which = "X";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, x_coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, x_coor);
+	}
+      }	  
+      else if (i == 1 && y_coor != NULL) {
+	which = "Y";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, y_coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, y_coor);
+	}
+      }
+      else if (i == 2 && z_coor != NULL) {
+	which = "Z";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, z_coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, z_coor);
+	}
+      }
+	  
+      if (status != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to put %s coord array in file id %d", which, exoid);
+	ex_err("ex_put_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+  } else {
+    if ((status = nc_inq_varid(exoid, VAR_COORD_X, &coordidx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate x nodal coordinates in file id %d", exoid);
+      ex_err("ex_put_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (num_dim > 1) {
+      if ((status = nc_inq_varid(exoid, VAR_COORD_Y, &coordidy)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate y nodal coordinates in file id %d", exoid);
+	ex_err("ex_put_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidy = 0;
+    }
+    if (num_dim > 2) {
+      if ((status = nc_inq_varid(exoid, VAR_COORD_Z, &coordidz)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate z nodal coordinates in file id %d", exoid);
+	ex_err("ex_put_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidz = 0;
+    }
+
+    /* write out the coordinates  */
+    for (i=0; i<num_dim; i++) {
+      const void *coor = NULL;
+      char *which = NULL;
+       
+      if (i == 0) {
+	coor = x_coor;
+	which = "X";
+	coordid = coordidx;
+      } else if (i == 1) {
+	coor = y_coor;
+	which = "Y";
+	coordid = coordidy;
+      } else if (i == 2) {
+	coor = z_coor;
+	which = "Z";
+	coordid = coordidz;
+      }
+
+      if (coor != NULL && coordid != 0) {
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_var_float(exoid, coordid, coor);
+	} else {
+	  status = nc_put_var_double(exoid, coordid, coor);
+	}
+
+	if (status != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to put %s coord array in file id %d", which, exoid);
+	  ex_err("ex_put_coord",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+      }
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_coord_names.c b/exodus/cbind/src/ex_put_coord_names.c
new file mode 100644
index 0000000..164fa22
--- /dev/null
+++ b/exodus/cbind/src/ex_put_coord_names.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+
+The function ex_put_coord_names() writes the names (\p
+MAX_STR_LENGTH-characters in length) of the coordinate arrays to the
+database. Memory must be allocated for the character strings before
+this function is invoked.
+
+In case of an error, ex_put_coord_names() returns a negative number; a
+warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+
+\param[in] exoid          exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] coord_names    Array containing \c num_dim names of length \p MAX_STR_LENGTH  
+                          of the nodal coordinate arrays.
+
+The following coding will write the coordinate names to an 
+open exodus file :
+
+\code
+int error, exoid;
+
+char *coord_names[3];
+coord_names[0] = "xcoor";
+coord_names[1] = "ycoor";
+coord_names[2] = "zcoor";
+
+error = ex_put_coord_names (exoid, coord_names);
+\endcode
+
+ */
+
+int ex_put_coord_names (int   exoid,
+                        char *coord_names[])
+{
+  int status;
+  int ndimdim, varid;
+  size_t num_dim;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_DIM, &ndimdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_put_coord_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, ndimdim, &num_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: inquire failed to get number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_put_coord_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_NAME_COOR, &varid)) == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate coordinate names in file id %d",
+	    exoid);
+    ex_err("ex_put_coord_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out coordinate names */
+  status = ex_put_names_internal(exoid, varid, num_dim, coord_names, EX_COORDINATE,
+				 "", "ex_put_coord_names");
+
+  return (status);
+}
diff --git a/exodus/cbind/src/ex_put_coordinate_frames.c b/exodus/cbind/src/ex_put_coordinate_frames.c
new file mode 100644
index 0000000..8d8210c
--- /dev/null
+++ b/exodus/cbind/src/ex_put_coordinate_frames.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*!
+*
+* expfrm - ex_put_coordinate_frames: write coordinate frames
+*
+* \param exoid          exodus file id
+* \param nframes        number of coordinate frames in model
+* \param cf_ids         coordinate ids
+* \param pt_coordinates pointer to coordinates. 9 values per coordinate frame
+* \param tags           character tag for each frame. 'r' - rectangular, 'c' - cylindrical, 's' - spherical
+*
+* returns -
+*      EX_NOERR         for no error
+*      EX_FATAL         for fatal errors
+*      1                number frames < 0
+* 
+*****************************************************************************/
+
+#include <assert.h>                     // for assert
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strchr
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+/* -------------------- local defines --------------------------- */
+#define PROCNAME "ex_put_coordinate_frames"
+/* -------------------- end of local defines -------------------- */
+int ex_put_coordinate_frames( int exoid,
+			      int nframes,
+			      const void_int *cf_ids, 
+                              void* pt_coordinates,
+			      const char* tags)
+{
+  int status;
+  int dim, dim9;                   /* dimension id for nframes, nframes*9 */
+  char errmsg[MAX_ERR_LENGTH];     /* buffer for error messages      */
+  int varcoords;                   /* variable id for the coordinates */
+  int varids;                      /* variable id for the frame ids  */
+  int vartags;                     /* variable id for the frame tags */
+  int i;                           /* general indices */
+  int int_type;
+  
+  if ( exoid < 0 )
+    return exoid;
+
+  if ( nframes == 0 ) /* write nothing */
+    return (EX_NOERR);
+
+  if ( nframes<0 )
+    return 1;
+
+  assert( cf_ids!=0 );
+  assert( pt_coordinates !=0 );
+  assert( tags != 0 );
+
+  /* make the definitions */
+  /* go into define mode. define num_frames, num_frames9 */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",
+            exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_def_dim(exoid, DIM_NUM_CFRAMES, nframes, &dim)) != NC_NOERR  ||
+      (nc_def_dim(exoid, DIM_NUM_CFRAME9, nframes*9, &dim9) != NC_NOERR)) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define number of coordinate frames in file id %d",
+	    exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    goto error_ret;
+  }
+ 
+  int_type = NC_INT;
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    int_type = NC_INT64;
+  }
+
+  /* define the variables. coordinates, tags and ids */
+  if (nc_def_var (exoid, VAR_FRAME_COORDS,
+		  nc_flt_code(exoid), 1, &dim9, &varcoords) != NC_NOERR ||
+      (nc_def_var(exoid, VAR_FRAME_IDS,int_type, 1, &dim, &varids) != NC_NOERR) ||
+      (nc_def_var(exoid, VAR_FRAME_TAGS,NC_CHAR,1,&dim, &vartags) != NC_NOERR) ) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error:  failed to define coordinate frames in file id %d",
+	    exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    goto error_ret;         /* exit define mode and return */
+  }
+
+  /* leave define mode */
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete coordinate frame definition in file id %d", 
+	    exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* check variables consistency */
+  exerrval = EX_NOERR;
+  for (i=0;i<nframes;i++)
+    if ( strchr("RrCcSs",tags[i])==0 ){
+      sprintf(errmsg,"Warning: Unrecognized coordinate frame tag: '%c'.",
+	      tags[i]);
+      exerrval=2;
+      ex_err(PROCNAME,errmsg,exerrval);
+    }
+  /* could also check vectors. Leave this up to the application */
+
+  /* put the variables into the file */
+  if (nc_put_var_text(exoid, vartags, tags) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed writing frame data in file id %d",exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varids, cf_ids);
+  } else {
+    status = nc_put_var_int(exoid, varids, cf_ids);
+  }
+  
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed writing frame data in file id %d",exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_var_float(exoid, varcoords, pt_coordinates);
+  } else {
+    status = nc_put_var_double(exoid, varcoords, pt_coordinates);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed writing frame data in file id %d",exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+ 
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete frame definition for file id %d",
+	    exoid);
+    ex_err(PROCNAME,errmsg,exerrval);
+  }
+  return (EX_FATAL);
+
+
+}
+
+
diff --git a/exodus/cbind/src/ex_put_eb_info_global.c b/exodus/cbind/src/ex_put_eb_info_global.c
new file mode 100644
index 0000000..5e21ec6
--- /dev/null
+++ b/exodus/cbind/src/ex_put_eb_info_global.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_eb_info_global()
+ *****************************************************************************
+ * This function outputs the global element block IDs of all the element
+ * blocks associated with a geometry.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      el_blk_ids      - Pointer to vector of global element block IDs.
+ *      el_blk_cnts     - Pointer to vector of global element block counts.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stdio.h>
+
+#include <netcdf.h>
+
+#include <exodusII.h>
+#include <exodusII_int.h>
+
+int ex_put_eb_info_global(int exoid,
+                          void_int *el_blk_ids,
+                          void_int *el_blk_cnts
+                          )
+{
+  const char   *func_name="ex_put_eb_info_global";
+
+  int     varid, status;
+  char    errmsg[MAX_ERR_LENGTH];
+
+  /* Find the variable ID for the element block IDs */
+  if ((status = nc_inq_varid(exoid, VAR_ELBLK_IDS_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_ELBLK_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the global element block IDs */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, el_blk_ids);
+  } else {
+    status = nc_put_var_int(exoid, varid, el_blk_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" in file ID %d",
+            VAR_ELBLK_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Find the variable ID for the element block counts */
+  if ((status = nc_inq_varid(exoid, VAR_ELBLK_CNT_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_ELBLK_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the global element block counts */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, el_blk_cnts);
+  } else {
+    status = nc_put_var_int(exoid, varid, el_blk_cnts);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" in file ID %d",
+            VAR_ELBLK_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_elem_attr.c b/exodus/cbind/src/ex_put_elem_attr.c
new file mode 100644
index 0000000..5e8bcba
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_attr.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_put_attr()(exoid, EX_ELEM_BLOCK, elem_blk_id, attrib)
+
+The function ex_put_elem_attr() writes the attributes for an element
+block. Each element in the element block must have the same number of
+attributes, so there are(\c num_attr x \c num_elem_this_blk)
+attributes for each element block. The function ex_put_elem_block()
+must be invoked before this call is made.
+
+Because the attributes are floating point values, the application code
+must declare the array passed to be the appropriate type (\c float or
+\c double) to match the compute word size passed in ex_create() or
+ex_open().
+
+\return In case of an error, ex_put_elem_attr() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  ex_put_elem_block() was not called previously for specified element block ID.
+  -  ex_put_elem_block() was called with 0 attributes specified.
+
+\param[in]  exoid       exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] elem_blk_id  The element block ID.
+\param[in] attrib       Size [num_elem_this_blk*num_attr]
+                        The list of attributes for the element block. The \c num_attr
+                        index cycles faster.
+
+Refer to the code example in ex_put_elem_block() for an example of
+writing the attributes array for an element block.
+
+*/
+
+int ex_put_elem_attr (int   exoid,
+                      ex_entity_id   elem_blk_id,
+                      const void *attrib)
+{
+  return ex_put_attr( exoid, EX_ELEM_BLOCK, elem_blk_id, attrib );
+}
diff --git a/exodus/cbind/src/ex_put_elem_attr_names.c b/exodus/cbind/src/ex_put_elem_attr_names.c
new file mode 100644
index 0000000..5afe995
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_attr_names.c
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expeat - ex_put_elem_attr_names
+*
+* entry conditions - 
+*   input parameters:
+*       int           exoid             exodus file id
+*       int           elem_blk_id       element block id
+*       char*         names[]           ptr array of attribute names
+
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_attr_names, etc
+
+/*!
+ * writes the attribute names for an element block
+ * \param    exoid             exodus file id
+ * \param    elem_blk_id       element block id
+ * \param    names[]           ptr array of attribute names
+ * \deprecated Use ex_put_attr_names()(exoid, EX_ELEM_BLOCK, elem_blk_id, names)
+ */
+int ex_put_elem_attr_names(int   exoid,
+			   ex_entity_id   elem_blk_id,
+			   char* names[])
+{
+  return ex_put_attr_names( exoid, EX_ELEM_BLOCK, elem_blk_id, names );
+}
diff --git a/exodus/cbind/src/ex_put_elem_block.c b/exodus/cbind/src/ex_put_elem_block.c
new file mode 100644
index 0000000..41fbd19
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_block.c
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expelb - ex_put_elem_block: write element block parameters
+*
+* entry conditions - 
+*   input parameters:
+*       int     idexo                   exodus file id
+*       int     elem_blk_id             block identifier
+*       char*   elem_type               element type string
+*       int     num_elem_this_blk       number of elements in the element blk
+*       int     num_nodes_per_elem      number of nodes per element block
+*       int     num_attr_per_elem       number of attributes per element
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_block, ex_entity_id, etc
+
+/*!
+\deprecated Use ex_put_block()(exoid, EX_ELEM_BLOCK, elem_blk_id, elem_type, num_elem_this_blk, num_nodes_per_elem, 0, 0, num_attr_per_elem)
+
+The function ex_put_elem_block() writes the parameters used to
+describe an element block.
+
+\return In case of an error, ex_put_elem_block() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  an element block with the same ID has already been specified.
+  -  the number of element blocks specified in the call to ex_put_init() has been exceeded.
+
+\param[in] exoid              exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] elem_blk_id        The element block ID.
+\param[in] elem_type         The type of elements in the element block. The maximum length of this
+                              string is \p MAX_STR_LENGTH .
+\param[in] num_elem_this_blk  The number of elements in the element block.
+\param[in] num_nodes_per_elem The number of nodes per element in the element block.
+\param[in] num_attr_per_elem  The number of attributes per element in the element block.
+
+For example, the following code segment will initialize an element
+block with an ID of 10, write out the connectivity array, and write
+out the element attributes array:
+
+\code
+int id, error, exoid, num_elem_in_blk, num_nodes_per_elem, *connect, num_attr;
+float *attrib;
+
+\comment{write element block parameters}
+id = 10;
+num_elem_in_blk = 2;
+num_nodes_per_elem = 4;   \comment{elements are 4-node shells}
+num_attr = 1;             \comment{one attribute per element}
+
+error = ex_put_elem_block(exoid, id, "SHELL", num_elem_in_blk, 
+                          num_nodes_per_elem, num_attr);
+
+\comment{write element connectivity}
+connect = (int *)calloc(num_elem_in_blk*num_nodes_per_elem, sizeof(int));
+
+\comment{fill connect with node numbers; nodes for first elemen}
+connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+\comment{nodes for second element}
+connect[4] = 5; connect[5] = 6; connect[6] = 7; connect[7] = 8;
+
+error = ex_put_elem_conn (exoid, id, connect);
+
+\comment{write element block attributes}
+attrib = (float *) calloc (num_attr*num_elem_in_blk, sizeof(float));
+
+for (i=0, cnt=0; i < num_elem_in_blk; i++) {
+   for (j=0; j < num_attr; j++, cnt++) {
+      attrib[cnt] = 1.0;
+   }
+}
+
+error = ex_put_elem_attr (exoid, id, attrib);
+
+\comment{Same result using non-deprecated code}
+error = ex_put_block(exoid, EX_ELEM_BLOCK, id, "SHELL", num_elem_in_blk, 
+                          num_nodes_per_elem, 0, 0, num_attr);
+error = ex_put_conn (exoid, EX_ELEM_BLOCK, id, connect);
+error = ex_put_attr (exoid, EX_ELEM_BLOCK, id, attrib);
+
+\endcode
+
+ */
+
+int ex_put_elem_block (int   exoid,
+                       ex_entity_id   elem_blk_id,
+                       const char *elem_type,
+                       int64_t num_elem_this_blk,
+                       int64_t num_nodes_per_elem,
+                       int64_t num_attr_per_elem)
+{
+  return ex_put_block( exoid, EX_ELEM_BLOCK, elem_blk_id,
+    elem_type, num_elem_this_blk, num_nodes_per_elem,
+    0 /*num_edge_per_elem*/, 0 /*num_face_per_elem*/, num_attr_per_elem );
+}
diff --git a/exodus/cbind/src/ex_put_elem_cmap.c b/exodus/cbind/src/ex_put_elem_cmap.c
new file mode 100644
index 0000000..95e7df3
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_cmap.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/****************************************************************************/
+/****************************************************************************/
+/****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_elem_cmap()
+ ****************************************************************************
+ * The function outputs an elemental communication map.
+ ****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      map_id          - The ID of the elementa communication map to write.
+ *      elem_ids        - Pointer to vector of element IDs to output.
+ *      side_ids        - Pointer to vector of side IDs for each element
+ *                        in "elem_ids".
+ *      proc_ids        - Pointer to vector of processor IDs for each
+ *                        element in "elem_ids".
+ *      processor       - The processor the file being read was written for.
+ */
+/****************************************************************************/
+/****************************************************************************/
+/****************************************************************************/
+
+#include <exodusII.h>                   // for ex_err, exerrval, etc
+#include <exodusII_int.h>               // for EX_FATAL, DIM_ECNT_CMAP, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_elem_cmap(int  exoid,
+                     ex_entity_id  map_id,
+                     void_int *elem_ids,
+                     void_int *side_ids,
+                     void_int *proc_ids,
+                     int  processor
+                     )
+{
+  const char   *func_name="ex_put_elem_cmap";
+
+  int     map_idx, varid, dimid, status;
+  size_t  start[1], count[1], ret_val;
+  int64_t varidx[2];
+  int     value;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* get the index for the comm map information variables */
+  if (ex_get_idx(exoid, VAR_E_COMM_INFO_IDX, varidx, processor) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_E_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the index for this map_id */
+  if ((map_idx=ne_id_lkup(exoid, VAR_E_COMM_IDS, varidx, map_id)) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index for variable \"%s\" in file ID %d",
+            VAR_E_COMM_IDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /*
+   * Find out if this is a NULL comm map by checking it's entry in
+   * the status vector.
+   */
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  start[0] = map_idx;
+  if ((status = nc_get_var1_int(exoid, varid, start, &value)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_E_COMM_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (value == 0) return(EX_NOERR);   /* NULL set */
+
+  /* now I need to get the comm map data index */
+  if (ex_get_idx(exoid, VAR_E_COMM_DATA_IDX, varidx, map_idx) == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_E_COMM_DATA_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* check if I need to get the dimension of the cmap data */
+  if (varidx[1] == -1) {
+    /* Get the size of the comm maps */
+    if ((status = nc_inq_dimid(exoid, DIM_ECNT_CMAP, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get dimension ID for \"%s\" in file ID %d",
+              DIM_ECNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_inq_dimlen(exoid, dimid, &ret_val)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get length of dimension \"%s\" in file ID %d",
+              DIM_ECNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    varidx[1] = ret_val;
+  } /* "if (varidx[1]==-1)" */
+
+  start[0] = varidx[0];
+  count[0] = varidx[1] - varidx[0];
+
+  /* Output the element IDs for this comm map */
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_EIDS, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_EIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, varid, start, count, elem_ids);
+  } else {
+    status = nc_put_vara_int(exoid, varid, start, count, elem_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output vector \"%s\" in file ID %d",
+            VAR_E_COMM_EIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Output the processor IDs for this map */
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_PROC, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, varid, start, count, proc_ids);
+  } else {
+    status = nc_put_vara_int(exoid, varid, start, count, proc_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" in file ID %d",
+            VAR_E_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_E_COMM_SIDS, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_E_COMM_SIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, varid, start, count, side_ids);
+  } else {
+    status = nc_put_vara_int(exoid, varid, start, count, side_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to ouput variable \"%s\" in file ID %d",
+            VAR_E_COMM_SIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_elem_conn.c b/exodus/cbind/src/ex_put_elem_conn.c
new file mode 100644
index 0000000..ca77f1e
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_conn.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_put_conn()(exoid, EX_ELEM_BLOCK, elem_blk_id, connect, 0, 0)
+
+The function ex_put_elem_conn() writes the connectivity array for an
+element block. The function ex_put_elem_block() must be invoked before
+this call is made.
+
+\return In case of an error, ex_put_elem_conn() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  ex_put_elem_block() was not called previously.
+
+
+\param[in] exoid        exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] elem_blk_id  The element block ID.
+\param[in] connect      Size [num_elem_this_blk,num_nodes_per_elem],
+                        The connectivity array; a list of nodes (internal node IDs; 
+                        See Section LocalNodeIds) that define each element in the element
+                        block. The node index cycles faster than the element index.
+
+Refer to the code example in ex_put_elem_block() for an example of
+writing the connectivity array for an element block.
+
+*/
+
+int ex_put_elem_conn (int   exoid,
+                      ex_entity_id elem_blk_id,
+                      const void_int  *connect)
+{
+  return ex_put_conn(exoid, EX_ELEM_BLOCK, elem_blk_id, connect, 0, 0);
+}
diff --git a/exodus/cbind/src/ex_put_elem_map.c b/exodus/cbind/src/ex_put_elem_map.c
new file mode 100644
index 0000000..e160d25
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_map.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expem - ex_put_elem_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  element map id
+*       int     *elem_map               element map
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_num_map, etc
+
+/*!
+ * writes an element map; this is a vector of integers of length number
+ * of elements
+ * \param  exoid                   exodus file id
+ * \param  map_id                  element map id
+ * \param  elem_map                element map
+ * \deprecated Use ex_put_num_map()(exoid, EX_ELEM_MAP, map_id, elem_map)
+ */
+
+int ex_put_elem_map (int exoid,
+                     ex_entity_id map_id,
+                     const void_int *elem_map)
+{
+  return ex_put_num_map( exoid, EX_ELEM_MAP, map_id, elem_map );
+}
diff --git a/exodus/cbind/src/ex_put_elem_num_map.c b/exodus/cbind/src/ex_put_elem_num_map.c
new file mode 100644
index 0000000..13f32ce
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_num_map.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_put_id_map()(exoid, EX_ELEM_MAP, elem_map)
+
+The function ex_put_elem_num_map() writes out the optional element
+number map to the database. See Section LocalElementIds for a description
+of the element number map. The function ex_put_init() must be invoked
+before this call is made.
+
+\return In case of an error, ex_put_elem_num_map() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  an element number map already exists in the file.
+
+\param[in] exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] elem_map  The element number map.
+
+The following code generates a default element number map and outputs
+it to an open exodus file. This is a trivial case and included just
+for illustration. Since this map is optional, it should be written out
+only if it contains something other than the default map.
+
+\code
+int error, exoid;
+int *elem_map = (int *)calloc(num_elem, sizeof(int));
+
+for (i=1; i <= num_elem; i++)
+   elem_map[i-1] = i;
+
+error = ex_put_elem_num_map(exoid, elem_map);
+
+\comment{Equivalent using non-deprecated function}
+error = ex_put_id_map(exoid, EX_ELEM_MAP, elem_map);
+\endcode
+
+ */
+
+int ex_put_elem_num_map (int  exoid,
+                         const void_int *elem_map)
+{
+  return ex_put_id_map(exoid, EX_ELEM_MAP, elem_map);
+}
+
diff --git a/exodus/cbind/src/ex_put_elem_var.c b/exodus/cbind/src/ex_put_elem_var.c
new file mode 100644
index 0000000..1819c1c
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_var.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expev - ex_put_elem_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     elem_var_index          element variable index
+*       int     elem_blk_id             element block id
+*       int     num_elem_this_blk       number of elements in this block
+*
+* exit conditions -
+*
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_var, ex_entity_id, etc
+
+/*!
+\deprecated Use ex_put_var()(exoid, time_step, EX_ELEM_BLOCK, elem_var_index, elem_blk_id, num_elem_this_blk, elem_var_vals)
+
+The function ex_put_elem_var() writes the values of a single element
+variable for one element block at one time step. It is recommended,
+but not required, to write the element variable truth table (with
+ex_put_elem_var_tab() before this function is invoked for better
+efficiency. See #Efficiency for a discussion of
+efficiency issues.
+
+Because element variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_put_elem_var() returns a negative number; a
+warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  invalid element block ID.
+  -  ex_put_elem_block() not called previously to specify parameters for this element block.
+  -  ex_put_variable_param() not called previously specifying the number of element variables.
+  - an element variable truth table was stored in the file but
+    contains a zero (indicating no valid element variable) for the
+    specified element block and element variable.
+
+\param[in] exoid           exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] time_step       The time step number, as described under ex_put_time(). 
+                           This is essentially a counter that is incremented only when results 
+			   variables are output. The first time step is 1.
+\param[in] elem_var_index  The index of the element variable. The first variable has 
+                           an index of 1.
+\param[in] elem_blk_id     The element block ID.
+\param[in] num_elem_this_blk  The number of elements in the given element block.
+\param[in]  elem_var_vals  Array of \c num_elem_this_blk values of the \c elem_var_index-th 
+                           element variable for the element block with ID of \c elem_blk_id 
+			   at the \c time_step-th time step.
+
+The following coding will write out all of the element variables for a
+single time step \c n to an open exodus file :
+
+\code
+int num_ele_vars, num_elem_blk, *num_elem_in_block,error, 
+    exoid, n, *ebids;
+
+float *elem_var_vals;
+
+\comment{write element variables}
+for (k=1; k <= num_ele_vars; k++) {
+   for (j=0; j < num_elem_blk; j++) {
+      elem_var_vals = (float *)
+         calloc(num_elem_in_block[j], sizeof(float));
+
+         for (m=0; m < num_elem_in_block[j]; m++) {
+            \comment{simulation code fills this in}
+            elem_var_vals[m] = 10.0; 
+         }
+
+      error = ex_put_elem_var (exoid, n, k, ebids[j],
+                               num_elem_in_block[j], elem_var_vals);
+
+\comment {Using non-deprecated function:}
+      error = ex_put_var (exoid, n, EX_ELEM_BLOCK, k, ebids[j],
+                               num_elem_in_block[j], elem_var_vals);
+
+      free (elem_var_vals);
+   }
+}
+\endcode
+
+ */
+
+int ex_put_elem_var (int   exoid,
+                     int   time_step,
+                     int   elem_var_index,
+                     ex_entity_id   elem_blk_id,
+                     int64_t num_elem_this_blk,
+                     const void *elem_var_vals)
+{
+  return ex_put_var(exoid, time_step, EX_ELEM_BLOCK, elem_var_index,
+		    elem_blk_id, num_elem_this_blk, elem_var_vals);
+}
diff --git a/exodus/cbind/src/ex_put_elem_var_slab.c b/exodus/cbind/src/ex_put_elem_var_slab.c
new file mode 100644
index 0000000..4f68120
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_var_slab.c
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_elem_var_slab()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      time_step          - The time step to write this data to.
+ *      elem_var_index     - The index of this elemental variable.
+ *      elem_blk_id        - The ID of the element block being written to.
+ *      start_pos          - The start point for outputting data. The
+ *                           first value is 0.
+ *      num_vals           - The number of values to be output.
+ *      elem_var_vals      - Pointer to the vector of values to be output.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, VAR_ELEM_VAR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the values of a single element variable for one element block,
+ * starting at start_pos, at one time step to the database; assume the
+ * first time step and element variable index are 1
+ */
+
+int ex_put_elem_var_slab (int   exoid,
+		          int   time_step,
+		          int   elem_var_index,
+		          ex_entity_id   elem_blk_id,
+                          int64_t   start_pos,
+		          int64_t   num_vals,
+		          void *elem_var_vals)
+{
+  int status;
+  int varid, dimid,time_dim, numelbdim, dims[2], elem_blk_id_ndx;
+  size_t num_elem_blk, num_elem_var, start[2], count[2];
+  int *elem_var_tab;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of elem_blk_id in VAR_ID_EL_BLK array */
+  if ((elem_blk_id_ndx = ex_id_lkup(exoid, EX_ELEM_BLOCK, elem_blk_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: no variables allowed for NULL block %"PRId64" in file id %d",
+	      elem_blk_id, exoid);
+      ex_err("ex_put_elem_var_slab", errmsg, EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate element block id %"PRId64" in %s array in file id %d",
+	      elem_blk_id, VAR_ID_EL_BLK, exoid);
+      ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ((status = nc_inq_varid (exoid,
+			      VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx), &varid)) != NC_NOERR) {
+    if (status == NC_ENOTVAR) { /* variable doesn't exist, create it! */
+
+      /*    inquire previously defined dimensions */
+
+      /* check for the existance of an element variable truth table */
+      if ((status = nc_inq_varid (exoid, VAR_ELEM_TAB, &varid)) == NC_NOERR) {
+	/* find out number of element blocks and element variables */
+	if ((status = nc_inq_dimid (exoid, DIM_NUM_EL_BLK, &dimid)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to locate number of element blocks in file id %d",
+		  exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	if ((status = nc_inq_dimlen(exoid, dimid, &num_elem_blk)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get number of element blocks in file id %d",
+		  exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	if ((status = nc_inq_dimid (exoid, DIM_NUM_ELE_VAR, &dimid)) != NC_NOERR) {
+	  exerrval = EX_BADPARAM;
+	  sprintf(errmsg,
+		  "Error: no element variables stored in file id %d",
+		  exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	if ((status = nc_inq_dimlen(exoid, dimid, &num_elem_var)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get number of element variables in file id %d",
+		  exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	if (!(elem_var_tab =
+	      (int *)malloc(num_elem_blk*num_elem_var*sizeof(int)))) {
+	  exerrval = EX_MEMFAIL;
+	  sprintf(errmsg,
+		  "Error: failed to allocate memory for element variable truth table in file id %d",
+		  exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	/*   read in the element variable truth table */
+	if ((status = nc_get_var_int(exoid, varid, elem_var_tab)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get truth table from file id %d", exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+
+	if (elem_var_tab[num_elem_var*(elem_blk_id_ndx-1)+elem_var_index-1] == 0L) {
+	  free(elem_var_tab);
+	  exerrval = EX_BADPARAM;
+	  sprintf(errmsg,
+		  "Error: Invalid element variable %d, block %"PRId64" in file id %d",
+		  elem_var_index, elem_blk_id, exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	  return (EX_FATAL);
+	}
+	free(elem_var_tab);
+      }
+
+      if ((status = nc_inq_dimid (exoid, DIM_TIME, &time_dim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate time dimension in file id %d", exoid);
+	ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	goto error_ret;		/* exit define mode and return */
+      }
+
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_EL_IN_BLK(elem_blk_id_ndx), &numelbdim)) != NC_NOERR) {
+	if (status == NC_EBADDIM) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: number of elements in element block %"PRId64" not defined in file id %d",
+		  elem_blk_id, exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	} else {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to locate number of elements in element block %"PRId64" in file id %d",
+		  elem_blk_id, exoid);
+	  ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	}
+	goto error_ret;
+      }
+
+      /*    variable doesn't exist so put file into define mode  */
+      if ((status = nc_redef (exoid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to put file id %d into define mode", exoid);
+	ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	return (EX_FATAL);
+      }
+
+
+      /*    define netCDF variable to store element variable values */
+      dims[0] = time_dim;
+      dims[1] = numelbdim;
+      if ((status = nc_def_var(exoid, VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx),
+			       nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define element variable %d in file id %d",
+		elem_var_index, exoid);
+	ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	goto error_ret;
+      }
+      ex_compress_variable(exoid, varid, 2);
+
+
+      /*    leave define mode  */
+      if ((status = nc_enddef(exoid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to complete element variable %s definition to file id %d",
+		VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx), exoid);
+	ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate element variable %s in file id %d",
+	      VAR_ELEM_VAR(elem_var_index, elem_blk_id_ndx),exoid);
+      ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* store element variable values */
+  start[0] = --time_step;
+  start[1] = --start_pos;
+
+  count[0] = 1;
+  count[1] = num_vals;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, varid, start, count, elem_var_vals);
+  } else {
+    status = nc_put_vara_double(exoid, varid, start, count, elem_var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store element variable %d in file id %d", 
+	    elem_var_index, exoid);
+    ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+	      "Error: failed to complete definition for file id %d", exoid);
+      ex_err("ex_put_elem_var_slab", errmsg, exerrval);
+    }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_elem_var_tab.c b/exodus/cbind/src/ex_put_elem_var_tab.c
new file mode 100644
index 0000000..d2ee52a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_elem_var_tab.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvtt - ex_put_elem_var_tab
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_elem_blk            number of element blocks
+*       int     num_elem_var            number of element variables
+*       int*    elem_var_tab            element variable truth table array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_truth_table, etc
+
+/*!
+\deprecated Use ex_put_truth_table()(exoid, EX_ELEM_BLOCK, num_elem_blk, num_elem_var, elem_var_tab)
+
+The function ex_put_elem_var_tab() writes the exodus element variable
+truth table to the database. The element variable truth table
+indicates whether a particular element result is written for the
+elements in a particular element block. A 0 (zero) entry indicates
+that no results will be output for that element variable for that
+element block. A non-zero entry indicates that the appropriate results
+will be output.
+
+Although writing the element variable truth table is optional, it is
+encouraged because it creates at one time all the necessary
+\code{NetCDF} variables in which to hold the exodus element variable
+values. This results in significant time savings. See
+Section #Efficiency for a discussion of efficiency issues.
+
+The function ex_put_variable_param() must be called before this
+routine in order to define the number of element variables.
+
+\return In case of an error, ex_put_elem_var_tab() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  the specified number of element blocks is different than the
+     number specified in a call to ex_put_init().
+  -  ex_put_elem_block() not called previously to specify
+     element block parameters.
+  -  ex_put_variable_param() not called previously to specify
+     the number of element variables or was called but with a different
+     number of element variables.
+  -  ex_put_elem_var() previously called.
+
+\param[in]  exoid          exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  num_elem_blk   The number of element blocks.
+\param[in]  num_elem_var   The number of element variables.
+\param[in]  elem_var_tab   Size [num_elem_blk,num_elem_var]. A 2-dimensional array
+                           (with the \c num_elem_var index cycling faster)
+			   containing the element variable truth table.
+
+The following coding will create, populate, and write an element
+variable truth table to an opened exodus file (NOTE: all element
+variables are valid for all element blocks in this example.):
+
+\code
+int *truth_tab, num_elem_blk, num_ele_vars, error, exoid;
+
+\comment{write element variable truth table}
+truth_tab = (int *)calloc((num_elem_blk*num_ele_vars), sizeof(int));
+
+for (i=0, k=0; i < num_elem_blk; i++) {
+   for (j=0; j < num_ele_vars; j++) {
+      truth_tab[k++] = 1;
+   }
+}
+error = ex_put_elem_var_tab(exoid, num_elem_blk, num_ele_vars, 
+                            truth_tab);
+\endcode
+
+*/
+
+int ex_put_elem_var_tab (int  exoid,
+                         int  num_elem_blk,
+                         int  num_elem_var,
+                         int *elem_var_tab)
+{
+  return ex_put_truth_table(exoid, EX_ELEM_BLOCK, num_elem_blk, num_elem_var, elem_var_tab);
+}
diff --git a/exodus/cbind/src/ex_put_entity_count_per_polyhedra.c b/exodus/cbind/src/ex_put_entity_count_per_polyhedra.c
new file mode 100644
index 0000000..28891eb
--- /dev/null
+++ b/exodus/cbind/src/ex_put_entity_count_per_polyhedra.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expecpp - ex_put_entity_count_per_polyhedra
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+ * writes out the number of entities (nodes/faces) per polyhedra
+ * (nsided/nfaced) in this element block to the database.
+ * \param  exoid                exodus file id
+ * \param  blk_type             type of block (face, or element)
+ * \param  blk_id               block identifer
+ * \param  entity_counts        entity_per_polyhedra count array
+ */
+
+int ex_put_entity_count_per_polyhedra (int            exoid,
+				       ex_entity_type blk_type,
+				       ex_entity_id   blk_id,
+				       const int     *entity_counts)
+{
+  int npeid=-1, blk_id_ndx, status;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+  if (exerrval != 0) 
+    {
+      if (exerrval == EX_NULLENTITY)
+	{
+	  sprintf(errmsg,
+		  "Warning: entity_counts array not allowed for NULL %s block %"PRId64" in file id %d",
+		  ex_name_of_object(blk_type),blk_id,exoid);
+	  ex_err("ex_put_entity_count_per_polyhedra",errmsg,EX_NULLENTITY);
+	  return (EX_WARN);
+	}
+      else
+	{
+	  sprintf(errmsg,
+		  "Error: failed to locate %s block id %"PRId64" in id array in file id %d",
+		  ex_name_of_object(blk_type),blk_id, exoid);
+	  ex_err("ex_put_entity_count_per_polyhedra",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+    }
+
+  /* inquire id's of previously defined dimensions  */
+  switch (blk_type) {
+  case EX_ELEM_BLOCK:
+    status = nc_inq_varid (exoid, VAR_EBEPEC(blk_id_ndx), &npeid);
+    break;
+  case EX_FACE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_FBEPEC(blk_id_ndx), &npeid);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized block type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_put_entity_count_per_polyhedra",errmsg,EX_MSG);
+    return (EX_FATAL);
+  }
+  if (status != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate entity_counts array for %s block %"PRId64" in file id %d",
+	      ex_name_of_object(blk_type),blk_id,exoid);
+      ex_err("ex_put_entity_count_per_polyhedra",errmsg, exerrval);
+      return(EX_FATAL);
+    }
+
+  status = nc_put_var_int(exoid, npeid, entity_counts); 
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to write node counts array for %s block %"PRId64" in file id %d",
+	    ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_entity_count_per_polyhedra",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_glob_vars.c b/exodus/cbind/src/ex_put_glob_vars.c
new file mode 100644
index 0000000..37b0670
--- /dev/null
+++ b/exodus/cbind/src/ex_put_glob_vars.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expgv - ex_put_glo_vars
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     num_glob_vars           number of global vars in file
+*       float*  glob_var_vals           array of global variable values
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_var, etc
+
+/*!
+\deprecated Use ex_put_var()(exoid, time_step, EX_GLOBAL, 1, 0, num_glob_vars, glob_var_vals)
+
+The function ex_put_glob_vars() writes the values of all the global
+variables for a single time step. The function ex_put_variable_param()
+must be invoked before this call is made.
+
+Because global variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_put_glob_vars() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  ex_put_variable_param() not called previously specifying
+     the number of global variables.
+
+
+\param[in] exoid           exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] time_step       The time step number, as described under ex_put_time(). 
+                           This is essentially a counter that is incremented when results 
+			   variables are output. The first time step is 1.
+\param[in] num_glob_vars   The number of global variables to be written to the database.
+\param[in]  glob_var_vals  Array of \c num_glob_vars global variable values for 
+                           the \c time_step-th time step.
+
+
+As an example, the following coding will write the values of all the
+global variables at one time step to an open exodus II file:
+
+\code
+int num_glo_vars, error, exoid, time_step;
+
+float *glob_var_vals
+
+\comment{write global variables}
+for (j=0; j < num_glo_vars; j++) {
+   \comment{application code fills this array}
+   glob_var_vals[j] = 10.0;
+}
+error = ex_put_glob_vars (exoid, time_step, num_glo_vars, glob_var_vals);
+
+\comment{Using non-deprecated functions:}
+error = ex_put_var (exoid, time_step, EX_GLOBAL, 1, 0, num_glo_vars, glob_var_vals);
+
+\endcode
+
+*/
+
+int ex_put_glob_vars (int   exoid,
+                      int   time_step,
+                      int   num_glob_vars,
+                const void *glob_var_vals)
+{
+  return ex_put_var( exoid, time_step, EX_GLOBAL, 1, 0 /*N/A*/, num_glob_vars, glob_var_vals );
+}
diff --git a/exodus/cbind/src/ex_put_id_map.c b/exodus/cbind/src/ex_put_id_map.c
new file mode 100644
index 0000000..9d2a14b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_id_map.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2007 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expenm - ex_put_id_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       ex_entity_type obj_type
+*       int*    elem_map                element numbering map array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_enddef, etc
+
+/*!
+ * writes out the entity numbering map to the database; this allows
+ * the entity numbers to be non-contiguous.  This map is used for
+ * mapping between local and global entity ids.
+ * \param    exoid                   exodus file id
+ * \param    map_type
+ * \param    map                element numbering map array
+ */
+
+int ex_put_id_map (int  exoid,
+		   ex_entity_type map_type,
+		   const void_int *map)
+{
+  int dimid, mapid, status, dims[1];
+  int map_int_type;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* tname;
+  const char* dnumentries;
+  const char* vmap;
+
+  exerrval = 0; /* clear error code */
+
+  switch ( map_type ) {
+  case EX_NODE_MAP:
+    tname = "node";
+    dnumentries = DIM_NUM_NODES;
+    vmap = VAR_NODE_NUM_MAP;
+    break;
+  case EX_EDGE_MAP:
+    tname = "edge";
+    dnumentries = DIM_NUM_EDGE;
+    vmap = VAR_EDGE_NUM_MAP;
+    break;
+  case EX_FACE_MAP:
+    tname = "face";
+    dnumentries = DIM_NUM_FACE;
+    vmap = VAR_FACE_NUM_MAP;
+    break;
+  case EX_ELEM_MAP:
+    tname = "element";
+    dnumentries = DIM_NUM_ELEM;
+    vmap = VAR_ELEM_NUM_MAP;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg,
+	     "Error: Bad map type (%d) specified for file id %d",
+	     map_type, exoid );
+    ex_err( "ex_put_id_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  /* Make sure the file contains entries */
+  if (nc_inq_dimid (exoid, dnumentries, &dimid) != NC_NOERR) {
+    return (EX_NOERR);
+  }
+   
+  /* put netcdf file into define mode  */
+  if (nc_inq_varid (exoid, vmap, &mapid) != NC_NOERR) {
+    if ((status = nc_redef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to put file id %d into define mode",
+	      exoid);
+      ex_err("ex_put_id_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    
+
+    /* create a variable array in which to store the id map  */
+    dims[0] = dimid;
+    
+    /* Check type to be used for maps... */
+    map_int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+      map_int_type = NC_INT64;
+    }
+    
+    if ((status = nc_def_var(exoid, vmap, map_int_type, 1, dims, &mapid)) != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: %s numbering map already exists in file id %d",
+		tname, exoid);
+	ex_err("ex_put_id_map",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to create %s id map in file id %d",
+		tname, exoid);
+	ex_err("ex_put_id_map",errmsg,exerrval);
+      }
+      goto error_ret;         /* exit define mode and return */
+    }
+    ex_compress_variable(exoid, mapid, 1);
+    
+
+    /* leave define mode  */
+    if ((status = nc_enddef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to complete definition in file id %d",
+	      exoid);
+      ex_err("ex_put_id_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* write out the entity numbering map  */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_put_var_longlong(exoid, mapid, map);
+  } else {
+    status = nc_put_var_int(exoid, mapid, map);
+  }
+
+  if (status!= NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store %s numbering map in file id %d",
+	    tname, exoid);
+    ex_err("ex_put_id_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+              "Error: failed to complete definition for file id %d",
+              exoid);
+      ex_err("ex_put_id_map",errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_info.c b/exodus/cbind/src/ex_put_info.c
new file mode 100644
index 0000000..f1416ef
--- /dev/null
+++ b/exodus/cbind/src/ex_put_info.c
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strlen, NULL
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_INFO, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_enddef, etc
+
+/*!
+The function ex_put_info() writes information records to the
+database. The records are \c MAX_LINE_LENGTH-character strings.
+
+In case of an error, ex_put_info() returns a negative number;
+a warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  information records already exist in file.
+
+\param[in] exoid       exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] num_info    The number of information records.
+\param[in] info        Array containing the information records. To only
+                       define the number of info records instead of
+                       defining and outputting, pass NULL for
+		       info argument.
+
+
+The following code will write out three information records 
+to an open exodus file -
+
+\code
+int error, exoid, num_info;
+char *info[3];
+
+\comment{write information records}
+num_info = 3;
+
+info[0] = "This is the first information record.";
+info[1] = "This is the second information record.";
+info[2] = "This is the third information record.";
+
+error = ex_put_info(exoid, num_info, info);
+\endcode
+
+The following code will first tell the database that there are three
+information records, and then later actually output those records.
+
+\code
+int error, exoid, num_info;
+char *info[3];
+
+\comment{Define the number of information records that will be written
+later.}
+num_info = 3;
+
+error = ex_put_info(exoid, num_info, NULL);
+
+
+\comment{Now, actually write the information records}
+info[0] = "This is the first information record.";
+info[1] = "This is the second information record.";
+info[2] = "This is the third information record.";
+error = ex_put_info(exoid, num_info, info);
+
+\endcode
+
+ */
+
+int ex_put_info (int   exoid, 
+                 int   num_info,
+                 char *info[])
+{
+  int status;
+  int i, lindim, num_info_dim, dims[2], varid;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  exerrval = 0; /* clear error code */
+
+  /* only do this if there are records */
+  if (num_info > 0) {
+
+    /* See if the number of info records has already been defined.
+       Assume that if the DIM_NUM_INFO dimension exists, then the
+       VAR_INFO variable also exists...
+     */
+    status =  nc_inq_dimid(rootid, DIM_NUM_INFO, &num_info_dim);
+    if (status != NC_NOERR) {
+
+      /*   inquire previously defined dimensions  */
+      if ((status = nc_inq_dimid(rootid, DIM_LIN, &lindim)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to get line string length in file id %d", rootid);
+        ex_err("ex_put_info",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+      /* put file into define mode  */
+      if ((status = nc_redef (rootid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed put file id %d into define mode", rootid);
+        ex_err("ex_put_info",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+      /* define dimensions */
+      if ((status = nc_def_dim(rootid, DIM_NUM_INFO, num_info, &num_info_dim)) != NC_NOERR) {
+        if (status == NC_ENAMEINUSE) {     /* duplicate entry? */
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: info records already exist in file id %d",
+                  rootid);
+          ex_err("ex_put_info",errmsg,exerrval);
+        } else {
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: failed to define number of info records in file id %d",
+                  rootid);
+          ex_err("ex_put_info",errmsg,exerrval);
+        }
+
+        goto error_ret;         /* exit define mode and return */
+      }
+
+      /* define variable  */
+      dims[0] = num_info_dim;
+      dims[1] = lindim;
+
+      if ((status = nc_def_var(rootid, VAR_INFO, NC_CHAR, 2, dims, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define info record in file id %d",
+                rootid);
+        ex_err("ex_put_info",errmsg,exerrval);
+        goto error_ret;         /* exit define mode and return */
+      }
+      ex_compress_variable(rootid, varid, 3);
+
+      /*   leave define mode  */
+      if ((status = nc_enddef (rootid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to complete info record definition in file id %d",
+                rootid);
+        ex_err("ex_put_info",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+    } else {
+      if ((status = nc_inq_varid(rootid, VAR_INFO, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find info record variable in file id %d",
+                rootid);
+        ex_err("ex_put_info",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (info != NULL) {
+      /* write out information records */
+      for (i=0; i<num_info; i++) {
+        int length = strlen(info[i]);
+        start[0] = i;
+        start[1] = 0;
+
+        count[0] = 1;
+        count[1] = length < MAX_LINE_LENGTH ? length : MAX_LINE_LENGTH;
+
+        if ((status = nc_put_vara_text(rootid, varid, start, count, info[i])) != NC_NOERR) {
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: failed to store info record in file id %d",
+                  rootid);
+          ex_err("ex_put_info",errmsg,exerrval);
+          return (EX_FATAL);
+        }
+      }
+    } else if (ex_is_parallel(rootid)) {
+      /* All processors need to call nc_put_vara_text in case in a global collective mode */
+      char dummy[] = " ";
+      for (i=0; i<num_info; i++) {
+        start[0] = start[1] = 0;
+        count[0] = count[1] = 0;
+        nc_put_vara_text(rootid, varid, start, count, dummy);
+      }
+    }
+  }
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+  error_ret:
+  if (nc_enddef (rootid) != NC_NOERR) {     /* exit define mode */
+    sprintf(errmsg,
+        "Error: failed to complete definition for file id %d",
+        rootid);
+    ex_err("ex_put_info",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_init.c b/exodus/cbind/src/ex_put_init.c
new file mode 100644
index 0000000..78a386b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_init.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <string.h>                     // for strncpy
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_init_params, etc
+
+/*!
+
+The function ex_put_init() writes the initialization parameters to the
+exodus file. This function must be called once (and only once) before
+writing any data to the file.
+
+\return In case of an error, ex_put_init() returns a negative number;
+a warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  this routine has been called previously.
+
+\param exoid         exodus file ID returned from a previous call to ex_create() or ex_open().
+\param title         Database title. Maximum length is \c MAX_LINE_LENGTH.
+\param num_dim       The dimensionality of the database. This is the number of coordinates per node.
+\param num_nodes     The number of nodal points.
+\param num_elem      The number of elements.
+\param num_elem_blk  The number of element blocks.
+\param num_node_sets The number of node sets.
+\param num_side_sets The number of side sets.
+
+The following code segment will initialize an open exodus file with
+the specified parameters:
+
+\code
+int num_dim, num_nods, num_el, num_el_blk, num_ns, num_ss, error, exoid;
+
+\comment{initialize file with parameters}
+num_dim = 3; num_nods = 46; num_el = 5; num_el_blk = 5;
+num_ns = 2; num_ss = 5;
+
+error = ex_put_init (exoid, "This is the title", num_dim, 
+                     num_nods, num_el,num_el_blk, num_ns, num_ss);
+\endcode
+
+*/
+
+int ex_put_init (int   exoid,
+                 const char *title,
+                 int64_t   num_dim,
+                 int64_t   num_nodes,
+                 int64_t   num_elem,
+                 int64_t   num_elem_blk,
+                 int64_t   num_node_sets,
+                 int64_t   num_side_sets)
+{
+  ex_init_params par;
+
+  strncpy( par.title, title, 80 );
+  par.title[80] = '\0';
+  
+  par.num_dim = num_dim;
+  par.num_nodes = num_nodes;
+  par.num_edge = 0;
+  par.num_edge_blk = 0;
+  par.num_face = 0;
+  par.num_face_blk = 0;
+  par.num_elem = num_elem;
+  par.num_elem_blk = num_elem_blk;
+  par.num_node_sets = num_node_sets;
+  par.num_edge_sets = 0;
+  par.num_face_sets = 0;
+  par.num_side_sets = num_side_sets;
+  par.num_elem_sets = 0;
+  par.num_node_maps = 0;
+  par.num_edge_maps = 0;
+  par.num_face_maps = 0;
+  par.num_elem_maps = 0;
+
+  return (ex_put_init_ext( exoid, &par ));
+}
diff --git a/exodus/cbind/src/ex_put_init_ext.c b/exodus/cbind/src/ex_put_init_ext.c
new file mode 100644
index 0000000..afa431a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_init_ext.c
@@ -0,0 +1,603 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expinix - ex_put_init_ext
+*
+* entry conditions - 
+*   input parameters:
+*       int                   exoid     exodus file id
+*       const ex_init_params* params    finite element model parameters
+*
+* exit conditions - 
+*
+* revision history - 
+*          David Thompson  - Added edge/face blocks/sets
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL, free, malloc
+#include <string.h>                     // for strlen
+#include "exodusII.h"                   // for ex_init_params, ex_err, etc
+#include "exodusII_int.h"               // for nc_flt_code, EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_dim, etc
+
+static void write_dummy_names(int exoid, ex_entity_type obj_type)
+{
+  const char *routine = "write_dummy_names";
+  size_t  start[2], count[2];
+  char *text = "";
+  int varid;
+  size_t num_entity;
+  size_t i;
+  
+  ex_get_dimension(exoid, ex_dim_num_objects(obj_type),
+		   ex_name_of_object(obj_type),
+		   &num_entity, &varid, routine);
+  
+  for (i = 0; i < num_entity; i++) {
+    start[0] = i;
+    count[0] = 1;
+
+    start[1] = 0;
+    count[1] = strlen(text)+1;
+
+    nc_put_vara_text(exoid, varid, start, count, text);
+  }
+}
+
+static int ex_write_object_names(int exoid, const char *type, const char *dimension_name,
+				 int dimension_var, int string_dimension, int count)
+{
+  int dim[2];
+  int status;
+  int varid;
+  char errmsg[MAX_ERR_LENGTH];
+
+  if (count > 0) { 
+    dim[0] = dimension_var;
+    dim[1] = string_dimension;
+
+    if ((status = nc_def_var (exoid, dimension_name, NC_CHAR, 2, dim, &varid)) != NC_NOERR) { 
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define %s name array in file id %d",type,exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return status;         /* exit define mode and return */
+    }
+  }
+  return NC_NOERR;
+}
+
+static int ex_write_object_params(int exoid, const char *type, const char *dimension_name,
+				  const char *status_dim_name, const char *id_array_dim_name,
+				  size_t count, int *dimension)
+{
+  int dim[2];
+  int varid;
+  int status;
+  int int_type;
+  char errmsg[MAX_ERR_LENGTH];
+  
+  /* Can have nonzero model->num_elem_blk even if model->num_elem == 0 */
+  if (count > 0) {
+    if ((status = nc_def_dim(exoid, dimension_name, count, dimension)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define number of %ss in file id %d",
+	      type, exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return status;         /* exit define mode and return */
+    }
+    /* ...and some variables */
+    /* element block id status array */
+    dim[0] = *dimension;
+    if ((status = nc_def_var (exoid, status_dim_name, NC_INT, 1, dim, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define %s status array in file id %d", type, exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return status;         /* exit define mode and return */
+    }
+   
+    /* type id array */
+    int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+      int_type = NC_INT64;
+    }
+    if ((status = nc_def_var (exoid, id_array_dim_name, int_type, 1, dim, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define %s id array in file id %d", type, exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return status;         /* exit define mode and return */
+    }
+   
+    /*   store property name as attribute of property array variable */
+    if ((status=nc_put_att_text(exoid, varid, ATT_PROP_NAME, 3, "ID")) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store %s property name %s in file id %d",
+	      type, "ID", exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return status;
+    }
+  }
+  return NC_NOERR;
+}
+
+static int ex_write_map_params(int exoid, const char *map_name, const char *map_dim_name,
+			       const char *map_id_name, size_t map_count, int *map_dimension)
+{
+  int dim[2];
+  int varid;
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+
+  int int_type = NC_INT;
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    int_type = NC_INT64;
+  }
+  
+  /* Can have nonzero model->num_XXXX_map even if model->num_XXXX == 0 */
+  if ((map_count) > 0) {
+    if ((status = nc_def_dim(exoid, map_dim_name, map_count, map_dimension)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define number of %ss in file id %d",
+                map_name, exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        return status;         /* exit define mode and return */
+      }
+
+    dim[0] = *map_dimension;
+
+    /* map_name id array */
+    if ((status = nc_def_var(exoid, map_id_name, int_type, 1, dim, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define %s id array in file id %d", map_name, exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        return status;         /* exit define mode and return */
+      }
+
+    /*   store property name as attribute of property array variable */
+    if ((status=nc_put_att_text(exoid, varid, ATT_PROP_NAME, 3, "ID")) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to store %s property name %s in file id %d",
+                map_name, "ID",exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+  }
+  return NC_NOERR;
+}
+
+static void invalidate_id_status(int exoid, const char *var_stat,
+				 const char *var_id, int count, int *ids)
+{
+  int i;
+  int id_var, stat_var;
+  
+  if (count > 0) {
+    if (var_id != 0) {
+      for (i=0; i < count; i++) {
+	ids[i] = EX_INVALID_ID;
+      }
+      (void)nc_inq_varid(exoid, var_id,   &id_var);
+      (void)nc_put_var_int(exoid, id_var,   ids);
+    }
+
+    if (var_stat != 0) {
+      for (i=0; i < count; i++) {
+	ids[i] = 0;
+      }
+
+      (void)nc_inq_varid(exoid, var_stat, &stat_var);
+      (void)nc_put_var_int(exoid, stat_var, ids);
+    }
+  }
+}
+
+/*!
+ * writes the initialization parameters to the EXODUS II file
+ * \param     exoid     exodus file id
+ * \param     model     finite element model parameters
+ */
+
+int ex_put_init_ext (int   exoid,
+                     const ex_init_params *model)
+{
+  int numdimdim, numnoddim, elblkdim, edblkdim, fablkdim, esetdim,
+    fsetdim, elsetdim, nsetdim, ssetdim, dim_str_name, dim[2], temp;
+  int nmapdim,edmapdim,famapdim,emapdim,timedim;
+  int status;
+  int title_len;
+#if 0
+  /* used for header size calculations which are turned off for now */
+  int header_size, fixed_var_size, iows;
+#endif  
+  char errmsg[MAX_ERR_LENGTH];
+
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  exerrval = 0; /* clear error code */
+  
+  if (rootid == exoid && nc_inq_dimid (exoid, DIM_NUM_DIM, &temp) == NC_NOERR)
+    {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+              "Error: initialization already done for file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+
+  /* put file into define mode */
+  if ((status = nc_redef (exoid)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put file id %d into define mode", exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  /* define some attributes... */
+  title_len = strlen(model->title) < MAX_LINE_LENGTH ? strlen(model->title) : MAX_LINE_LENGTH;
+  if ((status = nc_put_att_text(rootid, NC_GLOBAL, (const char*)ATT_TITLE, 
+				title_len+1, model->title)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define model->title attribute to file id %d", rootid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+  /* ...and some dimensions... */
+
+  /* create name string length dimension */
+  if (nc_inq_dimid (rootid, DIM_STR_NAME, &dim_str_name) != NC_NOERR) {
+    int max_name = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
+    if (max_name < ex_default_max_name_length) max_name = ex_default_max_name_length;
+
+    if ((status=nc_def_dim (rootid, DIM_STR_NAME, max_name+1, &dim_str_name)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define name string length in file id %d",rootid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      goto error_ret;
+    }
+  }
+  
+  if ((status = nc_def_dim(exoid, DIM_TIME, NC_UNLIMITED, &timedim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define time dimension in file id %d", exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  dim[0] = timedim;
+  if ((status = nc_def_var(exoid, VAR_WHOLE_TIME, nc_flt_code(exoid), 1, dim, &temp)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define whole time step variable in file id %d",
+	    exoid);
+    ex_err("ex_create",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  ex_compress_variable(exoid, temp, 2);
+
+  if ((status = nc_def_dim(exoid, DIM_NUM_DIM, model->num_dim, &numdimdim)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define number of dimensions in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+
+  /*
+   * Need to handle "empty file" that may be the result of a strange
+   * load balance or some other strange run.  Note that if num_node
+   * == 0, then model->num_elem must be zero since you cannot have elements
+   * with no nodes. It *is* permissible to have zero elements with
+   * non-zero node count.
+   */
+     
+  if (model->num_nodes > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_NODES, model->num_nodes, &numnoddim)) != NC_NOERR)
+      {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define number of nodes in file id %d",exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        goto error_ret;         /* exit define mode and return */
+      }
+  }
+  
+  if (model->num_elem > 0) {
+    if (model->num_nodes <=  0) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+              "Error: Cannot have non-zero element count if node count is zero.in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+    
+    if ((status = nc_def_dim(exoid, DIM_NUM_ELEM, model->num_elem, &temp)) != NC_NOERR)
+      {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define number of elements in file id %d",exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        goto error_ret;         /* exit define mode and return */
+      }
+  }
+
+  if (model->num_edge > 0) {
+    if (model->num_nodes <=  0) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+              "Error: Cannot have non-zero edge count if node count is zero.in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+    
+    if ((status = nc_def_dim(exoid, DIM_NUM_EDGE, model->num_edge, &temp)) != NC_NOERR)
+      {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define number of edges in file id %d",exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        goto error_ret;         /* exit define mode and return */
+      }
+  }
+
+  if (model->num_face > 0) {
+    if (model->num_nodes <=  0) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+              "Error: Cannot have non-zero face count if node count is zero.in file id %d",exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      goto error_ret;         /* exit define mode and return */
+    }
+    
+    if ((status = nc_def_dim(exoid, DIM_NUM_FACE, model->num_face, &temp)) != NC_NOERR)
+      {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define number of faces in file id %d",exoid);
+        ex_err("ex_put_init_ext",errmsg,exerrval);
+        goto error_ret;         /* exit define mode and return */
+      }
+  }
+
+  if (ex_write_object_params(exoid, "element block", DIM_NUM_EL_BLK, VAR_STAT_EL_BLK, VAR_ID_EL_BLK, model->num_elem_blk, &elblkdim)) goto error_ret;
+  if (ex_write_object_params(exoid, "edge block",    DIM_NUM_ED_BLK, VAR_STAT_ED_BLK, VAR_ID_ED_BLK, model->num_edge_blk, &edblkdim)) goto error_ret;
+  if (ex_write_object_params(exoid, "face block",    DIM_NUM_FA_BLK, VAR_STAT_FA_BLK, VAR_ID_FA_BLK, model->num_face_blk, &fablkdim)) goto error_ret;
+  
+  if (ex_write_object_params(exoid, "node set", DIM_NUM_NS,  VAR_NS_STAT,  VAR_NS_IDS, model->num_node_sets,  &nsetdim)) goto error_ret;
+  if (ex_write_object_params(exoid, "edge set", DIM_NUM_ES,  VAR_ES_STAT,  VAR_ES_IDS, model->num_edge_sets,  &esetdim)) goto error_ret;
+  if (ex_write_object_params(exoid, "face set", DIM_NUM_FS,  VAR_FS_STAT,  VAR_FS_IDS, model->num_face_sets,  &fsetdim)) goto error_ret;
+  if (ex_write_object_params(exoid, "side set", DIM_NUM_SS,  VAR_SS_STAT,  VAR_SS_IDS, model->num_side_sets,  &ssetdim)) goto error_ret;
+  if (ex_write_object_params(exoid, "elem set", DIM_NUM_ELS, VAR_ELS_STAT, VAR_ELS_IDS, model->num_elem_sets, &elsetdim)) goto error_ret;
+
+  if (ex_write_map_params(exoid,   "node map",  DIM_NUM_NM,  VAR_NM_PROP(1),  model->num_node_maps, &nmapdim)  != NC_NOERR) goto error_ret;
+  if (ex_write_map_params(exoid,   "edge map",  DIM_NUM_EDM, VAR_EDM_PROP(1), model->num_edge_maps, &edmapdim) != NC_NOERR) goto error_ret;
+  if (ex_write_map_params(exoid,   "face map",  DIM_NUM_FAM, VAR_FAM_PROP(1), model->num_face_maps, &famapdim) != NC_NOERR) goto error_ret;
+  if (ex_write_map_params(exoid, "element map", DIM_NUM_EM,  VAR_EM_PROP(1),  model->num_elem_maps, &emapdim)  != NC_NOERR) goto error_ret;
+
+  /*
+   * To reduce the maximum dataset sizes, the storage of the nodal
+   * coordinates and the nodal variables was changed from a single
+   * dataset to a dataset per component or variable.  However, we
+   * want to maintain some form of compatability with the old
+   * exodusII version.  It is easy to do this on read; however, we
+   * also want to be able to store in the old format using the new
+   * library. 
+   *
+   * The mode is set in the ex_create call. The setting can be checked
+   * via the ATT_FILESIZE attribute in the file (1=large,
+   * 0=normal). Also handle old files that do not contain this
+   * attribute.
+   */
+
+  if (model->num_nodes > 0) {
+    if (ex_large_model(exoid) == 1) {
+      /* node coordinate arrays -- separate storage... */
+
+      dim[0] = numnoddim;
+      if (model->num_dim > 0) {
+        if ((status = nc_def_var (exoid, VAR_COORD_X, nc_flt_code(exoid), 1, dim, &temp)) != NC_NOERR)
+          {
+            exerrval = status;
+            sprintf(errmsg,
+                    "Error: failed to define node x coordinate array in file id %d",exoid);
+            ex_err("ex_put_init_ext",errmsg,exerrval);
+            goto error_ret;         /* exit define mode and return */
+          }
+	ex_compress_variable(exoid, temp, 2);
+      }
+    
+      if (model->num_dim > 1) {
+        if ((status = nc_def_var(exoid, VAR_COORD_Y, nc_flt_code(exoid), 1, dim, &temp)) != NC_NOERR)
+          {
+            exerrval = status;
+            sprintf(errmsg,
+                    "Error: failed to define node y coordinate array in file id %d",exoid);
+            ex_err("ex_put_init_ext",errmsg,exerrval);
+            goto error_ret;         /* exit define mode and return */
+          }
+	ex_compress_variable(exoid, temp, 2);
+      }
+
+      if (model->num_dim > 2) {
+        if ((status = nc_def_var(exoid, VAR_COORD_Z, nc_flt_code(exoid), 1, dim, &temp)) != NC_NOERR)
+          {
+            exerrval = status;
+            sprintf(errmsg,
+                    "Error: failed to define node z coordinate array in file id %d",exoid);
+            ex_err("ex_put_init_ext",errmsg,exerrval);
+            goto error_ret;         /* exit define mode and return */
+          }
+	ex_compress_variable(exoid, temp, 2);
+      }
+    } else {
+      /* node coordinate arrays: -- all stored together (old method) */
+
+      dim[0] = numdimdim;
+      dim[1] = numnoddim;
+      if ((status = nc_def_var(exoid, VAR_COORD, nc_flt_code(exoid), 2, dim, &temp)) != NC_NOERR)
+        {
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: failed to define node coordinate array in file id %d",exoid);
+          ex_err("ex_put_init_ext",errmsg,exerrval);
+          goto error_ret;         /* exit define mode and return */
+        }
+    }
+  }
+  
+  if (ex_write_object_names(exoid, "element block",VAR_NAME_EL_BLK,elblkdim, dim_str_name, model->num_elem_blk) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "edge block",   VAR_NAME_ED_BLK,edblkdim, dim_str_name, model->num_edge_blk) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "face block",   VAR_NAME_FA_BLK,fablkdim, dim_str_name, model->num_face_blk) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "node set",     VAR_NAME_NS,    nsetdim,  dim_str_name, model->num_node_sets) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "edge set",     VAR_NAME_ES,    esetdim,  dim_str_name, model->num_edge_sets) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "face set",     VAR_NAME_FS,    fsetdim,  dim_str_name, model->num_face_sets) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "side set",     VAR_NAME_SS,    ssetdim,  dim_str_name, model->num_side_sets) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "element set",  VAR_NAME_ELS,   elsetdim, dim_str_name, model->num_elem_sets) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "node map",     VAR_NAME_NM,    nmapdim,  dim_str_name, model->num_node_maps) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "edge map",     VAR_NAME_EDM,   edmapdim, dim_str_name, model->num_edge_maps) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "face map",     VAR_NAME_FAM,   famapdim, dim_str_name, model->num_face_maps) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "element map",  VAR_NAME_EM,    emapdim,  dim_str_name, model->num_elem_maps) != NC_NOERR) goto error_ret;
+  if (ex_write_object_names(exoid, "coordinate",   VAR_NAME_COOR,  numdimdim,dim_str_name, model->num_dim) != NC_NOERR) goto error_ret;
+
+  /* leave define mode */
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete variable definitions in file id %d",exoid);
+    ex_err("ex_put_init_ext",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  /* Fill the id and status arrays with EX_INVALID_ID */
+  {
+    int *invalid_ids = NULL;
+    int maxset = model->num_elem_blk;
+    if (maxset < model->num_edge_blk)  maxset = model->num_edge_blk;
+    if (maxset < model->num_face_blk)  maxset = model->num_face_blk;
+    if (maxset < model->num_node_sets) maxset = model->num_node_sets;
+    if (maxset < model->num_edge_sets) maxset = model->num_edge_sets;
+    if (maxset < model->num_face_sets) maxset = model->num_face_sets;
+    if (maxset < model->num_side_sets) maxset = model->num_side_sets;
+    if (maxset < model->num_elem_sets) maxset = model->num_elem_sets;
+    if (maxset < model->num_node_maps) maxset = model->num_node_maps;
+    if (maxset < model->num_edge_maps) maxset = model->num_edge_maps;
+    if (maxset < model->num_face_maps) maxset = model->num_face_maps;
+    if (maxset < model->num_elem_maps) maxset = model->num_elem_maps;
+
+    /* allocate space for id/status array */
+    if (!(invalid_ids = malloc(maxset*sizeof(int)))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+	      "Error: failed to allocate memory for id/status array for file id %d", exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    
+    invalidate_id_status(exoid, VAR_STAT_EL_BLK, VAR_ID_EL_BLK,
+			 model->num_elem_blk, invalid_ids);
+    invalidate_id_status(exoid, VAR_STAT_ED_BLK, VAR_ID_ED_BLK,
+			 model->num_edge_blk, invalid_ids);
+    invalidate_id_status(exoid, VAR_STAT_FA_BLK, VAR_ID_FA_BLK,
+			 model->num_face_blk, invalid_ids);
+    invalidate_id_status(exoid, VAR_NS_STAT,  VAR_NS_IDS,
+			 model->num_node_sets, invalid_ids);
+    invalidate_id_status(exoid, VAR_ES_STAT,  VAR_ES_IDS,
+			 model->num_edge_sets, invalid_ids);
+    invalidate_id_status(exoid, VAR_FS_STAT,  VAR_FS_IDS,
+			 model->num_face_sets, invalid_ids);
+    invalidate_id_status(exoid, VAR_SS_STAT,  VAR_SS_IDS,
+			 model->num_side_sets, invalid_ids);
+    invalidate_id_status(exoid, VAR_ELS_STAT, VAR_ELS_IDS,
+			 model->num_elem_sets, invalid_ids);
+
+    invalidate_id_status(exoid, 0, VAR_NM_PROP(1),  model->num_node_maps, invalid_ids);
+    invalidate_id_status(exoid, 0, VAR_EDM_PROP(1), model->num_edge_maps, invalid_ids);
+    invalidate_id_status(exoid, 0, VAR_FAM_PROP(1), model->num_face_maps, invalid_ids);
+    invalidate_id_status(exoid, 0, VAR_EM_PROP(1),  model->num_elem_maps, invalid_ids);
+
+    if (invalid_ids != NULL) {
+      free(invalid_ids);
+      invalid_ids = NULL;
+    }
+  }
+
+  /* Write dummy values to the names arrays to avoid corruption issues on some platforms */
+  if (model->num_elem_blk > 0) write_dummy_names(exoid, EX_ELEM_BLOCK);
+  if (model->num_edge_blk > 0) write_dummy_names(exoid, EX_EDGE_BLOCK);
+  if (model->num_face_blk > 0) write_dummy_names(exoid, EX_FACE_BLOCK);
+  if (model->num_node_sets> 0) write_dummy_names(exoid, EX_NODE_SET);
+  if (model->num_edge_sets> 0) write_dummy_names(exoid, EX_EDGE_SET);
+  if (model->num_face_sets> 0) write_dummy_names(exoid, EX_FACE_SET);
+  if (model->num_side_sets> 0) write_dummy_names(exoid, EX_SIDE_SET);
+  if (model->num_elem_sets> 0) write_dummy_names(exoid, EX_ELEM_SET);
+  if (model->num_node_maps> 0) write_dummy_names(exoid, EX_NODE_MAP);
+  if (model->num_edge_maps> 0) write_dummy_names(exoid, EX_EDGE_MAP);
+  if (model->num_face_maps> 0) write_dummy_names(exoid, EX_FACE_MAP);
+  if (model->num_elem_maps> 0) write_dummy_names(exoid, EX_ELEM_MAP);
+
+  return (EX_NOERR);
+  
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+              "Error: failed to complete definition for file id %d",
+              exoid);
+      ex_err("ex_put_init_ext",errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_init_global.c b/exodus/cbind/src/ex_put_init_global.c
new file mode 100644
index 0000000..d712171
--- /dev/null
+++ b/exodus/cbind/src/ex_put_init_global.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_init_global()
+ *****************************************************************************
+ * This function outputs the initial global information.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      num_nodes_g     - The number of global FEM nodes. This is output as
+ *                        a NetCDF variable.
+ *      num_elems_g     - The number of global FEM elements. This is output
+ *                        as a NetCDF variable.
+ *      num_elem_blks_g - The number of global element blocks. This is output
+ *                        as a NetCDF dimension.
+ *      num_node_sets_g - The number of global node sets. This is output as
+ *                        a NetCDF dimension.
+ *      num_side_sets_g - The number of global side sets. This is output as
+ *                        a NetCDF dimension.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for ex_leavedef, EX_FATAL, etc
+#include <netcdf.h>                     // for nc_def_var, NC_NOERR, etc
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_init_global(int   exoid,
+                       int64_t   num_nodes_g,
+                       int64_t   num_elems_g,
+                       int64_t   num_elem_blks_g,
+                       int64_t   num_node_sets_g,
+                       int64_t   num_side_sets_g
+                       )
+{
+  const char   *func_name="ex_put_init_global";
+
+  int     varid, dimid, status;
+  char    errmsg[MAX_ERR_LENGTH];
+
+  int int_type = NC_INT;
+  int id_type  = NC_INT;
+  if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+    int_type = NC_INT64;
+  }
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    id_type = NC_INT64;
+  }
+/*-----------------------------Execution begins-----------------------------*/
+  exerrval = 0; /* clear error code */
+
+
+  /* Put NetCDF file into define mode */
+  if ((status = nc_redef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file ID %d into define mode", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Output the file version */
+  if ((status=ex_put_nemesis_version(exoid)) < 0) return (status);
+
+  /* Define dimension for number of global nodes */
+  if ((status = nc_def_dim(exoid, DIM_NUM_NODES_GLOBAL, num_nodes_g, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to dimension \"%s\" in file ID %d",
+            DIM_NUM_NODES_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Define dimension for number of global elements */
+  if ((status = nc_def_dim(exoid, DIM_NUM_ELEMS_GLOBAL, num_elems_g, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to dimension \"%s\" in file ID %d",
+            DIM_NUM_ELEMS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /*
+   * Output the number of global element blocks. This is output as a
+   * dimension since the vector of global element block IDs is sized
+   * by this quantity.
+   */
+  if ((status = nc_def_dim(exoid, DIM_NUM_ELBLK_GLOBAL, num_elem_blks_g, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to dimension \"%s\" in file ID %d",
+            DIM_NUM_ELBLK_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Define the element block IDs variable. */
+  if ((status = nc_def_var(exoid, VAR_ELBLK_IDS_GLOBAL, id_type, 1, &dimid, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put variable definition for \"%s\" into file ID %d",
+            VAR_ELBLK_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Define the element block counts variable. */
+  if ((status = nc_def_var(exoid, VAR_ELBLK_CNT_GLOBAL, int_type, 1, &dimid, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put variable definition for \"%s\" into file ID %d",
+            VAR_ELBLK_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /*
+   * Output the number of global node sets. This is output as a
+   * dimension since the vector of global element block IDs is sized
+   * by this quantity.
+   */
+  if (num_node_sets_g > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_NS_GLOBAL, num_node_sets_g, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file ID %d",
+              DIM_NUM_NS_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define the variable for output of global node set IDs */
+    if ((status = nc_def_var(exoid, VAR_NS_IDS_GLOBAL, id_type, 1, &dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put variable definition for \"%s\" into file ID %d",
+              VAR_NS_IDS_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define variable for global node counts in each global node set */
+    if ((status = nc_def_var(exoid, VAR_NS_NODE_CNT_GLOBAL, int_type, 1, &dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put variable definition for \"%s\" into file ID %d",
+              VAR_NS_NODE_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returing */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /*
+     * Define variable for global dist. factor count in each global
+     * node set
+     */
+    if ((status = nc_def_var(exoid, VAR_NS_DF_CNT_GLOBAL, int_type, 1, &dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put variable definition for \"%s\" into file ID %d",
+              VAR_NS_DF_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returing */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_node_sets_g > 0)" */
+
+  /*
+   * Output the number of global side sets. This is output as a
+   * dimension since the vector of global element block IDs is sized
+   * by this quantity.
+   */
+  if (num_side_sets_g > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_SS_GLOBAL, num_side_sets_g, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_SS_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Define the variable for output of global side set IDs */
+    if ((status = nc_def_var(exoid, VAR_SS_IDS_GLOBAL, id_type, 1, &dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put variable definition for \"%s\" into file id %d",
+              VAR_SS_IDS_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /*
+     * Define the variable for count of global number of sides in the
+     * global side sets.
+     */
+    if ((status = nc_def_var(exoid, VAR_SS_SIDE_CNT_GLOBAL, int_type, 1, &dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put variable definition for \"%s\" into file id %d",
+              VAR_SS_SIDE_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /*
+     * Define the variable for count of global dist. factors in the
+     * global side sets.
+     */
+    if ((status = nc_def_var(exoid, VAR_SS_DF_CNT_GLOBAL, int_type, 1, &dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put variable definition for \"%s\" into file id %d",
+              VAR_SS_DF_CNT_GLOBAL, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_side_sets_g > 0)" */
+
+  /* End define mode */
+  if (ex_leavedef(exoid, func_name) != EX_NOERR)
+    return (EX_FATAL);
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_init_info.c b/exodus/cbind/src/ex_put_init_info.c
new file mode 100644
index 0000000..c919b10
--- /dev/null
+++ b/exodus/cbind/src/ex_put_init_info.c
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ * 	ex_put_init_info()
+ *****************************************************************************
+ * This function writes information about the processors for which the
+ * decomposition was performed.
+ *****************************************************************************
+ * Variable Index:
+ *	exoid		  - The NetCDF ID of an already open NemesisI file.
+ *	num_proc	  - The number of processors in the decomposition.
+ *	num_proc_in_f	  - The number of processors the file contains
+ *			    information for.
+ *      ftype             - The type of Nemesis file.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <stdio.h>
+
+#include <netcdf.h>
+
+#include <exodusII.h>
+#include <exodusII_int.h>
+
+int ex_put_init_info(int   exoid,
+                     int   num_proc,
+                     int   num_proc_in_f,
+                     char *ftype
+  )
+{
+  const char *func_name="ex_put_init_info";
+
+  int     dimid, varid;
+  int    ltempsv;
+  int  lftype;
+  int  status;
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Check the file type */
+  if (!ftype) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: NULL file type input for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Set the file type */
+  if (ftype[0] == 'p' || ftype[0] == 'P')
+    lftype = 0;
+  else if (ftype[0] == 's' || ftype[0] == 'S')
+    lftype = 1;
+  else {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: unknown file type requested for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Put file into define mode */
+  if ((status = nc_redef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file ID %d into define mode", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Define dimension for the number of processors */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_PROCS, &dimid)) != NC_NOERR) {
+    ltempsv = num_proc;
+    if ((status = nc_def_dim(exoid, DIM_NUM_PROCS, ltempsv, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file ID %d",
+              DIM_NUM_PROCS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  } 
+
+  /* If this is a parallel file then the status vectors are size 1 */
+  if (nc_inq_dimid(exoid, DIM_NUM_PROCS_F, &dimid) != NC_NOERR) {
+    ltempsv = num_proc_in_f;
+    if ((status = nc_def_dim(exoid, DIM_NUM_PROCS_F, ltempsv, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file ID %d",
+              DIM_NUM_PROCS_F, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  } 
+
+  /* Output the file type */
+  if (nc_inq_varid(exoid, VAR_FILE_TYPE, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_FILE_TYPE, NC_INT, 0, NULL, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define file type in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if (ex_leavedef(exoid, func_name) != EX_NOERR)
+      return (EX_FATAL);
+
+    if ((status = nc_put_var1_int(exoid, varid, NULL, &lftype)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: unable to output file type variable in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+  }
+  else {
+    if (ex_leavedef(exoid, func_name) != EX_NOERR)
+      return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_loadbal_param.c b/exodus/cbind/src/ex_put_loadbal_param.c
new file mode 100644
index 0000000..807be4a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_loadbal_param.c
@@ -0,0 +1,663 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *      ex_put_loadbal_param()
+ *****************************************************************************
+ * This function outputs the load balance parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid             - The NetCDF ID of an already open NemesisI file.
+ *      num_int_nodes    - The number of internal FEM nodes.
+ *      num_bor_nodes    - The number of border FEM nodes.
+ *      num_ext_nodes    - The number of external FEM nodes.
+ *      num_int_elems    - The number of internal FEM elements.
+ *      num_bor_elems    - The number of border FEM elements.
+ *      num_node_cmaps   - The number of nodal communication maps.
+ *      num_elem_cmaps   - The number of elemental communication maps.
+ *      processor        - The processor the file being read was written for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for ex_leavedef, EX_FATAL, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_def_var, etc
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_loadbal_param(int   exoid,
+                         int64_t   num_int_nodes,
+                         int64_t   num_bor_nodes,
+                         int64_t   num_ext_nodes,
+                         int64_t   num_int_elems,
+                         int64_t   num_bor_elems,
+                         int64_t   num_node_cmaps,
+                         int64_t   num_elem_cmaps,
+                         int       processor
+                         )
+{
+  const char  *func_name="ex_put_loadbal_param";
+
+  int    status, varid;
+  int    dimid_npf, dimid[3];
+  int    varid_nm[3], varid_em[2];
+  char   ftype[2];
+
+  int nmstat, ltempsv;
+
+  char   errmsg[MAX_ERR_LENGTH];
+
+  int id_type  = NC_INT;
+  int map_type = NC_INT;
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    id_type = NC_INT64;
+  }
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+    map_type = NC_INT64;
+  }
+  /*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: failed to get file type from file ID %d\n",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* make sure that this is a parallel file */
+  if (ftype[0] != 'p') {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: function for use with parallel files only, file ID %d\n",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /*
+   * Get the dimension ID for the number of processors storing
+   * information in this file.
+   */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_PROCS_F, &dimid_npf)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_PROCS_F, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Put NetCDF file into define mode */
+  if ((status = nc_redef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file id %d into define mode", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Output the file version */
+  if ((status=ex_put_nemesis_version(exoid)) < 0) return (status);
+
+  /* Define the status variables for the nodal vectors */
+  if (nc_inq_varid(exoid, VAR_INT_N_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_INT_N_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_INT_N_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Set the dimension for status vectors */
+  if (nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_BOR_N_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_BOR_N_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  if (nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_EXT_N_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_EXT_N_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Define the variable IDs for the elemental status vectors */
+  if (nc_inq_varid(exoid, VAR_INT_E_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_INT_E_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_INT_E_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  if (nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_BOR_E_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: Failed to define variable \"%s\" in file ID %d",
+              VAR_BOR_E_STAT, exoid);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Get the variable ID for the nodal status vectors */
+  if ((status = nc_inq_varid(exoid, VAR_INT_N_STAT, &varid_nm[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid_nm[1])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid_nm[2])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Define variable for the internal element information */
+  if (num_int_elems > 0) {
+    ltempsv = num_int_elems;
+    if ((status = nc_def_dim(exoid, DIM_NUM_INT_ELEMS, ltempsv, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_INT_ELEMS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_ELEM_MAP_INT, map_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_int_elems > 0)" */
+
+  /* Get the variable IDs for the elemental status vectors */
+  if ((status = nc_inq_varid(exoid, VAR_INT_E_STAT, &varid_em[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid_em[1])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Define variable for the border element information */
+  if (num_bor_elems > 0) {
+    ltempsv = num_bor_elems;
+    if ((status = nc_def_dim(exoid, DIM_NUM_BOR_ELEMS, ltempsv, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_BOR_ELEMS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_ELEM_MAP_BOR, map_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_bor_elems > 0)" */
+
+  if (num_int_nodes > 0) {
+    /* Define variable for vector of internal FEM node IDs */
+    ltempsv = num_int_nodes;
+    if ((status = nc_def_dim(exoid, DIM_NUM_INT_NODES, ltempsv, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_INT_NODES, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_INT, map_type, 1, &dimid[0], &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_int_nodes > 0)" */
+
+  if (num_bor_nodes > 0) {
+    /* Define variable for vector of border FEM node IDs */
+    ltempsv = num_bor_nodes;
+    if ((status = nc_def_dim(exoid, DIM_NUM_BOR_NODES, ltempsv, &dimid[1])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_BOR_NODES, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_BOR, map_type, 1, &dimid[1], &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_bor_nodes > 0)" */
+
+  if (num_ext_nodes > 0) {
+    /* Define dimension for vector of external FEM node IDs */
+    ltempsv = num_ext_nodes;
+    if ((status = nc_def_dim(exoid, DIM_NUM_EXT_NODES, ltempsv, &dimid[2])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_EXT_NODES, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_EXT, map_type, 1, &dimid[2], &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_EXT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+  } /* End "if (num_ext_nodes > 0)" */
+
+  /* Add the nodal communication map count */
+  if (num_node_cmaps > 0) {
+    ltempsv = num_node_cmaps;
+    if ((status = nc_def_dim(exoid, DIM_NUM_N_CMAPS, ltempsv, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add dimension \"%s\" in file ID %d",
+              DIM_NUM_N_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Add the ID vector */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_IDS, id_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_N_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    /* Add the status vector */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_STAT, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_N_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_node_cmaps > 0)" */
+
+  /* Add the nodal communication map count */
+  if (num_elem_cmaps > 0) {
+    ltempsv = num_elem_cmaps;
+    if ((status = nc_def_dim(exoid, DIM_NUM_E_CMAPS, ltempsv, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add dimension \"%s\" in file ID %d",
+              DIM_NUM_E_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Add variables for elemental communication maps */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_IDS, id_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define variable \"%s\" in file ID %d",
+	      VAR_E_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_def_var(exoid, VAR_E_COMM_STAT, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define variable \"%s\" in file ID %d",
+	      VAR_E_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_elem_cmaps > 0)" */
+
+  /* Leave define mode */
+  if (ex_leavedef(exoid, func_name) != EX_NOERR)
+    return (EX_FATAL);
+
+  /*
+  ** Set up status vector for internal node map
+  ** NOTE(9/26/96): this function is no longer valid
+  ** for scaler files, so no need to check for file type
+  */
+  if (num_int_nodes == 0) {
+    /* NULL set for internal nodes */
+    nmstat = 0;
+    if ((status = nc_put_var_int(exoid, varid_nm[0], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for int node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else {
+    nmstat = 1;
+    if ((status = nc_put_var_int(exoid, varid_nm[0], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for int node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_int_nodes == 0)" */
+
+  /* Set up status vector for border node map */
+  if (num_bor_nodes == 0) {
+    /* NULL set for border nodes */
+    nmstat = 0;
+    if ((status = nc_put_var_int(exoid, varid_nm[1], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for bor node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else {
+    /* Set the status indicating non-NULL size */
+    nmstat = 1;
+    if ((status = nc_put_var_int(exoid, varid_nm[1], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for bor node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_bor_nodes == 0)" */
+
+  /* Set up status vector for external node map */
+  if (num_ext_nodes == 0) {
+    /* NULL set for external nodes */
+    nmstat = 0;
+    if ((status = nc_put_var_int(exoid, varid_nm[2], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for ext node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else {
+    /* Set the status indicating non-NULL size */
+    nmstat = 1;
+    if ((status = nc_put_var_int(exoid, varid_nm[2], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for ext node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_ext_nodes == 0)" */
+
+  /* Set up status vector for internal element map */
+  if (num_int_elems == 0) {
+    /* NULL set for internal elements */
+    nmstat = 0;
+    if ((status = nc_put_var_int(exoid, varid_em[0], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for int elem map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else {
+    /* Set the status indicating non-NULL size */
+    nmstat = 1;
+    if ((status = nc_put_var_int(exoid, varid_em[0], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for int elem map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_int_elems == 0)" */
+
+  /* Set up status vector for border element map */
+  if (num_bor_elems == 0) {
+    /* NULL set for internal elements */
+    nmstat = 0;
+    if ((status = nc_put_var_int(exoid, varid_em[1], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for bor elem map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  }
+  else {
+    /* Set the status indicating non-NULL size */
+    nmstat = 1;
+    if ((status = nc_put_var_int(exoid, varid_em[1], &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status for bor elem map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_bor_elems == 0)" */
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_loadbal_param_cc.c b/exodus/cbind/src/ex_put_loadbal_param_cc.c
new file mode 100644
index 0000000..2280900
--- /dev/null
+++ b/exodus/cbind/src/ex_put_loadbal_param_cc.c
@@ -0,0 +1,922 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *      ex_put_loadbal_param_cc()
+ *****************************************************************************
+ * This function outputs the concatenated list of load-balance parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid             - The NetCDF ID of an already open NemesisI file.
+ *      num_int_nodes    - Vector of number of internal FEM nodes for
+ *			   "num_proc_in_f" processors.
+ *      num_bor_nodes    - Vector of number of border FEM nodes for
+ *			   "num_proc_in_f" processors.
+ *      num_ext_nodes    - Vector of number of external FEM nodes for
+ *			   "num_proc_in_f" processors.
+ *      num_int_elems    - Vector of number of internal FEM elems for
+ *			   "num_proc_in_f" processors.
+ *      num_bor_elems    - Vector of number of border FEM elems for
+ *			   "num_proc_in_f" processors.
+ *      num_node_cmaps   - Vector of number of nodal communication maps
+ *                         for "num_proc_in_f" processors.
+ *      num_elem_cmaps   - Vector of number of elemental communication maps
+ *                         for "num_proc_in_f" processors.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for ex_leavedef, EX_FATAL, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_def_var, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+
+
+#ifndef NC_INT64
+#define NC_INT64 NC_INT
+#endif
+
+int ex_put_loadbal_param_cc(int   exoid,
+                            void_int  *num_int_nodes,
+                            void_int  *num_bor_nodes,
+                            void_int  *num_ext_nodes,
+                            void_int  *num_int_elems,
+                            void_int  *num_bor_elems,
+                            void_int  *num_node_cmaps,
+                            void_int  *num_elem_cmaps
+                            )
+{
+  const char  *func_name="ex_put_loadbal_param_cc";
+
+  int     status;
+  int     iproc, varid, dimid_npf, dimid[3];
+  int     num_proc, num_proc_in_f;
+  int     varid_nm[3], varid_em[2];
+  int     varid_idx[7] = {0, 0, 0, 0, 0, 0, 0};
+  size_t  start[1];
+  char    ftype[2];
+  int  oldfill;
+
+#if defined(NC_NETCDF4)
+  int64_t num_int_elem = 0, num_int_node = 0, num_bor_elem = 0;
+  int64_t num_bor_node = 0, num_ext_node = 0;
+  int64_t num_n_cmaps = 0, num_e_cmaps = 0;
+#else
+  int num_int_elem = 0, num_int_node = 0, num_bor_elem = 0;
+  int num_bor_node = 0, num_ext_node = 0;
+  int num_n_cmaps = 0, num_e_cmaps = 0;
+#endif
+
+  int  nmstat;
+
+  char   errmsg[MAX_ERR_LENGTH];
+
+  int     format;
+
+  int index_type = NC_INT;
+  int map_type = NC_INT;
+  int id_type  = NC_INT;
+
+  /*-----------------------------Execution begins-----------------------------*/
+  exerrval = 0; /* clear error code */
+
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+    map_type = NC_INT64;
+  }
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    id_type = NC_INT64;
+  }
+
+  /* See if using NC_FORMAT_NETCDF4 format... */
+  nc_inq_format(exoid, &format);
+  if ((ex_int64_status(exoid) & EX_BULK_INT64_DB) || (format == NC_FORMAT_NETCDF4)) {
+    index_type = NC_INT64;
+  }
+  
+  /* Get the processor information from the file */
+  if (ex_get_init_info(exoid, &num_proc, &num_proc_in_f, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: Unable to get processor info from file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /*
+   * Get the dimension ID for the number of processors storing
+   * information in this file.
+   */
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_PROCS_F, &dimid_npf)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find dimension ID for \"%s\" in file ID %d",
+            DIM_NUM_PROCS_F, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Put NetCDF file into define mode */
+  if ((status = nc_redef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file id %d into define mode", exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Set the fill mode */
+  if ((status = nc_set_fill(exoid, NC_NOFILL, &oldfill)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file ID %d into no-fill mode",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Output the file version */
+  if ((status=ex_put_nemesis_version(exoid)) < 0) return (status);
+
+  /* Output the file type */
+  if (nc_inq_varid(exoid, VAR_FILE_TYPE, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_FILE_TYPE, NC_INT, 0, NULL, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define file type in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Define the status variables for the nodal vectors */
+  if (nc_inq_varid(exoid, VAR_INT_N_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_INT_N_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_INT_N_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Set the dimension for status vectors */
+  if (nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_BOR_N_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_BOR_N_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  if (nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_EXT_N_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_EXT_N_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Define the variable IDs for the elemental status vectors */
+  if (nc_inq_varid(exoid, VAR_INT_E_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_INT_E_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_INT_E_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  if (nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid) != NC_NOERR) {
+    if ((status = nc_def_var(exoid, VAR_BOR_E_STAT, NC_INT, 1, &dimid_npf, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: Failed to define variable \"%s\" in file ID %d",
+              VAR_BOR_E_STAT, exoid);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  }
+
+  /* Get the variable ID for the nodal status vectors */
+  if ((status = nc_inq_varid(exoid, VAR_INT_N_STAT, &varid_nm[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to find variable ID for \"%s\" in file ID %d",
+	    VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid_nm[1])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid_nm[2])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable IDs for the elemental status vectors */
+  if ((status = nc_inq_varid(exoid, VAR_INT_E_STAT, &varid_em[0])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid_em[1])) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    /* Leave define mode before returning */
+    ex_leavedef(exoid, func_name);
+
+    return (EX_FATAL);
+  }
+
+  /* mms: NEW STUFF HERE */
+  /*
+  ** first need to loop through the processors in this
+  ** file and get the counts of the element and cmap lists
+  */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    for(iproc=0; iproc < num_proc_in_f; iproc++) {
+      num_int_elem += ((int64_t*)num_int_elems)[iproc];
+      num_int_node += ((int64_t*)num_int_nodes)[iproc];
+      num_bor_elem += ((int64_t*)num_bor_elems)[iproc];
+      num_bor_node += ((int64_t*)num_bor_nodes)[iproc];
+      num_ext_node += ((int64_t*)num_ext_nodes)[iproc];
+      num_e_cmaps += ((int64_t*)num_elem_cmaps)[iproc];
+      num_n_cmaps += ((int64_t*)num_node_cmaps)[iproc];
+    }
+  } else {
+    for(iproc=0; iproc < num_proc_in_f; iproc++) {
+      num_int_elem += ((int*)num_int_elems)[iproc];
+      num_int_node += ((int*)num_int_nodes)[iproc];
+      num_bor_elem += ((int*)num_bor_elems)[iproc];
+      num_bor_node += ((int*)num_bor_nodes)[iproc];
+      num_ext_node += ((int*)num_ext_nodes)[iproc];
+      num_e_cmaps += ((int*)num_elem_cmaps)[iproc];
+      num_n_cmaps += ((int*)num_node_cmaps)[iproc];
+    }
+  }
+
+  /* Define variable for the internal element information */
+  if (num_int_elem > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_INT_ELEMS, num_int_elem, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_INT_ELEMS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_ELEM_MAP_INT, map_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_ELEM_MAP_INT_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+  } /* End "if (num_int_elem > 0)" */
+
+  /* Define variable for the border element information */
+  if (num_bor_elem > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_BOR_ELEMS, num_bor_elem, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_BOR_ELEMS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_ELEM_MAP_BOR, map_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_ELEM_MAP_BOR_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[1])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_bor_elem > 0)" */
+
+  if (num_int_node > 0) {
+    /* Define variable for vector of internal FEM node IDs */
+    if ((status = nc_def_dim(exoid, DIM_NUM_INT_NODES, num_int_node, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_INT_NODES, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_INT, map_type, 1, &dimid[0], &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_INT_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[2])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_int_node > 0)" */
+
+  if (num_bor_node > 0) {
+    /* Define variable for vector of border FEM node IDs */
+    if ((status = nc_def_dim(exoid, DIM_NUM_BOR_NODES, num_bor_node, &dimid[1])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_BOR_NODES, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_BOR, map_type, 1, &dimid[1], &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_BOR_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[3])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_bor_node > 0)" */
+
+  if (num_ext_node > 0) {
+    /* Define dimension for vector of external FEM node IDs */
+    if ((status = nc_def_dim(exoid, DIM_NUM_EXT_NODES, num_ext_node, &dimid[2])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to dimension \"%s\" in file id %d",
+              DIM_NUM_EXT_NODES, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_EXT, map_type, 1, &dimid[2], &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_EXT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_NODE_MAP_EXT_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[4])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_EXT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_ext_node > 0)" */
+
+  /* Output the communication map dimensions */
+  if (num_n_cmaps > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_N_CMAPS, num_n_cmaps, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add dimension \"%s\" in file ID %d",
+              DIM_NUM_N_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Add variables for communication maps */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_IDS, id_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_N_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_N_COMM_STAT, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_N_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_N_COMM_INFO_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[5])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_N_COMM_INFO_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_n_cmaps > 0)" */
+
+  if (num_e_cmaps > 0) {
+    if ((status = nc_def_dim(exoid, DIM_NUM_E_CMAPS, num_e_cmaps, &dimid[0])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to add dimension \"%s\" in file ID %d",
+              DIM_NUM_E_CMAPS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* Add variables for elemental communication maps */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_IDS, id_type, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_E_COMM_IDS, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_def_var(exoid, VAR_E_COMM_STAT, NC_INT, 1, dimid, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_E_COMM_STAT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+    /* and the index variable */
+    if ((status = nc_def_var(exoid, VAR_E_COMM_INFO_IDX, index_type, 1,
+			     &dimid_npf, &varid_idx[6])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to define variable \"%s\" in file ID %d",
+              VAR_E_COMM_INFO_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      /* Leave define mode before returning */
+      ex_leavedef(exoid, func_name);
+
+      return (EX_FATAL);
+    }
+
+  } /* End "if (num_e_cmaps > 0)" */
+
+  /* Leave define mode */
+  if (ex_leavedef(exoid, func_name) != EX_NOERR)
+    return (EX_FATAL);
+
+  /* need to reset these counters */
+  num_int_elem = 0;
+  num_int_node = 0;
+  num_bor_elem = 0;
+  num_bor_node = 0;
+  num_ext_node = 0;
+  num_n_cmaps = 0;
+  num_e_cmaps = 0;
+
+  /* Update the status vectors */
+  for(iproc=0; iproc < num_proc_in_f; iproc++) {
+    size_t nin;
+    size_t nbn;
+    size_t nen;
+    size_t nie;
+    size_t nbe;
+    size_t nnc;
+    size_t nec;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      nie = ((int64_t*)num_int_elems)[iproc];
+      nin = ((int64_t*)num_int_nodes)[iproc];
+      nbe = ((int64_t*)num_bor_elems)[iproc];
+      nbn = ((int64_t*)num_bor_nodes)[iproc];
+      nen = ((int64_t*)num_ext_nodes)[iproc];
+      nec = ((int64_t*)num_elem_cmaps)[iproc];
+      nnc = ((int64_t*)num_node_cmaps)[iproc];
+    } else {
+      nie = ((int*)num_int_elems)[iproc];
+      nin = ((int*)num_int_nodes)[iproc];
+      nbe = ((int*)num_bor_elems)[iproc];
+      nbn = ((int*)num_bor_nodes)[iproc];
+      nen = ((int*)num_ext_nodes)[iproc];
+      nec = ((int*)num_elem_cmaps)[iproc];
+      nnc = ((int*)num_node_cmaps)[iproc];
+    }
+
+    start[0] = iproc;
+
+    if (nin > 0)
+      nmstat = 1;
+    else
+      nmstat = 0;
+
+    if ((status = nc_put_var1_int(exoid, varid_nm[0], start, &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status int node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if (nbn > 0)
+      nmstat = 1;
+    else
+      nmstat = 0;
+
+    if ((status = nc_put_var1_int(exoid, varid_nm[1], start, &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status bor node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if (nen > 0)
+      nmstat = 1;
+    else
+      nmstat = 0;
+
+    if ((status = nc_put_var1_int(exoid, varid_nm[2], start, &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status ext node map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if (nie > 0)
+      nmstat = 1;
+    else
+      nmstat = 0;
+
+    if ((status = nc_put_var1_int(exoid, varid_em[0], start, &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status int elem map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if (nbe > 0)
+      nmstat = 1;
+    else
+      nmstat = 0;
+
+    if ((status = nc_put_var1_int(exoid, varid_em[1], start, &nmstat)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output status bor elem map in file ID %d",
+              exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* now fill the index variables */
+    if (varid_idx[0] > 0) {
+      /* increment to the next starting position */
+      num_int_elem += nie;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[0], start, (long long*)&num_int_elem);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[0], start, &num_int_elem);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output internal element map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (varid_idx[1] > 0) {
+      /* increment to the next starting position */
+      num_bor_elem += nbe;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[1], start, (long long*)&num_bor_elem);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[1], start, &num_bor_elem);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output border element map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (varid_idx[2] > 0) {
+      /* increment to the next starting position */
+      num_int_node += nin;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[2], start, (long long*)&num_int_node);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[2], start, &num_int_node);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output internal node map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (varid_idx[3] > 0) {
+      /* increment to the next starting position */
+      num_bor_node += nbn;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[3], start, (long long*)&num_bor_node);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[3], start, &num_bor_node);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output border node map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (varid_idx[4] > 0) {
+      /* increment to the next starting position */
+      num_ext_node += nen;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[4], start, (long long*)&num_ext_node);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[4], start, &num_ext_node);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output external node map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (varid_idx[5] > 0) {
+      /* increment to the next starting position */
+      num_n_cmaps += nnc;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[5], start, (long long*)&num_n_cmaps);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[5], start, &num_n_cmaps);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output node communication map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (varid_idx[6] > 0) {
+      /* increment to the next starting position */
+      num_e_cmaps += nec;
+#if defined(NC_NETCDF4)
+      status = nc_put_var1_longlong(exoid, varid_idx[6], start, (long long*)&num_e_cmaps);
+#else
+      status = nc_put_var1_int(exoid, varid_idx[6], start, &num_e_cmaps);
+#endif
+      if (status != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to output elem communication map index in file ID %d",
+                exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+  } /* End "for(iproc=0; iproc < num_proc_in_f; iproc++)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_map.c b/exodus/cbind/src/ex_put_map.c
new file mode 100644
index 0000000..0c9dba0
--- /dev/null
+++ b/exodus/cbind/src/ex_put_map.c
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expmap - ex_put_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int*    elem_map                element order map array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_enddef, etc
+
+/*!
+\deprecated Use ex_put_num_map() instead.
+
+The function ex_put_map() writes out the optional element order map to
+the database. See #ElementOrderMap for a description of the element
+order map. The function ex_put_init() must be invoked before this call
+is made.
+
+In case of an error, ex_put_map() returns a negative number; a warning
+will return a positive number.  Possible causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  an element map already exists in the file.
+
+\param[in]   exoid    exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  elem_map  The element order map.
+
+The following code generates a default element order map and outputs
+it to an open exodus file. This is a trivial case and included just
+for illustration. Since this map is optional, it should be written out
+only if it contains something other than the default map.
+
+\code
+int error, exoid;
+int *elem_map = (int *)calloc(num_elem, sizeof(int));
+for (i=0; i < num_elem; i++) {
+   elem_map[i] = i+1;
+}
+error = ex_put_map(exoid, elem_map);
+\endcode
+
+ */
+
+int ex_put_map (int  exoid,
+                const void_int *elem_map)
+{
+  int numelemdim, dims[1], mapid, status;
+  int map_int_type;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire id's of previously defined dimensions  */
+
+  /* determine number of elements. Return if zero... */
+  if (nc_inq_dimid(exoid, DIM_NUM_ELEM, &numelemdim) != NC_NOERR)
+    {
+      return (EX_NOERR);
+    }
+
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to put file id %d into define mode",
+	    exoid);
+    ex_err("ex_put_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* create a variable array in which to store the element map  */
+  dims[0] = numelemdim;
+
+  map_int_type = NC_INT;
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+    map_int_type = NC_INT64;
+  }
+
+  if ((status = nc_def_var(exoid, VAR_MAP, map_int_type, 1, dims, &mapid)) != NC_NOERR) {
+    if (status == NC_ENAMEINUSE) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: element map already exists in file id %d",
+	      exoid);
+      ex_err("ex_put_map",errmsg,exerrval);
+    }
+    else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create element map array in file id %d",
+	      exoid);
+      ex_err("ex_put_map",errmsg,exerrval);
+    }
+    goto error_ret;         /* exit define mode and return */
+  }
+  ex_compress_variable(exoid, mapid, 1);
+
+  /* leave define mode  */
+  if ((status = nc_enddef (exoid)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to complete definition in file id %d",
+	      exoid);
+      ex_err("ex_put_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+
+  /* write out the element order map  */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_put_var_longlong(exoid, mapid, elem_map);
+  } else {
+    status = nc_put_var_int(exoid, mapid, elem_map);
+  }
+
+  if (status != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store element map in file id %d",
+	      exoid);
+      ex_err("ex_put_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+	      "Error: failed to complete definition for file id %d",
+	      exoid);
+      ex_err("ex_put_map",errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_map_param.c b/exodus/cbind/src/ex_put_map_param.c
new file mode 100644
index 0000000..f8bbbb2
--- /dev/null
+++ b/exodus/cbind/src/ex_put_map_param.c
@@ -0,0 +1,322 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expmp - ex_put_map_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_node_maps           number of node maps
+*       int     num_elem_maps           number of element maps
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <assert.h>                     // for assert
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+/*!
+ * defines the number of node and element maps. It is more efficient
+ * to define both of these at the same time; however, they can be
+ * defined in separate calls by setting only one of the counts to a
+ * non-zero value. It is an error to redefine the number of node or
+ * element maps.
+ * \param exoid                   exodus file id
+ * \param num_node_maps           number of node maps
+ * \param num_elem_maps           number of element maps
+ */
+
+int ex_put_map_param (int   exoid,
+                      int   num_node_maps,
+                      int   num_elem_maps)
+{
+  int dim[2], dimid, strdim, varid, status;
+  int var_nm_id, var_em_id;
+  int i;
+  char errmsg[MAX_ERR_LENGTH];
+  int id_type = NC_INT;
+  int int_type = NC_INT;
+  
+  exerrval = 0; /* clear error code */
+
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    id_type = NC_INT64;
+  }
+  if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+    int_type = NC_INT64;
+  }
+
+  /* return if these have been defined before */
+  if ( (num_node_maps > 0 && ((nc_inq_dimid (exoid, DIM_NUM_NM, &dimid)) == NC_NOERR)) || 
+       (num_elem_maps > 0 && ((nc_inq_dimid (exoid, DIM_NUM_EM, &dimid)) == NC_NOERR)) )
+    {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+	      "Error: number of maps already defined for file id %d",exoid);
+      ex_err("ex_put_map_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  if ( (num_node_maps > 0) || (num_elem_maps > 0) ) {
+
+    /* inquire previously defined dimensions  */
+    if ((status = nc_inq_dimid (exoid, DIM_STR_NAME, &strdim)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get string length in file id %d",exoid);
+      ex_err("ex_put_map_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+      
+    /* put file into define mode */
+    if ((status = nc_redef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to put file id %d into define mode", exoid);
+      ex_err("ex_put_map_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+      
+      
+    /* node maps: */
+    if (num_node_maps > 0) {
+	
+      if ((status = nc_def_dim(exoid, DIM_NUM_NM, num_node_maps, &dimid)) != NC_NOERR)
+	{
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to define number of node maps in file id %d",exoid);
+	  ex_err("ex_put_map_param",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+
+      /* node maps id array: */
+      dim[0] = dimid;
+      if ((status = nc_def_var(exoid, VAR_NM_PROP(1), id_type, 1, dim, &var_nm_id)) != NC_NOERR)
+	{
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to create node maps property array in file id %d",
+		  exoid);
+	  ex_err("ex_put_map_param",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+
+      /*   store property name as attribute of property array variable */
+      if ((status=nc_put_att_text(exoid, var_nm_id, ATT_PROP_NAME, 3, "ID")) != NC_NOERR)
+	{
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to store node map property name %s in file id %d",
+		  "ID",exoid);
+	  ex_err("ex_put_map_param",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+
+      /* Node map names... */
+      dim[0] = dimid;
+      dim[1] = strdim;
+	    
+      if (nc_def_var(exoid, VAR_NAME_NM, NC_CHAR, 2, dim, &varid) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define node map name array in file id %d",exoid);
+	ex_err("ex_put_map_param",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+      /* determine number of nodes */
+      if ((status = nc_inq_dimid (exoid, DIM_NUM_NODES, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: couldn't determine number of nodes in file id %d",
+		exoid);
+	ex_err("ex_put_node_map",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+	  
+      dim[0] = dimid;
+	
+      /* create variable array in which to store the node maps */
+      for (i=0; i < num_node_maps; i++) {
+	if ((status = nc_def_var(exoid,VAR_NODE_MAP(i+1),int_type,1,dim,&varid)) != NC_NOERR) {
+	  if (status == NC_ENAMEINUSE) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: node map %d already defined in file id %d",
+		    i,exoid);
+	    ex_err("ex_put_node_map",errmsg,exerrval);
+	  } else {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to create node map %d in file id %d",
+		    i,exoid);
+	    ex_err("ex_put_node_map",errmsg,exerrval);
+	  }
+	  goto error_ret;          /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, varid, 1);
+      }
+    }
+      
+    /* element maps: */
+    if (num_elem_maps > 0) {
+      if ((status = nc_def_dim (exoid, DIM_NUM_EM, num_elem_maps,&dimid)) != NC_NOERR)
+	{
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to define number of element maps in file id %d",
+		  exoid);
+	  ex_err("ex_put_map_param",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+
+      /* element maps id array: */
+      dim[0] = dimid;
+      if ((status = nc_def_var(exoid, VAR_EM_PROP(1), id_type, 1, dim, &var_em_id)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to create element maps property array in file id %d",
+		exoid);
+	ex_err("ex_put_map_param",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+      /*   store property name as attribute of property array variable */
+      if ((status=nc_put_att_text(exoid, var_em_id, ATT_PROP_NAME, 3, "ID")) != NC_NOERR)
+	{
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to store element map property name %s in file id %d",
+		  "ID",exoid);
+	  ex_err("ex_put_map_param",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+
+      /* Element map names... */
+      dim[0] = dimid;
+      dim[1] = strdim;
+	    
+      if ((status = nc_def_var(exoid, VAR_NAME_EM, NC_CHAR, 2, dim, &varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define element map name array in file id %d",exoid);
+	ex_err("ex_put_map_param",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+      /* determine number of elements */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_ELEM, &dimid)) != NC_NOERR)
+	{
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: couldn't determine number of elements in file id %d",
+		  exoid);
+	  ex_err("ex_put_elem_map",errmsg,exerrval);
+	  goto error_ret;         /* exit define mode and return */
+	}
+	
+      /* create variable array in which to store the element maps */
+      dim[0] = dimid;
+      for (i = 0; i < num_elem_maps; i++) {
+	if ((status = nc_def_var(exoid,VAR_ELEM_MAP(i+1),int_type,1,dim, &varid)) != NC_NOERR) {
+	  if (status == NC_ENAMEINUSE) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: element map %d already defined in file id %d",
+		    i,exoid);
+	    ex_err("ex_put_elem_map",errmsg,exerrval);
+	  }
+	  else {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to create element map %d in file id %d",
+		    i,exoid);
+	    ex_err("ex_put_elem_map",errmsg,exerrval);
+	  }
+	  goto error_ret;          /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, varid, 1);
+      }
+    }
+
+    /* leave define mode */
+    if ((status = nc_enddef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to complete variable definitions in file id %d",exoid);
+      ex_err("ex_put_map_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Fill the id arrays with EX_INVALID_ID */
+    {
+      int maxset = num_node_maps > num_elem_maps ? num_node_maps : num_elem_maps;
+      int *invalid_ids = malloc(maxset*sizeof(int));
+      for (i=0; i < maxset; i++) {
+	invalid_ids[i] = EX_INVALID_ID;
+      }
+      if (num_node_maps > 0) {
+	status = nc_put_var_int(exoid, var_nm_id, invalid_ids);
+	assert(status == NC_NOERR);
+      }
+      if (num_elem_maps > 0) {
+	status = nc_put_var_int(exoid, var_em_id, invalid_ids);
+	assert(status == NC_NOERR);
+      }
+      free(invalid_ids);
+    }
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+	      "Error: failed to complete definition for file id %d",
+	      exoid);
+      ex_err("ex_put_map_param",errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_n_attr.c b/exodus/cbind/src/ex_put_n_attr.c
new file mode 100644
index 0000000..0163f69
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_attr.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expatt - ex_put_n_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     blk_type                block type
+*       int     blk_id                  block id
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_attr, etc
+
+/*!
+ * \deprecated use ex_put_partial_attr()
+ *
+ * writes the attributes for an edge/face/element block
+ * \param   exoid                   exodus file id
+ * \param   blk_type                block type
+ * \param   blk_id                  block id
+ * \param   attrib                  array of attributes
+ */
+
+int ex_put_n_attr (int   exoid,
+		   ex_entity_type blk_type,
+		   ex_entity_id   blk_id,
+		   int64_t   start_entity,
+		   int64_t   num_entity,
+		   const void *attrib)
+{
+  return ex_put_partial_attr(exoid, blk_type, blk_id, start_entity, num_entity, attrib);
+}
diff --git a/exodus/cbind/src/ex_put_n_coord.c b/exodus/cbind/src/ex_put_n_coord.c
new file mode 100644
index 0000000..8c37a6e
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_coord.c
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expcor - ex_put_n_coord
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     start_node_num          starting index (1-based) of coordinates to be written.
+*       int     num_nodes               number of nodes to write coordinates for.
+*       float*  x_coord                 X coord array
+*       float*  y_coord                 y coord array
+*       float*  z_coord                 z coord array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_coord
+
+/*!
+ * \deprecated Use ex_put_partial_coord() instead.
+ * writes the coordinates of some of the nodes in the model
+ * Only writes the 'non-null' arrays.
+ * \param   exoid           exodus file id
+ * \param   start_node_num  the starting index (1-based) of the coordinates to be written
+ * \param   num_nodes       the number of nodes to write coordinates for.
+ * \param   x_coor          x coord array
+ * \param   y_coor          y coord array
+ * \param   z_coor          z coord array
+ */
+
+int ex_put_n_coord (int   exoid,
+                    int64_t start_node_num,
+                    int64_t num_nodes,
+		    const void *x_coor,
+		    const void *y_coor,
+		    const void *z_coor)
+{
+  return ex_put_partial_coord(exoid, start_node_num, num_nodes, x_coor, y_coor, z_coor);
+}
diff --git a/exodus/cbind/src/ex_put_n_elem_attr.c b/exodus/cbind/src/ex_put_n_elem_attr.c
new file mode 100644
index 0000000..0aa9f40
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_elem_attr.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_n_elem_attr()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      attrib             - Pointer to the attribute vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_attr, etc
+
+
+/*
+ * \deprecated Use ex_put_partial_attr() instead.
+ */
+
+int ex_put_n_elem_attr (int   exoid,
+                        ex_entity_id   elem_blk_id,
+                        int64_t   start_elem_num,
+                        int64_t   num_elems,
+                        void *attrib)
+{
+  return ex_put_partial_attr(exoid, EX_ELEM_BLOCK, elem_blk_id, start_elem_num, num_elems, attrib);
+}
diff --git a/exodus/cbind/src/ex_put_n_elem_conn.c b/exodus/cbind/src/ex_put_n_elem_conn.c
new file mode 100644
index 0000000..60fe83d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_elem_conn.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_n_elem_conn()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      connect            - Pointer to the connectivity vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_elem_conn, etc
+
+/*!
+ * \deprecated Use ex_put_partial_elem_conn() instead.
+ */
+
+int ex_put_n_elem_conn (int  exoid,
+			ex_entity_id  elem_blk_id,
+			int64_t  start_elem_num,
+			int64_t  num_elems,
+			const void_int *connect)
+{
+  return ex_put_partial_elem_conn(exoid, elem_blk_id, start_elem_num, num_elems, connect);
+}
diff --git a/exodus/cbind/src/ex_put_n_elem_num_map.c b/exodus/cbind/src/ex_put_n_elem_num_map.c
new file mode 100644
index 0000000..aa55e10
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_elem_num_map.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* ne_pennm - ex_put_n_elem_num_map
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	start_ent		first entry in elem_map
+*	int	num_ents		number of entries in node_map
+*       int*    elem_map                element numbering map array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_id_map, etc
+
+/*
+ * writes out a portion of the element numbering map to the database;
+ * this allows element numbers to be non-contiguous
+ */
+
+int ex_put_n_elem_num_map (int  exoid,
+                           int64_t  start_ent,
+                           int64_t  num_ents,
+                           const void_int *elem_map)
+{
+  return ex_put_partial_id_map(exoid, EX_ELEM_MAP, start_ent, num_ents, elem_map);
+}
diff --git a/exodus/cbind/src/ex_put_n_nodal_var.c b/exodus/cbind/src/ex_put_n_nodal_var.c
new file mode 100644
index 0000000..da5a9b9
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_nodal_var.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expnv - ex_put_n_nodal_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               whole time step number
+*       int     nodel_var_index         index of desired nodal variable
+*       int     start_node              index (1-based) of first node to put
+*       int     num_nodes               number of nodal points
+*       float*  nodal_var_vals          array of nodal variable values
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_nodal_var
+
+/*!
+ * writes the values of a single nodal variable for a partial block at
+ * one single time step to the database; assume the first time step
+ * and nodal variable index is 1 
+ * \param exoid            exodus file id 
+ * \param time_step        whole time step number 
+ * \param nodal_var_index  index of desired nodal variable 
+ * \param start_node       index of first node to write data for (1-based)
+ * \param num_nodes        number of nodal points
+ * \param nodal_var_vals   array of nodal variable values
+ */
+
+int ex_put_n_nodal_var (int   exoid,
+			int   time_step,
+			int   nodal_var_index,
+			int64_t   start_node,
+			int64_t   num_nodes, 
+			const void *nodal_var_vals)
+
+{
+  return ex_put_partial_nodal_var(exoid, time_step, nodal_var_index, start_node, num_nodes, nodal_var_vals);
+}
diff --git a/exodus/cbind/src/ex_put_n_node_num_map.c b/exodus/cbind/src/ex_put_n_node_num_map.c
new file mode 100644
index 0000000..a00ace1
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_node_num_map.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+*
+* ne_pnnnm - ex_put_n_node_num_map
+*
+* entry conditions - 
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	start_ent		first entry in node_map
+*	int	num_ents		number of entries in node_map
+*       int*    node_map                node numbering map
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_id_map, etc
+
+/*
+ * writes out the node numbering map to the database; allows node numbers
+ * to be non-contiguous
+ */
+
+int ex_put_n_node_num_map (int  exoid,
+                           int64_t  start_ent,
+                           int64_t  num_ents,
+                           const void_int *node_map)
+{
+  return ex_put_partial_id_map(exoid, EX_NODE_MAP, start_ent, num_ents, node_map);
+}
diff --git a/exodus/cbind/src/ex_put_n_node_set.c b/exodus/cbind/src/ex_put_n_node_set.c
new file mode 100644
index 0000000..a38dc27
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_node_set.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_n_node_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to read.
+ *      start_node_num     - The starting index of the nodes to be read.
+ *      num_nodes          - The number of nodes to read in.
+ *      node_set_node_list - List of node IDs in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <stddef.h>                     // for NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_set, etc
+
+/*
+ * \deprecated Use ex_put_partial_set() instead
+ */
+
+int ex_put_n_node_set (int   exoid,
+                       ex_entity_id   node_set_id,
+                       int64_t   start_node_num,
+                       int64_t   num_nodes,
+                       const void_int  *node_set_node_list)
+{
+  return ex_put_partial_set(exoid, EX_NODE_SET, node_set_id, start_node_num, num_nodes,
+			    node_set_node_list, NULL);
+}
diff --git a/exodus/cbind/src/ex_put_n_node_set_df.c b/exodus/cbind/src/ex_put_n_node_set_df.c
new file mode 100644
index 0000000..dd687cb
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_node_set_df.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_n_node_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to write.
+ *      start_num          - The starting index of the df's to be written.
+ *      num_df_to_get      - The number of distribution factors to write out.
+ *      node_set_dist_fact - List of node distribution factors in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"
+
+
+/*!
+ * \deprecated Use ex_put_partial_set_dist_fact()
+ */
+
+int ex_put_n_node_set_df (int   exoid,
+                          ex_entity_id   node_set_id,
+                          int64_t   start_num,
+                          int64_t   num_df_to_get,
+                          void *node_set_dist_fact)
+{
+  return ex_put_partial_set_dist_fact(exoid, EX_NODE_SET, node_set_id, start_num, num_df_to_get,
+				      node_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_put_n_one_attr.c b/exodus/cbind/src/ex_put_n_one_attr.c
new file mode 100644
index 0000000..d19a85a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_one_attr.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expoea - ex_put_n_one_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge, face, elem block)
+*       int     obj_id                  object id (edge, face, elem block ID)
+*       int     attrib_index            index of attribute to write
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_one_attr, etc
+
+/*!
+ * \deprecated Use ex_put_partial_one_attr() instead.
+ * writes the specified attribute for a block
+ * \param      exoid         exodus file id
+ * \param      obj_type      object type (edge, face, elem block)
+ * \param      obj_id        object id (edge, face, elem block ID)
+ * \param      start_num     the starting index of the attributes to be written
+ * \param      num_ent       the number of entities to write attributes for.
+ * \param      attrib_index  index of attribute to write
+ * \param      attrib        array of attributes
+ */
+
+int ex_put_n_one_attr( int   exoid,
+		       ex_entity_type obj_type,
+		       ex_entity_id   obj_id,
+		       int64_t   start_num,
+		       int64_t   num_ent,
+		       int   attrib_index,
+		       const void *attrib )
+{
+  return ex_put_partial_one_attr(exoid, obj_type, obj_id, start_num, num_ent, attrib_index, attrib);
+}
diff --git a/exodus/cbind/src/ex_put_n_side_set.c b/exodus/cbind/src/ex_put_n_side_set.c
new file mode 100644
index 0000000..0c08f53
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_side_set.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_n_side_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to read.
+ *      start_side_num     - The starting index of the sides to be read.
+ *      num_sides          - The number of sides to read in.
+ *      side_set_elem_list - List of element IDs in side set.
+ *      side_set_side_list - List of side IDs in side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_set, etc
+
+
+/*!
+ * /deprecated use ex_put_partial_set() instead
+ */
+
+int ex_put_n_side_set (int   exoid,
+                       ex_entity_id   side_set_id,
+                       int64_t   start_side_num,
+                       int64_t   num_sides,
+                       const void_int  *side_set_elem_list,
+                       const void_int  *side_set_side_list)
+{
+  return ex_put_partial_set(exoid, EX_SIDE_SET, side_set_id, start_side_num, num_sides,
+			    side_set_elem_list, side_set_side_list);
+}
diff --git a/exodus/cbind/src/ex_put_n_side_set_df.c b/exodus/cbind/src/ex_put_n_side_set_df.c
new file mode 100644
index 0000000..cf3c013
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_side_set_df.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_n_side_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to written.
+ *      start_num          - The starting index of the df's to be written.
+ *      num_df_to_get      - The number of sides to write.
+ *      side_set_dist_fact - List of distribution factors for the side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"
+
+
+/*!
+ * \deprecated use ex_put_partial_set_dist_fact() instead 
+ */
+
+int ex_put_n_side_set_df (int   exoid,
+                          ex_entity_id   side_set_id,
+                          int64_t   start_num,
+                          int64_t   num_df_to_get,
+                          void *side_set_dist_fact)
+{
+  return ex_put_partial_set_dist_fact(exoid, EX_SIDE_SET, side_set_id, start_num, num_df_to_get, side_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_put_n_var.c b/exodus/cbind/src/ex_put_n_var.c
new file mode 100644
index 0000000..deedc4a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_n_var.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvar - ex_put_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     var_type                type (edge block, face block, edge set, ... )
+*       int     var_index               element variable index
+*       int     obj_id                  element block id
+*       int     start_num               starting index of the variables to be written
+*       int     num_ent                 number of entities to write variables for.
+*
+* exit conditions -
+*
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_var, etc
+
+/*!
+ * \deprecated use ex_put_partial_var() instead 
+ * writes the values of a single variable for a partial block at one time
+ * step to the database; assume the first time step and variable index
+ * are 1
+ * \param      exoid           exodus file id
+ * \param      time_step       time step number
+ * \param      var_type        type (edge block, face block, edge set, ... )
+ * \param      var_index       element variable index
+ * \param      obj_id          element block id
+ * \param      start_index     index of first entity in block to write (1-based)
+ * \param      num_entities    number of entries in this block/set
+ * \param      var_vals        the values to be written
+ */
+
+int ex_put_n_var (int   exoid,
+		  int   time_step,
+		  ex_entity_type var_type,
+		  int   var_index,
+		  ex_entity_id   obj_id,
+		  int64_t   start_index,
+		  int64_t   num_entities,
+		  const void *var_vals)
+{
+  return ex_put_partial_var(exoid, time_step, var_type, var_index, obj_id, start_index, num_entities, var_vals);
+}
diff --git a/exodus/cbind/src/ex_put_name.c b/exodus/cbind/src/ex_put_name.c
new file mode 100644
index 0000000..a06103c
--- /dev/null
+++ b/exodus/cbind/src/ex_put_name.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expnam - ex_put_name
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid          exodus file id
+*       int     obj_type       object type
+*       int     entity_id      id of entity name to write
+*       char*   name           ptr to entity name
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR
+
+/*!
+ * writes the name of the specified entity to the database. The entity
+ * with id `entity_id` must exist before calling ex_put_name().
+ *
+ * \param  exoid          exodus file id
+ * \param  obj_type       object type
+ * \param  entity_id      id of entity name to write
+ * \param  name           ptr to entity name
+ */
+
+int ex_put_name (int   exoid,
+		 ex_entity_type obj_type,
+		 ex_entity_id   entity_id,
+		 const char *name)
+{
+  int status;
+  int varid, ent_ndx; 
+  char errmsg[MAX_ERR_LENGTH];
+  const char *routine = "ex_put_name";
+  const char *vobj;
+   
+  exerrval = 0; /* clear error code */
+
+  switch(obj_type) {
+  case EX_EDGE_BLOCK:
+    vobj = VAR_NAME_ED_BLK;
+    break;
+  case EX_FACE_BLOCK:
+    vobj = VAR_NAME_FA_BLK;
+    break;
+  case EX_ELEM_BLOCK:
+    vobj = VAR_NAME_EL_BLK;
+    break;
+  case EX_NODE_SET:
+    vobj = VAR_NAME_NS;
+    break;
+  case EX_SIDE_SET:
+    vobj = VAR_NAME_SS;
+    break;
+  case EX_EDGE_SET:
+    vobj = VAR_NAME_ES;
+    break;
+  case EX_FACE_SET:
+    vobj = VAR_NAME_FS;
+    break;
+  case EX_ELEM_SET:
+    vobj = VAR_NAME_ELS;
+    break;
+  case EX_NODE_MAP:
+    vobj = VAR_NAME_NM;
+    break;
+  case EX_EDGE_MAP:
+    vobj = VAR_NAME_EDM;
+    break;
+  case EX_FACE_MAP:
+    vobj = VAR_NAME_FAM;
+    break;
+  case EX_ELEM_MAP:
+    vobj = VAR_NAME_EM;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: Invalid type specified in file id %d", exoid);
+    ex_err(routine,errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  if ((status = nc_inq_varid(exoid, vobj, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s names in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  ent_ndx = ex_id_lkup(exoid, obj_type, entity_id);
+
+  if (exerrval == EX_LOOKUPFAIL) {   /* could not find the element block id */
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+            "Error: %s id %"PRId64" not found in file id %d",
+	    ex_name_of_object(obj_type), entity_id, exoid);
+    ex_err("ex_put_name",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* If this is a null entity, then 'ent_ndx' will be negative.
+   * We don't care in this routine, so make it positive and continue...
+   */
+  if (ent_ndx < 0) ent_ndx = -ent_ndx;
+   
+  /* write EXODUS entityname */
+  status = ex_put_name_internal(exoid, varid, ent_ndx-1, name, obj_type, "", routine);
+
+  return(status);
+}
diff --git a/exodus/cbind/src/ex_put_names.c b/exodus/cbind/src/ex_put_names.c
new file mode 100644
index 0000000..f37bc51
--- /dev/null
+++ b/exodus/cbind/src/ex_put_names.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expnam - ex_put_names
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid       exodus file id
+*       int     obj_type    object type
+*       char*   names       ptr array of entity names
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for NULL
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR
+
+/*!
+ * writes the entity names to the database
+ * \param exoid       exodus file id
+ * \param obj_type    object type
+ * \param names       ptr array of entity names
+ */
+
+int ex_put_names (int   exoid,
+		  ex_entity_type obj_type,
+		  char* names[])
+{
+  int status;
+  int varid; 
+  size_t num_entity;
+  char errmsg[MAX_ERR_LENGTH];
+
+  const char *vname = NULL;
+   
+  const char *routine = "ex_put_names";
+   
+  exerrval = 0; /* clear error code */
+
+  switch (obj_type) {
+    /*  ======== BLOCKS ========= */
+  case EX_EDGE_BLOCK:
+    vname = VAR_NAME_ED_BLK;
+    break;
+  case EX_FACE_BLOCK:
+    vname = VAR_NAME_FA_BLK;
+    break;
+  case EX_ELEM_BLOCK:
+    vname = VAR_NAME_EL_BLK;
+    break;
+
+    /*  ======== SETS ========= */
+  case EX_NODE_SET:
+    vname = VAR_NAME_NS;
+    break;
+  case EX_EDGE_SET:
+    vname = VAR_NAME_ES;
+    break;
+  case EX_FACE_SET:
+    vname = VAR_NAME_FS;
+    break;
+  case EX_SIDE_SET:
+    vname = VAR_NAME_SS;
+    break;
+  case EX_ELEM_SET:
+    vname = VAR_NAME_ELS;
+    break;
+
+    /*  ======== MAPS ========= */
+  case EX_NODE_MAP:
+    vname = VAR_NAME_NM;
+    break;
+  case EX_EDGE_MAP:
+    vname = VAR_NAME_EDM;
+    break;
+  case EX_FACE_MAP:
+    vname = VAR_NAME_FAM;
+    break;
+  case EX_ELEM_MAP:
+    vname = VAR_NAME_EM;
+    break;
+
+    /*  ======== ERROR (Invalid type) ========= */
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: Invalid type specified in file id %d", exoid);
+    ex_err(routine,errmsg,exerrval);
+    return(EX_FATAL);
+  }
+   
+  ex_get_dimension(exoid, ex_dim_num_objects(obj_type), ex_name_of_object(obj_type),
+		   &num_entity, &varid, routine);
+
+  if ((status = nc_inq_varid(exoid, vname, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s names in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write EXODUS entitynames */
+  status = ex_put_names_internal(exoid, varid, num_entity, names, obj_type, "", routine);
+
+  return(status);
+}
diff --git a/exodus/cbind/src/ex_put_nodal_var.c b/exodus/cbind/src/ex_put_nodal_var.c
new file mode 100644
index 0000000..d5826ea
--- /dev/null
+++ b/exodus/cbind/src/ex_put_nodal_var.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_WARN, ex_comp_ws, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+The function ex_put_nodal_var() writes the values of a single nodal
+variable for a single time step. The function ex_put_variable_param()
+must be invoked before this call is made.
+
+Because nodal variables are floating point values, the application
+code must declare the array passed to be the appropriate type (\c
+float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_put_nodal_var() returns a negative number; a
+warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  ex_put_variable_param() not called previously specifying the number of nodal variables.
+
+
+\param[in] exoid              exodus file ID returned from a previous call to ex_create() or
+                              ex_open().
+
+\param[in] time_step          The time step number, as described under ex_put_time(). This
+                              is essentially a counter that is incremented when results variables
+			      are output. The first time step is 1.
+
+\param[in] nodal_var_index    The index of the nodal variable. The first variable has an index of 1.
+
+\param[in] num_nodes          The number of nodal points.
+
+\param[in]  nodal_var_vals    Array of \c num_nodes values of the \c nodal_var_index-th nodal
+                              variable for the \c time_step-th time step.
+
+
+As an example, the following code segment writes all the nodal
+variables for a single time step:
+
+\code
+int num_nod_vars, num_nodes, error, exoid, time_step;
+float *nodal_var_vals;
+
+\comment{write nodal variables}
+nodal_var_vals = (float *) calloc(num_nodes, sizeof(float));
+for (k=1; k <= num_nod_vars; k++) {
+   for (j=0; j < num_nodes; j++) {
+      \comment{application code fills in this array}
+      nodal_var_vals[j] = 10.0;
+   }
+   error = ex_put_nodal_var(exoid, time_step, k, num_nodes,
+                            nodal_var_vals);
+}
+\endcode
+
+*/
+
+int ex_put_nodal_var (int   exoid,
+                      int   time_step,
+                      int   nodal_var_index,
+                      int64_t num_nodes, 
+                      const void *nodal_var_vals)
+
+{
+  int status;
+  int varid;
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if (ex_large_model(exoid) == 0) {
+    /* write values of the nodal variable */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variables in file id %d",
+              exoid);
+      ex_err("ex_put_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+    start[0] = --time_step;
+    start[1] = --nodal_var_index;
+    start[2] = 0;
+
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = num_nodes;
+  } else {
+    /* nodal variables stored separately, find variable for this variable
+       index */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR_NEW(nodal_var_index), &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_put_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = 0;
+
+    count[0] = 1;
+    count[1] = num_nodes;
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, varid, start, count, nodal_var_vals);
+  } else {
+    status = nc_put_vara_double(exoid, varid, start, count, nodal_var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store nodal variables in file id %d",
+	    exoid);
+    ex_err("ex_put_nodal_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_nodal_var_slab.c b/exodus/cbind/src/ex_put_nodal_var_slab.c
new file mode 100644
index 0000000..90fba42
--- /dev/null
+++ b/exodus/cbind/src/ex_put_nodal_var_slab.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_nodal_var_slab()
+ *
+ *****************************************************************************
+ *   
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      time_step          - The time step to write this data to.
+ *      nodal_var_index    - The index of this nodal variable.
+ *      start_pos          - The start point for outputting data. The first
+ *                           value is 0.
+ *      num_vals           - The number of values to be output.
+ *      nodal_var_vals     - Pointer to the vector of values to be output.
+ */    
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_WARN, ex_comp_ws, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+
+/*
+ * writes the values of a single nodal variable for a single time step to 
+ * the database; assume the first time step and nodal variable index
+ * is 1
+ */
+
+int ex_put_nodal_var_slab (int   exoid,
+                           int   time_step,
+                           int   nodal_var_index,
+                           int64_t   start_pos,
+                           int64_t   num_vals,
+                           void *nodal_var_vals)
+
+{
+  int status;
+  int varid;
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined variable  -- if not found assume that
+     the new separate 'blob' per nodal var storage is being used */
+
+  if (ex_large_model(exoid) == 0) {
+    /* write values of the nodal variable */
+    if ((status = nc_inq_varid (exoid, VAR_NOD_VAR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_put_nodal_var_slab",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = --nodal_var_index;
+    start[2] = --start_pos;
+
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = num_vals;
+  } else {
+
+    /* nodal variables stored separately, find variable for this variable
+       index */
+    if ((status = nc_inq_varid (exoid, VAR_NOD_VAR_NEW(nodal_var_index), &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_put_nodal_var_slab",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = --start_pos;
+
+    count[0] = 1;
+    count[1] = num_vals;
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, varid, start, count, nodal_var_vals);
+  } else {
+    status = nc_put_vara_double(exoid, varid, start, count, nodal_var_vals);
+  }
+  
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store nodal variables in file id %d",
+	    exoid);
+    ex_err("ex_put_nodal_var_slab",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_node_cmap.c b/exodus/cbind/src/ex_put_node_cmap.c
new file mode 100644
index 0000000..4097398
--- /dev/null
+++ b/exodus/cbind/src/ex_put_node_cmap.c
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/****************************************************************************/
+/****************************************************************************/
+/****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_node_cmap()
+ ****************************************************************************
+ * This function outputs a nodal communication map.
+ ****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      map_id          - The ID of the nodal communication map to retrieve.
+ *      node_ids        - Pointer to vector containing the FEM node IDs
+ *                        that make up this communication map.
+ *      proc_ids        - Pointer to vector containing the processors IDs
+ *                        associated with each of the nodes in this nodal
+ *                        communication map.
+ *      processor       - The processor the file is being written for.
+ */
+/****************************************************************************/
+/****************************************************************************/
+/****************************************************************************/
+
+#include <exodusII.h>                   // for ex_err, exerrval, etc
+#include <exodusII_int.h>               // for EX_FATAL, DIM_NCNT_CMAP, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_node_cmap(int  exoid,
+                     ex_entity_id  map_id,
+                     void_int *node_ids,
+                     void_int *proc_ids,
+                     int  processor
+                     )
+{
+  const char   *func_name="ex_put_node_cmap";
+
+  int     map_idx, varid, dimid, status;
+  size_t  start[1], count[1], ret_val;
+  int64_t varidx[2];
+  int     value;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* get the index for the comm map information variables */
+  if (ex_get_idx(exoid, VAR_N_COMM_INFO_IDX, varidx, processor) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_N_COMM_INFO_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the index for this map_id */
+  if ((map_idx=ne_id_lkup(exoid, VAR_N_COMM_IDS, varidx, map_id)) == -1) {
+    sprintf(errmsg,
+            "Error: failed to find index for variable \"%s\" in file ID %d",
+            VAR_N_COMM_IDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /*
+   * Find out if this is a NULL comm map by checking it's entry in
+   * the status vector.
+   */
+  if ((status = nc_inq_varid(exoid, VAR_N_COMM_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_N_COMM_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  start[0] = map_idx;
+  if ((status = nc_get_var1_int(exoid, varid, start, &value)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: unable to get variable \"%s\" from file ID %d",
+            VAR_N_COMM_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (value == 0) return(EX_NOERR);   /* NULL set */
+
+  /* now I need to get the comm map data index */
+  if (ex_get_idx(exoid, VAR_N_COMM_DATA_IDX, varidx, map_idx) == -1) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find index variable, \"%s\", in file ID %d",
+            VAR_N_COMM_DATA_IDX, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* check if I need to get the dimension of the cmap data */
+  if (varidx[1] == -1) {
+    /* Get the size of the comm maps */
+    if ((status = nc_inq_dimid(exoid, DIM_NCNT_CMAP, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get dimension ID for \"%s\" in file ID %d",
+              DIM_NCNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    if ((status = nc_inq_dimlen(exoid, dimid, &ret_val)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find length of dimension \"%s\" in file ID %d",
+              DIM_NCNT_CMAP, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    varidx[1] = ret_val;
+  } /* "if (varidx[1]==-1)" */
+
+  start[0] = varidx[0];
+  count[0] = varidx[1] - varidx[0];
+  
+  /* Output the node IDs for this comm map */
+  if ((status = nc_inq_varid(exoid, VAR_N_COMM_NIDS, &varid )) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_N_COMM_NIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, varid, start, count, node_ids);
+  } else {
+    status = nc_put_vara_int(exoid, varid, start, count, node_ids);
+  }
+  if (status != NC_NOERR) {
+    fprintf(stderr, "Start, Count = %"ST_ZU"\t%"ST_ZU"\n", start[0], count[0]);
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output vector \"%s\" in file ID %d",
+            VAR_N_COMM_NIDS, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Output the processor IDs for this map */
+  if ((status = nc_inq_varid(exoid, VAR_N_COMM_PROC, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_N_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, varid, start, count, proc_ids);
+  } else {
+    status = nc_put_vara_int(exoid, varid, start, count, proc_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" in file ID %d",
+            VAR_N_COMM_PROC, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_node_map.c b/exodus/cbind/src/ex_put_node_map.c
new file mode 100644
index 0000000..7336873
--- /dev/null
+++ b/exodus/cbind/src/ex_put_node_map.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expnm - ex_put_node_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  node map id
+*       int     *node_map               node map
+*
+* exit conditions - 
+*
+*****************************************************************************/
+
+#include "exodusII.h"
+
+/*!
+ * writes an node map; this is a vector of integers of length number
+ * of nodes
+ * \param    exoid                   exodus file id
+ * \param    map_id                  node map id
+ * \param    node_map                node map
+ * \deprecated Use ex_put_num_map()(exoid, EX_NODE_MAP, map_id, node_map)
+ */
+
+int ex_put_node_map (int exoid,
+                     ex_entity_id map_id,
+                     const void_int *node_map)
+{
+  return ex_put_num_map( exoid, EX_NODE_MAP, map_id, node_map );
+}
diff --git a/exodus/cbind/src/ex_put_node_num_map.c b/exodus/cbind/src/ex_put_node_num_map.c
new file mode 100644
index 0000000..fbbad51
--- /dev/null
+++ b/exodus/cbind/src/ex_put_node_num_map.c
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include "exodusII.h"
+
+/*!
+
+\deprecated Use ex_put_id_map()(exoid, EX_NODE_MAP, node_map)
+
+The function ex_put_node_num_map() writes out the optional node number
+map to the database. See Section LocalNodeIds for a description of the
+node number map. The function ex_put_init() must be invoked before
+this call is made.
+
+\return In case of an error, ex_put_node_num_map() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  a node number map already exists in the file.
+
+\param[in]  exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  node_map  The node number map.
+
+The following code generates a default node number map and outputs it
+to an open exodus file. This is a trivial case and included just for
+illustration. Since this map is optional, it should be written out
+only if it contains something other than the default map.
+
+\code
+int error, exoid;
+int *node_map = (int *)calloc(num_nodes, sizeof(int));
+
+for (i=1; i <= num_nodes; i++)
+   node_map[i-1] = i;
+
+error = ex_put_node_num_map(exoid, node_map);
+
+\comment{Equivalent using non-deprecated function}
+error = ex_put_id_map(exoid, EX_NODE_MAP, node_map);
+\endcode
+ */
+
+int ex_put_node_num_map (int  exoid,
+                         const void_int *node_map)
+{
+  return ex_put_id_map(exoid, EX_NODE_MAP, node_map);
+}
diff --git a/exodus/cbind/src/ex_put_node_set.c b/exodus/cbind/src/ex_put_node_set.c
new file mode 100644
index 0000000..0471d96
--- /dev/null
+++ b/exodus/cbind/src/ex_put_node_set.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for NULL
+#include "exodusII.h"                   // for ex_put_set, ex_entity_id, etc
+
+/*!
+\deprecated Use ex_put_set()(exoid, EX_NODE_SET, node_set_id, node_set_node_list, NULL)
+
+The function ex_put_node_set() writes the node list for a single node
+set. The function ex_put_node_set_param() must be called before this
+routine is invoked.
+
+\return In case of an error, ex_put_node_set() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  ex_put_node_set_param() not called previously.
+
+\param[in] exoid              exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] node_set_id        The node set ID.
+\param[in] node_set_node_list Array containing the node list for the node set. Internal node IDs are
+                              used in this list (See Section LocalNodeIds).
+
+Refer to the description of ex_put_node_set_param() for a sample code
+segment to write out a node set.
+*/
+
+int ex_put_node_set (int   exoid,
+                     ex_entity_id   node_set_id,
+                     const void_int  *node_set_node_list)
+{
+  return ex_put_set(exoid, EX_NODE_SET, node_set_id,
+		    node_set_node_list, NULL);
+}
diff --git a/exodus/cbind/src/ex_put_node_set_dist_fact.c b/exodus/cbind/src/ex_put_node_set_dist_fact.c
new file mode 100644
index 0000000..4fb9287
--- /dev/null
+++ b/exodus/cbind/src/ex_put_node_set_dist_fact.c
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include "exodusII.h"
+
+/*!
+\deprecated Use ex_put_set_dist_fact()(exoid, EX_NODE_SET, node_set_id, node_set_dist_fact)
+
+The function ex_put_node_set_dist_fact() writes node set distribution
+factors for a single node set. The function ex_put_node_set_param()
+must be called before this routine is invoked.
+
+Because the distribution factors are floating point values, the
+application code must declare the array passed to be the appropriate
+type (\c float or \c double) to match the compute word size passed in
+ex_create() or ex_open().
+
+\return In case of an error, ex_put_node_set_dist_fact() returns a
+negative number; a warning will return a positive number.  Possible
+causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  ex_put_node_set_param() not called previously.
+  -  a call to ex_put_node_set_param() specified zero distribution factors.
+
+\param[in] exoid              exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] node_set_id        The node set ID.
+\param[in] node_set_dist_fact Array containing the distribution factors in the node set.
+
+Refer to the description of ex_put_node_set_param() for a sample code
+segment to write out the distribution factors for a node set.
+*/
+
+int ex_put_node_set_dist_fact  (int   exoid,
+                                ex_entity_id   node_set_id,
+                                const void *node_set_dist_fact)
+{
+  return ex_put_set_dist_fact(exoid, EX_NODE_SET, node_set_id,
+			      node_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_put_node_set_param.c b/exodus/cbind/src/ex_put_node_set_param.c
new file mode 100644
index 0000000..1b30bef
--- /dev/null
+++ b/exodus/cbind/src/ex_put_node_set_param.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_set_param, etc
+
+/*!
+\deprecated Use ex_put_set_param()(exoid, EX_NODE_SET, node_set_id, num_nodes_in_set, num_dist_in_set)
+
+The function ex_put_node_set_param() writes the node set ID, the
+number of nodes which describe a single node set, and the number of
+node set distribution factors for the node set.
+
+\return In case of an error, ex_put_node_set_param() returns a
+negative number; a warning will return a positive number.  Possible
+causes of errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  the number of node sets specified in the call to ex_put_init() was zero or has been exceeded.
+  -  a node set with the same ID has already been stored.
+  -  the specified number of distribution factors is not zero and is not equal to the number of nodes.
+
+\param[in] exoid              exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] node_set_id        The node set ID.
+\param[in] num_nodes_in_set   The number of nodes in the node set.
+\param[in] num_dist_in_set    The number of distribution factors in the node set. This should be
+                              either 0 (zero) for no factors, or should equal \c num_nodes_in_set.
+
+
+The following code segment will write out a node set to an open exodus
+file :
+
+\code
+int id, num_nodes_in_set, num_dist_in_set, error, exoid, *node_list;
+float *dist_fact;
+
+\comment{write node set parameters}
+id = 20; num_nodes_in_set = 5; num_dist_in_set = 5;
+error = ex_put_node_set_param(exoid, id, num_nodes_in_set, 
+                              num_dist_in_set);
+
+\comment{write node set node list}
+node_list = (int *) calloc (num_nodes_in_set, sizeof(int));
+node_list[0] = 100; node_list[1] = 101; node_list[2] = 102;
+node_list[3] = 103; node_list[4] = 104;
+
+error = ex_put_node_set(exoid, id, node_list);
+
+\comment{write node set distribution factors}
+dist_fact = (float *) calloc (num_dist_in_set, sizeof(float));
+dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+error = ex_put_node_set_dist_fact(exoid, id, dist_fact);
+
+\comment{Same result using non-deprecated functions}
+error = ex_put_set_param(exoid, EX_NODE_SET, id, num_nodes_in_set, num_dist_in_set);
+error = ex_put_set(exoid, EX_NODE_SET, id, node_list);
+error = ex_put_set_dist_fact(exoid, EX_NODE_SET, id, dist_fact);
+\endcode
+ */
+
+int ex_put_node_set_param (int exoid,
+                           ex_entity_id node_set_id,
+                           int64_t num_nodes_in_set,
+                           int64_t num_dist_in_set)
+{
+  return ex_put_set_param(exoid, EX_NODE_SET, node_set_id, num_nodes_in_set, num_dist_in_set);
+}
diff --git a/exodus/cbind/src/ex_put_ns_param_global.c b/exodus/cbind/src/ex_put_ns_param_global.c
new file mode 100644
index 0000000..c4ab44d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_ns_param_global.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_ns_param_global()
+ *****************************************************************************
+ * This function outputs the global node-set parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      global_ids      - Pointer to a vector of global node-set IDs.
+ *      node_cnts       - Pointer to a vector of global node counts in
+ *                        each global node set.
+ *      df_cnts         - Pointer to a vector of global distribution
+ *                        factors in each global node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stdio.h>
+#include <netcdf.h>
+
+#include <exodusII.h>
+#include <exodusII_int.h>
+
+int ex_put_ns_param_global(int exoid,
+                           void_int *global_ids,
+                           void_int *node_cnts,
+                           void_int *df_cnts
+                           )
+{
+  const char   *func_name="ex_put_ns_param_global";
+  int     varid, status;
+
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the variable ID for the vector of global node set IDs */
+  if ((status = nc_inq_varid(exoid, VAR_NS_IDS_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_NS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the vector of global node set IDs */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, global_ids);
+  } else {
+    status = nc_put_var_int(exoid, varid, global_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" to file ID %d",
+            VAR_NS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the vector of global node-set node counts */
+  if ((status = nc_inq_varid(exoid, VAR_NS_NODE_CNT_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_NS_NODE_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the vector of global node counts in each global node set */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, node_cnts);
+  } else {
+    status = nc_put_var_int(exoid, varid, node_cnts);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put variable \"%s\" in file ID %d",
+            VAR_NS_NODE_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the number of dist. factors in each node set */
+  if ((status = nc_inq_varid(exoid, VAR_NS_DF_CNT_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_NS_DF_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the vector of dist. factor counts */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, df_cnts);
+  } else {
+    status = nc_put_var_int(exoid, varid, df_cnts);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" in file ID %d",
+            VAR_NS_DF_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_nset_var.c b/exodus/cbind/src/ex_put_nset_var.c
new file mode 100644
index 0000000..bb90e09
--- /dev/null
+++ b/exodus/cbind/src/ex_put_nset_var.c
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expmv - ex_put_nset_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     nset_var_index          nodeset variable index
+*       int     nset_id                 nodeset id
+*       int     num_nodes_this_nset     number of nodes in this nodeset
+*
+* exit conditions -
+*
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_var, ex_entity_id, etc
+
+/*!
+ * writes the values of a single nodeset variable for one nodeset at 
+ * one time step to the database; assume the first time step and 
+ * nodeset variable index are 1
+ * \param      exoid                   exodus file id
+ * \param      time_step               time step number
+ * \param      nset_var_index          nodeset variable index
+ * \param      nset_id                 nodeset id
+ * \param      num_nodes_this_nset     number of nodes in this nodeset
+ * \param      nset_var_vals           the values to be written
+ * \deprecated Use ex_put_var()(exoid, time_step, EX_NODE_SET, nset_var_index, nset_id, num_nodes_this_nset, nset_var_vals)
+
+ */
+
+int ex_put_nset_var (int   exoid,
+                     int   time_step,
+                     int   nset_var_index,
+                     ex_entity_id  nset_id,
+                     int64_t num_nodes_this_nset,
+                     const void *nset_var_vals)
+{
+  return ex_put_var(exoid, time_step, EX_NODE_SET, nset_var_index,
+		    nset_id, num_nodes_this_nset, nset_var_vals);
+}
diff --git a/exodus/cbind/src/ex_put_nset_var_tab.c b/exodus/cbind/src/ex_put_nset_var_tab.c
new file mode 100644
index 0000000..e5c54dc
--- /dev/null
+++ b/exodus/cbind/src/ex_put_nset_var_tab.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expnstt - ex_put_nset_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_nset                number of nodesets
+*       int     num_nset_var            number of nodeset variables
+*       int*    nset_var_tab            nodeset variable truth table array
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_truth_table, etc
+
+/*!
+ * writes the EXODUS II nodeset variable truth table to the database; 
+ * also, creates netCDF variables in which to store EXODUS II nodeset
+ * variable values; although this table isn't required (because the
+ * netCDF variables can also be created in ex_put_nset_var), this call
+ * will save tremendous time because all of the variables are defined
+ * at once while the file is in define mode, rather than going in and out
+ * of define mode (causing the entire file to be copied over and over)
+ * which is what occurs when the nodeset variable values variables are
+ * defined in ex_put_nset_var
+ * \param      exoid                   exodus file id
+ * \param      num_nset                number of nodesets
+ * \param      num_nset_var            number of nodeset variables
+ * \param      nset_var_tab            nodeset variable truth table array
+ * \deprecated Use ex_put_truth_table()(exoid, EX_NODE_SET, num_nset, num_nset_var, nset_var_tab)
+ */
+
+int ex_put_nset_var_tab (int  exoid,
+                         int  num_nset,
+                         int  num_nset_var,
+                         int *nset_var_tab)
+{
+  return ex_put_truth_table(exoid, EX_NODE_SET, num_nset, num_nset_var, nset_var_tab);
+}
diff --git a/exodus/cbind/src/ex_put_num_map.c b/exodus/cbind/src/ex_put_num_map.c
new file mode 100644
index 0000000..e77d96e
--- /dev/null
+++ b/exodus/cbind/src/ex_put_num_map.c
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expem - ex_put_num_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_type                type of map (node,edge,face,elem)
+*       int     map_id                  id to associate with new map
+*       int     *map_data               map set value array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+ * writes a map; this is a vector of integers of the same length as the
+ * number of entries in the source object (nodes, edges, faces, or elements
+ * in the file).
+ * \param   exoid                   exodus file id
+ * \param   map_type                type of map (node,edge,face,elem)
+ * \param   map_id                  id to associate with new map
+ * \param   map                    map set value array
+ */
+
+int ex_put_num_map ( int exoid,
+                     ex_entity_type map_type,
+                     ex_entity_id   map_id,
+                     const void_int *map )
+{
+  int dimid, varid;
+  int map_int_type;
+  size_t start[1]; 
+  int ldum;
+  int num_maps;
+  size_t num_entries;
+  int cur_num_maps;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumentries;
+  const char* dnummaps;
+  const char* vmapids;
+  const char* vmap;
+  int status;
+   
+  exerrval = 0; /* clear error code */
+
+  switch ( map_type ) {
+  case EX_NODE_MAP:
+    dnumentries = DIM_NUM_NODES;
+    dnummaps = DIM_NUM_NM;
+    vmapids = VAR_NM_PROP(1);
+    break;
+  case EX_EDGE_MAP:
+    dnumentries = DIM_NUM_EDGE;
+    dnummaps = DIM_NUM_EDM;
+    vmapids = VAR_EDM_PROP(1);
+    break;
+  case EX_FACE_MAP:
+    dnumentries = DIM_NUM_FACE;
+    dnummaps = DIM_NUM_FAM;
+    vmapids = VAR_FAM_PROP(1);
+    break;
+  case EX_ELEM_MAP:
+    dnumentries = DIM_NUM_ELEM;
+    dnummaps = DIM_NUM_EM;
+    vmapids = VAR_EM_PROP(1);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg,
+	     "Error: Bad map type (%d) specified for file id %d",
+	     map_type, exoid );
+    ex_err( "ex_put_num_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  /* Make sure the file contains entries */
+  if (nc_inq_dimid (exoid, dnumentries, &dimid) != NC_NOERR )
+    {
+      return (EX_NOERR);
+    }
+
+  /* first check if any maps are specified */
+  if ((status = nc_inq_dimid (exoid, dnummaps, &dimid)) != NC_NOERR )
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: no %ss specified in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  /* Check for duplicate map id entry */
+  ex_id_lkup(exoid,map_type,map_id); 
+  if (exerrval != EX_LOOKUPFAIL)   /* found the map id */
+    {
+      sprintf(errmsg,
+	      "Error: %s %"PRId64" already defined in file id %d",
+	      ex_name_of_object(map_type),map_id,exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return(EX_FATAL);
+    }
+
+  /* Get number of maps initialized for this file */
+  if ((status = nc_inq_dimlen(exoid,dimid,&num_entries)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of %ss in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  num_maps = num_entries;
+
+  /* Keep track of the total number of maps defined using a counter stored
+     in a linked list keyed by exoid.
+     NOTE: ex_get_file_item  is used to find the number of maps
+     for a specific file and returns that value.
+  */
+  cur_num_maps = ex_get_file_item(exoid, ex_get_counter_list(map_type));
+  if (cur_num_maps >= num_maps) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: exceeded number of %ss (%d) specified in file id %d",
+	    ex_name_of_object(map_type),num_maps,exoid);
+    ex_err("ex_put_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /*   NOTE: ex_inc_file_item  is used to find the number of maps
+       for a specific file and returns that value incremented. */
+  cur_num_maps = ex_inc_file_item(exoid, ex_get_counter_list(map_type));
+
+  /* write out information to previously defined variable */
+
+  /* first get id of variable */
+  if ((status = nc_inq_varid (exoid, vmapids, &varid)) == -1)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %s ids in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  /* then, write out map id */
+  start[0] = cur_num_maps;
+
+  ldum = (int)map_id;
+  if ((status = nc_put_var1_int(exoid, varid, start, &ldum)) != NC_NOERR)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store %s id %"PRId64" in file id %d",
+	      ex_name_of_object(map_type),map_id,exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  switch ( map_type ) {
+  case EX_NODE_MAP:
+    vmap = VAR_NODE_MAP(cur_num_maps+1);
+    break;
+  case EX_EDGE_MAP:
+    vmap = VAR_EDGE_MAP(cur_num_maps+1);
+    break;
+  case EX_FACE_MAP:
+    vmap = VAR_FACE_MAP(cur_num_maps+1);
+    break;
+  case EX_ELEM_MAP:
+    vmap = VAR_ELEM_MAP(cur_num_maps+1);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized map type in switch: %d in file id %d",
+	    map_type,exoid);
+    ex_err("ex_putt_n_one_attr",errmsg,EX_MSG);
+    return (EX_FATAL);
+  }
+
+  /* locate variable array in which to store the map */
+  if ((status = nc_inq_varid(exoid,vmap,&varid)) != NC_NOERR) {
+    int dims[2];
+
+    /* determine number of entries */
+    if ((status = nc_inq_dimid (exoid, dnumentries, &dimid)) == -1 ) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: couldn't determine number of %s entries in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+       
+    if ((status = nc_redef( exoid )) != NC_NOERR ) {
+      exerrval = status;
+      sprintf(errmsg, "Error: failed to place file id %d into define mode", exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Check type to be used for maps... */
+    map_int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+      map_int_type = NC_INT64;
+    }
+
+    dims[0] = dimid;
+    if ((status = nc_def_var( exoid, vmap, map_int_type, 1, dims, &varid )) == -1 ) {
+      exerrval = status;
+      sprintf(errmsg, "Error: failed to define map %s in file id %d", vmap, exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+    }
+    ex_compress_variable(exoid, varid, 1);
+
+    if ((status = nc_enddef(exoid)) != NC_NOERR ) { /* exit define mode */
+      sprintf( errmsg, "Error: failed to complete definition for file id %d", exoid );
+      ex_err( "ex_put_num_map", errmsg, exerrval );
+      varid = -1; /* force early exit */
+    }
+
+    if ( varid == -1 ) /* we couldn't define variable and have prepared error message. */
+      return (EX_FATAL);
+  }
+
+  /* write out the map  */
+
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, map);
+  } else {
+    status = nc_put_var_int(exoid, varid, map);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to store %s in file id %d",
+	    ex_name_of_object(map_type),exoid);
+    ex_err("ex_put_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_one_attr.c b/exodus/cbind/src/ex_put_one_attr.c
new file mode 100644
index 0000000..842903b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_one_attr.c
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expoea - ex_put_one_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge, face, elem block)
+*       int     obj_id                  object id (edge, face, elem block ID)
+*       int     attrib_index            index of attribute to write
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t, ptrdiff_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+ * writes the specified attribute for a block
+ * \param      exoid                   exodus file id
+ * \param      obj_type                object type (edge, face, elem block)
+ * \param      obj_id                  object id (edge, face, elem block ID)
+ * \param      attrib_index            index of attribute to write
+ * \param      attrib                  array of attributes
+ */
+
+int ex_put_one_attr( int   exoid,
+                     ex_entity_type obj_type,
+                     ex_entity_id   obj_id,
+                     int   attrib_index,
+                     const void *attrib )
+{
+  int status;
+  int attrid, obj_id_ndx, temp;
+  size_t num_entries_this_obj, num_attr;
+  size_t start[2], count[2];
+  ptrdiff_t stride[2];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumobjent;
+  const char* dnumobjatt;
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in id array */
+  if (obj_type != EX_NODAL) {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes allowed for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_put_one_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this element block */
+      } else {
+	sprintf(errmsg,
+		"Error: no %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type), obj_id, exoid);
+	ex_err("ex_put_one_attr",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+  }
+  
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vattrbname = VAR_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vattrbname = VAR_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vattrbname = VAR_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vattrbname = VAR_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vattrbname = VAR_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vattrbname = VAR_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vattrbname = VAR_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vattrbname = VAR_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vattrbname = VAR_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_put_one_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if (ex_get_dimension(exoid, dnumobjent,"entries", &num_entries_this_obj, &temp, "ex_put_one_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if (ex_get_dimension(exoid, dnumobjatt,"attributes", &num_attr, &temp, "ex_put_one_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if (attrib_index < 1 || attrib_index > (int)num_attr) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+            "Error: Invalid attribute index specified: %d.  Valid range is 1 to %d for %s %"PRId64" in file id %d",
+            attrib_index, (int)num_attr, ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_put_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, vattrbname, &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attribute variable for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_put_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the attributes  */
+
+  start[0] = 0;
+  start[1] = attrib_index-1;
+
+  count[0] = num_entries_this_obj;
+  count[1] = 1;
+
+  stride[0] = 1;
+  stride[1] = num_attr;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vars_float(exoid, attrid, start, count, stride, attrib);
+  } else {
+    status = nc_put_vars_double(exoid, attrid, start, count, stride, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put attribute %d for %s %"PRId64" in file id %d",
+            attrib_index, ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_put_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_one_elem_attr.c b/exodus/cbind/src/ex_put_one_elem_attr.c
new file mode 100644
index 0000000..1e667e2
--- /dev/null
+++ b/exodus/cbind/src/ex_put_one_elem_attr.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expoea - ex_put_one_elem_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     elem_blk_id             element block id
+*       int     attrib_index            index of attribute to write
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+* revision history - 
+*   20061003 - David Thompson - moved to ex_put_one_attr
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_one_attr, etc
+
+/*!
+ * writes the specified attribute for an element block
+ * \param      exoid                   exodus file id
+ * \param      elem_blk_id             element block id
+ * \param      attrib_index            index of attribute to write
+ * \param      attrib                  array of attributes
+ * \deprecated Use ex_put_one_attr()(exoid, EX_ELEM_BLOCK, elem_blk_id, attrib_index, attrib)
+
+ */
+
+int ex_put_one_elem_attr (int   exoid,
+			  ex_entity_id   elem_blk_id,
+			  int   attrib_index,
+			  const void *attrib)
+{
+  return ex_put_one_attr( exoid, EX_ELEM_BLOCK, elem_blk_id, attrib_index, attrib );
+}
diff --git a/exodus/cbind/src/ex_put_partial_attr.c b/exodus/cbind/src/ex_put_partial_attr.c
new file mode 100644
index 0000000..abfdeea
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_attr.c
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expatt - ex_put_partial_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     blk_type                block type
+*       int     blk_id                  block id
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for nc_inq_dimid, nc_inq_varid, etc
+
+/*!
+ * writes the attributes for an edge/face/element block
+ * \param   exoid                   exodus file id
+ * \param   blk_type                block type
+ * \param   blk_id                  block id
+ * \param   attrib                  array of attributes
+ */
+
+int ex_put_partial_attr (int   exoid,
+			 ex_entity_type blk_type,
+			 ex_entity_id   blk_id,
+			 int64_t   start_entity,
+			 int64_t   num_entity,
+			 const void *attrib)
+{
+  int status;
+  int attrid;
+  int blk_id_ndx = 0;
+  int numattrdim;
+  size_t start[2], count[2];
+  size_t num_attr;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if ( blk_type != EX_NODAL ) {
+    /* Determine index of blk_id in VAR_ID_EL_BLK array */
+    blk_id_ndx = ex_id_lkup(exoid,blk_type,blk_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+        sprintf(errmsg,
+		"Warning: no attributes allowed for NULL %s %"PRId64" in file id %d",
+                ex_name_of_object(blk_type),blk_id,exoid);
+        ex_err("ex_put_attr",errmsg,EX_NULLENTITY);
+        return (EX_WARN);              /* no attributes for this block */
+      } else {
+        sprintf(errmsg,
+		"Error: no %s id %"PRId64" in in file id %d",
+                ex_name_of_object(blk_type), blk_id, exoid);
+        ex_err("ex_put_attr",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+    }
+  }
+
+  switch (blk_type) {
+  case EX_SIDE_SET:
+    status = nc_inq_varid (exoid, VAR_SSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_NODE_SET:
+    status = nc_inq_varid (exoid, VAR_NSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_EDGE_SET:
+    status = nc_inq_varid (exoid, VAR_ESATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_FACE_SET:
+    status = nc_inq_varid (exoid, VAR_FSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_ELEM_SET:
+    status = nc_inq_varid (exoid, VAR_ELSATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_NODAL:
+    status = nc_inq_varid (exoid, VAR_NATTRIB, &attrid);
+    break;
+  case EX_EDGE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_EATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_FACE_BLOCK:
+    status = nc_inq_varid (exoid, VAR_FATTRIB(blk_id_ndx), &attrid);
+    break;
+  case EX_ELEM_BLOCK:
+    status = nc_inq_varid (exoid, VAR_ATTRIB(blk_id_ndx), &attrid);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    blk_type,exoid);
+    ex_err("ex_put_partial_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attribute variable for %s %"PRId64" in file id %d",
+            ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_partial_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Determine number of attributes */
+  switch (blk_type) {
+  case EX_SIDE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_SS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_NODE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_NS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_EDGE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_ES(blk_id_ndx), &numattrdim);
+    break;
+  case EX_FACE_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_FS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_ELEM_SET:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_ELS(blk_id_ndx), &numattrdim);
+    break;
+  case EX_NODAL:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_NBLK, &numattrdim);
+    break;
+  case EX_EDGE_BLOCK:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_EBLK(blk_id_ndx), &numattrdim);
+    break;
+  case EX_FACE_BLOCK:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_FBLK(blk_id_ndx), &numattrdim);
+    break;
+  case EX_ELEM_BLOCK:
+    status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_BLK(blk_id_ndx), &numattrdim);
+    break;
+  default:
+    /* No need for error message, handled in previous switch; just to quiet compiler. */
+    return (EX_FATAL);
+  }
+  
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: number of attributes not defined for %s %"PRId64" in file id %d",
+            ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_partial_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numattrdim, &num_attr)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to get number of attributes for %s %"PRId64" in file id %d",
+            ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_partial_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the attributes  */
+  start[0] = --start_entity;
+  start[1] = 0;
+
+  count[0] = num_entity;
+  count[1] = num_attr;
+  if (count[0] == 0)
+    start[0] = 0;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, attrid, start, count, attrib);
+  } else {
+    status = nc_put_vara_double(exoid, attrid, start, count, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put attributes for %s %"PRId64" in file id %d",
+            ex_name_of_object(blk_type),blk_id,exoid);
+    ex_err("ex_put_partial_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_coord.c b/exodus/cbind/src/ex_put_partial_coord.c
new file mode 100644
index 0000000..7428db3
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_coord.c
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expcor - ex_put_partial_coord
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     start_node_num          starting index (1-based) of coordinates to be written.
+*       int     num_nodes               number of nodes to write coordinates for.
+*       float*  x_coord                 X coord array
+*       float*  y_coord                 y coord array
+*       float*  z_coord                 z coord array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+ * writes the coordinates of some of the nodes in the model
+ * Only writes the 'non-null' arrays.
+ * \param   exoid           exodus file id
+ * \param   start_node_num  the starting index (1-based) of the coordinates to be written
+ * \param   num_nodes       the number of nodes to write coordinates for.
+ * \param   x_coor          x coord array
+ * \param   y_coor          y coord array
+ * \param   z_coor          z coord array
+ */
+
+int ex_put_partial_coord (int   exoid,
+                    int64_t start_node_num,
+                    int64_t num_nodes,
+		    const void *x_coor,
+		    const void *y_coor,
+		    const void *z_coor)
+{
+  int status;
+  int coordid;
+  int coordidx, coordidy, coordidz;
+
+  int numnoddim, ndimdim;
+  int64_t num_nod;
+  size_t i, num_dim, start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_NODES, &numnoddim)) != NC_NOERR) {
+    /* If not found, then this file is storing 0 nodes.
+       Return immediately */
+    return (EX_NOERR);
+  }
+
+  {
+    size_t tmp;
+    if ((status = nc_inq_dimlen(exoid, numnoddim, &tmp)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: inquire failed to return number of nodes in file id %d",
+	      exoid);
+      ex_err("ex_put_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    num_nod = tmp;
+  }
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_DIM, &ndimdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_coord",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, ndimdim, &num_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of dimensions in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_coord",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (start_node_num + num_nodes -1 > num_nod) {
+    exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+              "Error: start index (%"PRId64") + node count (%"PRId64") is larger than total number of nodes (%"PRId64") in file id %d",
+              start_node_num, num_nodes, num_nod, exoid);
+      ex_err("ex_put_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+  }
+
+  --start_node_num;
+
+  /* write out the coordinates  */
+  if (ex_large_model(exoid) == 0) {
+    if ((status = nc_inq_varid(exoid, VAR_COORD, &coordid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to locate nodal coordinates in file id %d", exoid);
+      ex_err("ex_put_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    } 
+
+    for (i=0; i<num_dim; i++) {
+      char *which = 0;
+      start[0] = i;
+      start[1] = start_node_num;
+
+      count[0] = 1;
+      count[1] = num_nodes;
+
+      if (count[1] == 0)
+	start[1] = 0;
+
+      if (i == 0 && x_coor != NULL) {
+	which = "X";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, x_coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, x_coor);
+	}
+      }	  
+      else if (i == 1 && y_coor != NULL) {
+	which = "Y";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, y_coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, y_coor);
+	}
+      }
+      else if (i == 2 && z_coor != NULL) {
+	which = "Z";
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, z_coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, z_coor);
+	}
+      }
+	  
+      if (status != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to put %s coord array in file id %d", which, exoid);
+	ex_err("ex_put_partial_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+  } else {
+    if ((status = nc_inq_varid(exoid, VAR_COORD_X, &coordidx)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate x nodal coordinates in file id %d", exoid);
+      ex_err("ex_put_partial_coord",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (num_dim > 1) {
+      if ((status = nc_inq_varid(exoid, VAR_COORD_Y, &coordidy)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate y nodal coordinates in file id %d", exoid);
+	ex_err("ex_put_partial_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidy = 0;
+    }
+    if (num_dim > 2) {
+      if ((status = nc_inq_varid(exoid, VAR_COORD_Z, &coordidz)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate z nodal coordinates in file id %d", exoid);
+	ex_err("ex_put_partial_coord",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    } else {
+      coordidz = 0;
+    }
+
+    /* write out the coordinates  */
+    for (i=0; i<num_dim; i++) {
+      const void *coor = NULL;
+      char *which = NULL;
+       
+      start[0] = start_node_num;
+      count[0] = num_nodes;
+      if (count[0] == 0)
+	start[0] = 0;
+
+      if (i == 0) {
+	coor = x_coor;
+	which = "X";
+	coordid = coordidx;
+      } else if (i == 1) {
+	coor = y_coor;
+	which = "Y";
+	coordid = coordidy;
+      } else if (i == 2) {
+	coor = z_coor;
+	which = "Z";
+	coordid = coordidz;
+      }
+
+      if (coor != NULL && coordid != 0) {
+	if (ex_comp_ws(exoid) == 4) {
+	  status = nc_put_vara_float(exoid, coordid, start, count, coor);
+	} else {
+	  status = nc_put_vara_double(exoid, coordid, start, count, coor);
+	}
+
+	if (status != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to put %s coord array in file id %d", which, exoid);
+	  ex_err("ex_put_partial_coord",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+      }
+    }
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_elem_attr.c b/exodus/cbind/src/ex_put_partial_elem_attr.c
new file mode 100644
index 0000000..1536af4
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_elem_attr.c
@@ -0,0 +1,190 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_partial_elem_attr()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      attrib             - Pointer to the attribute vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the attributes for an element block
+ */
+
+int ex_put_partial_elem_attr (int   exoid,
+                        ex_entity_id   elem_blk_id,
+                        int64_t   start_elem_num,
+                        int64_t   num_elems,
+                        void *attrib)
+{
+  int status;
+  int numelbdim, numattrdim, attrid, elem_blk_id_ndx;
+  size_t num_elem_this_blk, num_attr, start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of elem_blk_id in VAR_ID_EL_BLK array */
+  if ((elem_blk_id_ndx = ex_id_lkup(exoid, EX_ELEM_BLOCK, elem_blk_id)) < 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no attributes allowed for NULL block %"PRId64" in file id %d",
+              elem_blk_id, exoid);
+      ex_err("ex_put_partial_elem_attr",errmsg,EX_NULLENTITY);
+      return (EX_WARN);              /* no attributes for this element block */
+    } else {
+      sprintf(errmsg,
+             "Error: no element block id %"PRId64" in %s array in file id %d",
+              elem_blk_id, VAR_ID_EL_BLK, exoid);
+      ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_EL_IN_BLK(elem_blk_id_ndx), &numelbdim)) != NC_NOERR) {
+    if (status == NC_EBADDIM) {
+      exerrval = status;
+      sprintf(errmsg,
+         "Error: no element block with id %"PRId64" in file id %d",
+             elem_blk_id, exoid);
+      ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+      return (EX_FATAL);
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+        "Error: failed to locate number of elements for block %"PRId64" in file id %d",
+             elem_blk_id, exoid);
+      ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+
+  if ((status = nc_inq_dimlen(exoid, numelbdim, &num_elem_this_blk)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to get number of elements for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimid(exoid, DIM_NUM_ATT_IN_BLK(elem_blk_id_ndx), &numattrdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: number of attributes not defined for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_attr",errmsg,EX_MSG);
+    return (EX_FATAL);              /* number of attributes not defined */
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numattrdim, &num_attr)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to get number of attributes for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_ATTRIB(elem_blk_id_ndx), &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+        "Error: failed to locate attribute variable for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* do some error checking */
+  if (num_elem_this_blk < (start_elem_num + num_elems - 1)) {
+    exerrval = status;
+    sprintf(errmsg,
+      "Error: requested attributes from too many elements in block %"PRId64,
+            elem_blk_id);
+    ex_err("ex_put_partial_elem_attr",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+
+  /* write out the attributes  */
+  start[0] = --start_elem_num;
+  start[1] = 0;
+
+  count[0] = num_elems;
+  count[1] = num_attr;
+
+  if (count[0] == 0)
+    start[0] = 0;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, attrid, start, count, attrib);
+  } else {
+    status = nc_put_vara_double(exoid, attrid, start, count, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put attributes for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_elem_conn.c b/exodus/cbind/src/ex_put_partial_elem_conn.c
new file mode 100644
index 0000000..ee1fd47
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_elem_conn.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_partial_elem_conn()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      elem_blk_id        - The element block ID.
+ *      start_elem_num     - The starting index of the elements to be
+ *                           obtained.
+ *      num_elems          - The number of FEM elements to read coords for.
+ *      connect            - Pointer to the connectivity vector.
+ *
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the connectivity array for an element block
+ */
+
+int ex_put_partial_elem_conn (int  exoid,
+			ex_entity_id  elem_blk_id,
+			int64_t  start_elem_num,
+			int64_t  num_elems,
+			const void_int *connect)
+{
+  int numelbdim, nelnoddim, connid, elem_blk_id_ndx, status;
+  size_t num_elem_this_blk, num_nod_per_elem, start[2], count[2]; 
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of elem_blk_id in VAR_ID_EL_BLK array */
+  if ((elem_blk_id_ndx = ex_id_lkup(exoid, EX_ELEM_BLOCK, elem_blk_id)) == -1)
+    {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: connectivity array not allowed for NULL element block %"PRId64" in file id %d",
+		elem_blk_id, exoid);
+	ex_err("ex_put_partial_elem_conn",errmsg,EX_NULLENTITY);
+	return (EX_WARN);
+      } else {
+
+	sprintf(errmsg,
+		"Error: failed to locate element block id %"PRId64" in %s array in file id %d",
+		elem_blk_id,VAR_ID_EL_BLK, exoid);
+	ex_err("ex_put_partial_elem_conn",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_EL_IN_BLK(elem_blk_id_ndx), &numelbdim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of elements in block %"PRId64" in file id %d",
+	    elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_conn",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, numelbdim, &num_elem_this_blk)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of elements in block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_conn",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NOD_PER_EL(elem_blk_id_ndx), &nelnoddim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of nodes/elem in block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_conn",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen (exoid, nelnoddim, &num_nod_per_elem)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of nodes/elem in block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_conn",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+
+  if ((status = nc_inq_varid (exoid, VAR_CONN(elem_blk_id_ndx), &connid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate connectivity array for element block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_conn",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+
+  /* do some error checking */
+  if (num_elem_this_blk < (start_elem_num + num_elems - 1)) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: requested connectivity from too many elements in block, %"PRId64,
+            elem_blk_id);
+    ex_err("ex_put_partial_elem_conn",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+
+  /* write out the connectivity array */
+  start[0] = --start_elem_num;
+  start[1] = 0;
+
+  count[0] = num_elems;
+  count[1] = num_nod_per_elem;
+
+  if (count[0] == 0)
+    start[0] = 0;
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, connid, start, count, connect);
+  } else {
+    status = nc_put_vara_int(exoid, connid, start, count, connect);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to write connectivity array for block %"PRId64" in file id %d",
+            elem_blk_id, exoid);
+    ex_err("ex_put_partial_elem_conn",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_elem_map.c b/exodus/cbind/src/ex_put_partial_elem_map.c
new file mode 100644
index 0000000..6fe21be
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_elem_map.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exppem - ex_put_partial_elem_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  element map id
+*       int     ent_start               first entry in map
+*       int     ent_count               number of entries in map
+*       int     *elem_map               element map
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_num_map, etc
+
+/*!
+ * writes an element map; this is a vector of integers of length number
+ * of elements
+ * \deprecated Use ex_put_partial_num_map()(exoid, EX_ELEM_MAP, map_id, ent_start, ent_count, elem_map) instead
+ */
+int ex_put_partial_elem_map (int exoid,
+			     ex_entity_id map_id,
+			     int64_t ent_start,
+			     int64_t ent_count, 
+			     const void_int *elem_map)
+{
+  return ex_put_partial_num_map(exoid, EX_ELEM_MAP, map_id, ent_start, ent_count, elem_map);
+}
diff --git a/exodus/cbind/src/ex_put_partial_elem_num_map.c b/exodus/cbind/src/ex_put_partial_elem_num_map.c
new file mode 100644
index 0000000..9b225a8
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_elem_num_map.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* ne_pennm - ex_put_partial_elem_num_map
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	start_ent		first entry in elem_map
+*	int	num_ents		number of entries in node_map
+*       int*    elem_map                element numbering map array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_id_map, etc
+
+/*
+ * writes out a portion of the element numbering map to the database;
+ * this allows element numbers to be non-contiguous
+ */
+
+int ex_put_partial_elem_num_map (int  exoid,
+                           int64_t  start_ent,
+                           int64_t  num_ents,
+                           const void_int *elem_map)
+{
+  return ex_put_partial_id_map(exoid, EX_ELEM_MAP, start_ent, num_ents, elem_map);
+}
diff --git a/exodus/cbind/src/ex_put_partial_id_map.c b/exodus/cbind/src/ex_put_partial_id_map.c
new file mode 100644
index 0000000..ccd4887
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_id_map.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2007 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expenm - ex_put_partial_id_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       ex_entity_type obj_type
+*       int*    elem_map                element numbering map array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_enddef, etc
+
+/*!
+ * writes out a portion of the entity numbering map to the database;
+ * this allows the entity numbers to be non-contiguous.  This map is
+ * used for mapping between local and global entity ids.
+ * \param    exoid                   exodus file id
+ * \param    map_type
+ * \param    start_entity_num
+ * \param    num_entities
+ * \param    map                element numbering map array
+ */
+
+int ex_put_partial_id_map (int  exoid,
+                           ex_entity_type map_type,
+                           int64_t   start_entity_num,
+                           int64_t   num_entities,
+                           const void_int *map)
+{
+  int dimid, mapid, status, dims[1];
+  int map_int_type;
+  size_t start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* tname;
+  const char* dnumentries;
+  const char* vmap;
+
+  exerrval = 0; /* clear error code */
+  if (num_entities == 0 && !ex_is_parallel(exoid))
+    return EX_NOERR;
+
+  switch ( map_type ) {
+  case EX_NODE_MAP:
+    tname = "node";
+    dnumentries = DIM_NUM_NODES;
+    vmap = VAR_NODE_NUM_MAP;
+    break;
+  case EX_EDGE_MAP:
+    tname = "edge";
+    dnumentries = DIM_NUM_EDGE;
+    vmap = VAR_EDGE_NUM_MAP;
+    break;
+  case EX_FACE_MAP:
+    tname = "face";
+    dnumentries = DIM_NUM_FACE;
+    vmap = VAR_FACE_NUM_MAP;
+    break;
+  case EX_ELEM_MAP:
+    tname = "element";
+    dnumentries = DIM_NUM_ELEM;
+    vmap = VAR_ELEM_NUM_MAP;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg,
+             "Error: Bad map type (%d) specified for file id %d",
+             map_type, exoid );
+    ex_err( "ex_put_partial_id_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  /* Make sure the file contains entries */
+  if (nc_inq_dimid (exoid, dnumentries, &dimid) != NC_NOERR) {
+    /* Error -- if we made it this far, num_entities is > 0,
+     * but the dimension 'dnumentries' is not defined which
+     * indicates that either the entity count is zero, or
+     * there is an error in that the dimension has not yet
+     * been defined. Note that in parallel, num_entities could
+     * be zero on a processor, but non-zero globally.
+     */
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: The %s count is %"PRId64", but the %s dimension is not defined on file id %d.",
+	    tname, num_entities, dnumentries, exoid);
+    ex_err("ex_put_partial_id_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* define the map if it doesn't already exist... */
+  if (nc_inq_varid (exoid, vmap, &mapid) != NC_NOERR) {
+    if ((status = nc_redef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to put file id %d into define mode",
+              exoid);
+      ex_err("ex_put_partial_id_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* create a variable array in which to store the id map  */
+    dims[0] = dimid;
+
+    /* Check type to be used for maps... */
+    map_int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_DB) {
+      map_int_type = NC_INT64;
+    }
+
+    if ((status = nc_def_var(exoid, vmap, map_int_type, 1, dims, &mapid)) != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: %s numbering map already exists in file id %d",
+                tname, exoid);
+        ex_err("ex_put_partial_id_map",errmsg,exerrval);
+      } else {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to create %s id map in file id %d",
+                tname, exoid);
+        ex_err("ex_put_partial_id_map",errmsg,exerrval);
+      }
+      goto error_ret;         /* exit define mode and return */
+    }
+    ex_compress_variable(exoid, mapid, 1);
+
+
+    /* leave define mode  */
+    if ((status = nc_enddef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to complete definition in file id %d",
+              exoid);
+      ex_err("ex_put_partial_id_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* write out the entity numbering map  */
+  start[0] = start_entity_num-1;
+  count[0] = num_entities;
+  if (num_entities == 0)
+    start[0] = 0;
+
+  /* write out the entity numbering map  */
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_put_vara_longlong(exoid, mapid, start, count, map);
+  } else {
+    status = nc_put_vara_int(exoid, mapid, start, count, map);
+  }
+
+  if (status!= NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to store %s numbering map in file id %d",
+            tname, exoid);
+    ex_err("ex_put_partial_id_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+  error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+  {
+    sprintf(errmsg,
+        "Error: failed to complete definition for file id %d",
+        exoid);
+    ex_err("ex_put_partial_id_map",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
+
diff --git a/exodus/cbind/src/ex_put_partial_nodal_var.c b/exodus/cbind/src/ex_put_partial_nodal_var.c
new file mode 100644
index 0000000..92c886a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_nodal_var.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expnv - ex_put_partial_nodal_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               whole time step number
+*       int     nodel_var_index         index of desired nodal variable
+*       int     start_node              index (1-based) of first node to put
+*       int     num_nodes               number of nodal points
+*       float*  nodal_var_vals          array of nodal variable values
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_WARN, ex_comp_ws, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+ * writes the values of a single nodal variable for a partial block at
+ * one single time step to the database; assume the first time step
+ * and nodal variable index is 1 
+ * \param exoid            exodus file id 
+ * \param time_step        whole time step number 
+ * \param nodal_var_index  index of desired nodal variable 
+ * \param start_node       index of first node to write data for (1-based)
+ * \param num_nodes        number of nodal points
+ * \param nodal_var_vals   array of nodal variable values
+ */
+
+int ex_put_partial_nodal_var (int   exoid,
+			int   time_step,
+			int   nodal_var_index,
+			int64_t   start_node,
+			int64_t   num_nodes, 
+			const void *nodal_var_vals)
+
+{
+  int status;
+  int varid;
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  if (ex_large_model(exoid) == 0) {
+    /* write values of the nodal variable */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variables in file id %d",
+              exoid);
+      ex_err("ex_put_partial_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+    start[0] = --time_step;
+    start[1] = --nodal_var_index;
+    start[2] = --start_node;
+
+    count[0] = 1;
+    count[1] = 1;
+    count[2] = num_nodes;
+  } else {
+    /* nodal variables stored separately, find variable for this variable
+       index */
+    if ((status = nc_inq_varid(exoid, VAR_NOD_VAR_NEW(nodal_var_index), &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Warning: could not find nodal variable %d in file id %d",
+              nodal_var_index, exoid);
+      ex_err("ex_put_partial_nodal_var",errmsg,exerrval);
+      return (EX_WARN);
+    }
+
+    start[0] = --time_step;
+    start[1] = --start_node;
+
+    count[0] = 1;
+    count[1] = num_nodes;
+    if (num_nodes == 0)
+      start[1] = 0;
+  }
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, varid, start, count, nodal_var_vals);
+  } else {
+    status = nc_put_vara_double(exoid, varid, start, count, nodal_var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store nodal variables in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_nodal_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_node_num_map.c b/exodus/cbind/src/ex_put_partial_node_num_map.c
new file mode 100644
index 0000000..d589758
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_node_num_map.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+*
+* ne_pnnnm - ex_put_partial_node_num_map
+*
+* entry conditions - 
+*   input parameters:
+*	int	exoid			exodus file id
+*	int	start_ent		first entry in node_map
+*	int	num_ents		number of entries in node_map
+*       int*    node_map                node numbering map
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_partial_id_map, etc
+
+/*
+ * writes out the node numbering map to the database; allows node numbers
+ * to be non-contiguous
+ */
+
+int ex_put_partial_node_num_map (int  exoid,
+                           int64_t  start_ent,
+                           int64_t  num_ents,
+                           const void_int *node_map)
+{
+  return ex_put_partial_id_map(exoid, EX_NODE_MAP, start_ent, num_ents, node_map);
+}
diff --git a/exodus/cbind/src/ex_put_partial_node_set.c b/exodus/cbind/src/ex_put_partial_node_set.c
new file mode 100644
index 0000000..2009aa3
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_node_set.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_partial_node_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to read.
+ *      start_node_num     - The starting index of the nodes to be read.
+ *      num_nodes          - The number of nodes to read in.
+ *      node_set_node_list - List of node IDs in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the node list for a single node set
+ */
+
+int ex_put_partial_node_set (int   exoid,
+                       ex_entity_id   node_set_id,
+                       int64_t   start_node_num,
+                       int64_t   num_nodes,
+                       const void_int  *node_set_node_list)
+{
+  int    dimid, node_list_id, node_set_id_ndx, status;
+  size_t num_nodes_in_set, start[1], count[1]; 
+  char   errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any node sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NS, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no node sets specified in file id %d",
+            exoid);
+    ex_err("ex_put_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of node set id in VAR_NS_IDS array */
+  if ((node_set_id_ndx = ex_id_lkup(exoid, EX_NODE_SET, node_set_id)) < 0)
+  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL node set %"PRId64" in file id %d",
+              node_set_id, exoid);
+      ex_err("ex_put_partial_node_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+     "Error: failed to locate node set id %"PRId64" in VAR_NS_IDS array in file id %d",
+              node_set_id, exoid);
+      ex_err("ex_put_partial_node_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NOD_NS(node_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate number of nodes in set %"PRId64" in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_nodes_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of nodes in set %"PRId64" in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_node_num < 0 || start_node_num > num_nodes_in_set) {
+    fprintf(stderr, "ERROR: Invalid input to function ex_get_partial_node_set!\n");
+    return -1;
+  }
+
+  if (num_nodes < 0) {
+    fprintf(stderr, "ERROR: Invalid number of nodes in nodes set!\n");
+    return -1;
+  }
+
+  /* start_node_num now starts at 1, not 0 */
+  if ((start_node_num + num_nodes - 1) > num_nodes_in_set) {
+    fprintf(stderr, "ERROR: request larger than number of nodes in set!\n");
+    return -1;
+  }
+
+  /* inquire if variable for node set node list has been defined */
+  if ((status = nc_inq_varid (exoid, VAR_NODE_NS(node_set_id_ndx), &node_list_id)) != NC_NOERR) {
+  /* variable doesn't exist */
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to locate node set %"PRId64" node list in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the node list array */
+  start[0] = --start_node_num;
+  count[0] = num_nodes;
+  if (count[0] == 0)
+    start[0] = 0;
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, node_list_id, start, count, node_set_node_list);
+  } else {
+    status = nc_put_vara_int(exoid, node_list_id, start, count, node_set_node_list);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to store node set %"PRId64" node list in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_node_set_df.c b/exodus/cbind/src/ex_put_partial_node_set_df.c
new file mode 100644
index 0000000..9da8d9a
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_node_set_df.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_partial_node_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      node_set_id        - ID of node set to write.
+ *      start_num          - The starting index of the df's to be written.
+ *      num_df_to_get      - The number of distribution factors to write out.
+ *      node_set_dist_fact - List of node distribution factors in node set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the node set distribution factors for a single node set
+ */
+
+int ex_put_partial_node_set_df (int   exoid,
+                          ex_entity_id   node_set_id,
+                          int64_t   start_num,
+                          int64_t   num_df_to_get,
+                          void *node_set_dist_fact)
+{
+  int status;
+  int dimid,  dist_id, node_set_id_ndx;
+  size_t num_nodes_in_set, start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any node sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NS, &dimid)) < 0) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no node sets specified in file id %d",
+            exoid);
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of node set id in VAR_NS_IDS array */
+  if ((node_set_id_ndx = ex_id_lkup(exoid, EX_NODE_SET, node_set_id)) < 0)
+  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL node set %"PRId64" in file id %d",
+              node_set_id, exoid);
+      ex_err("ex_put_partial_node_set_df",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+     "Error: failed to locate node set id %"PRId64" in VAR_NS_IDS array in file id %d",
+              node_set_id, exoid);
+      ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NOD_NS(node_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to locate number of nodes in node set %"PRId64" in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_nodes_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get number of nodes in set %"PRId64" in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_num < 0 || start_num > num_nodes_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_df_to_get < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of nodes in nodes set!");
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_num now starts at 1, not 0 */
+  if ((start_num + num_df_to_get - 1) > num_nodes_in_set) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of nodes in set!");
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* find id of distribution factors variable */
+  if ((status = nc_inq_varid (exoid, VAR_FACT_NS(node_set_id_ndx), &dist_id)) != NC_NOERR) {
+    if (status == NC_ENOTVAR) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+             "Warning: no dist factors defined for node set %"PRId64" in file id %d",
+              node_set_id, exoid);
+      ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+      return (EX_WARN);
+
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to locate node set %"PRId64" dist factors in file id %d",
+              node_set_id, exoid);
+      ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+
+  /* write out the distribution factors array */
+  start[0] = --start_num;
+  count[0] = num_df_to_get;
+  if (count[0] == 0)
+    start[0] = 0;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, dist_id, start, count, node_set_dist_fact);
+  } else {
+    status = nc_put_vara_double(exoid, dist_id, start, count, node_set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to store node set %"PRId64" dist factors in file id %d",
+            node_set_id, exoid);
+    ex_err("ex_put_partial_node_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_num_map.c b/exodus/cbind/src/ex_put_partial_num_map.c
new file mode 100644
index 0000000..e2002e0
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_num_map.c
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exppem - ex_put_partial_num_map
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     map_id                  element map id
+*       int     ent_start               first entry in map
+*       int     ent_count               number of entries in map
+*       int     *map                    map
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+ * writes a map; this is a vector of integers of length number of mesh
+ * objects of that type (element, node, face, edge)
+ */
+int ex_put_partial_num_map (int exoid,
+			    ex_entity_type map_type,
+			    ex_entity_id map_id,
+			    int64_t ent_start,
+			    int64_t ent_count, 
+			    const void_int *map)
+{
+  int status;
+  int dimid, varid, map_ndx, map_exists;
+  size_t start[1]; 
+  size_t num_maps, num_mobj, count[1];
+  int cur_num_maps;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumentries;
+  const char* dnummaps;
+  const char* vmapids;
+  const char* vmap;
+
+  exerrval = 0; /* clear error code */
+
+  switch ( map_type ) {
+  case EX_NODE_MAP:
+    dnumentries = DIM_NUM_NODES;
+    dnummaps = DIM_NUM_NM;
+    vmapids = VAR_NM_PROP(1);
+    break;
+  case EX_EDGE_MAP:
+    dnumentries = DIM_NUM_EDGE;
+    dnummaps = DIM_NUM_EDM;
+    vmapids = VAR_EDM_PROP(1);
+    break;
+  case EX_FACE_MAP:
+    dnumentries = DIM_NUM_FACE;
+    dnummaps = DIM_NUM_FAM;
+    vmapids = VAR_FAM_PROP(1);
+    break;
+  case EX_ELEM_MAP:
+    dnumentries = DIM_NUM_ELEM;
+    dnummaps = DIM_NUM_EM;
+    vmapids = VAR_EM_PROP(1);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg,
+	     "Error: Bad map type (%d) specified for file id %d",
+	     map_type, exoid );
+    ex_err( "ex_put_num_map", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  /* Make sure the file contains entries */
+  if (nc_inq_dimid (exoid, dnumentries, &dimid) != NC_NOERR ) {
+    return (EX_NOERR);
+  }
+
+  /* first check if any maps are specified */
+  if ((status = nc_inq_dimid (exoid, dnummaps, &dimid)) != NC_NOERR )
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: no %ss specified in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_partial_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  
+  /* Check for duplicate map id entry */
+  ex_id_lkup(exoid,map_type,map_id); 
+  if (exerrval == EX_LOOKUPFAIL) {   /* did not find the map id */
+    map_exists = 0; /* Map is being defined */
+  } else {
+    map_exists = 1; /* A portion of this map has already been written */
+  }
+   
+  /* Check for duplicate map id entry */
+  if (!map_exists) {
+    /* Get number of maps initialized for this file */
+    if ((status = nc_inq_dimlen(exoid,dimid,&num_maps)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get number of %ss in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_partial_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Keep track of the total number of maps defined using a
+       counter stored in a linked list keyed by exoid.  NOTE:
+       ex_get_file_item is used to find the number of element maps for a
+       specific file and returns that value.
+    */
+    cur_num_maps = ex_get_file_item(exoid, ex_get_counter_list(map_type));
+    if (cur_num_maps >= (int)num_maps) {
+      exerrval = EX_FATAL;
+      sprintf(errmsg,
+	      "Error: exceeded number of %ss (%"ST_ZU") specified in file id %d",
+	      ex_name_of_object(map_type),num_maps,exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    
+    /*   NOTE: ex_inc_file_item  is used to find the number of element maps
+	 for a specific file and returns that value incremented. */
+    cur_num_maps = ex_inc_file_item(exoid, ex_get_counter_list(map_type));
+  } else {
+    map_ndx = ex_id_lkup(exoid,map_type,map_id); 
+    cur_num_maps = map_ndx-1;
+  }
+
+  /* determine number of elements */
+  if ((status = nc_inq_dimid(exoid, dnumentries, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: couldn't determine number of mesh objects in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_mobj)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get number of mesh objects in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (ent_start <= 0 || ent_start > num_mobj) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: start count is invalid in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  if (ent_count < 0) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: Invalid count value in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  if (ent_start+ent_count-1 > num_mobj) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: start+count-1 is larger than mesh object count in file id %d",
+	    exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+
+  /* write out information to previously defined variable */
+
+  /* first get id of variable */
+  if ((status = nc_inq_varid (exoid, vmapids, &varid)) == -1)
+    {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %s ids in file id %d",
+	      ex_name_of_object(map_type),exoid);
+      ex_err("ex_put_num_map",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+  /* then, write out map id */
+  if (!map_exists) {
+    start[0] = cur_num_maps;
+    {
+      if ((status = nc_put_var1_longlong(exoid, varid, start, (long long*)&map_id)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to store %s id %"PRId64" in file id %d",
+		ex_name_of_object(map_type),map_id,exoid);
+	ex_err("ex_put_num_map",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+  }
+  
+  switch ( map_type ) {
+  case EX_NODE_MAP:
+    vmap = VAR_NODE_MAP(cur_num_maps+1);
+    break;
+  case EX_EDGE_MAP:
+    vmap = VAR_EDGE_MAP(cur_num_maps+1);
+    break;
+  case EX_FACE_MAP:
+    vmap = VAR_FACE_MAP(cur_num_maps+1);
+    break;
+  case EX_ELEM_MAP:
+    vmap = VAR_ELEM_MAP(cur_num_maps+1);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized map type in switch: %d in file id %d",
+	    map_type,exoid);
+    ex_err("ex_putt_partial_one_attr",errmsg,EX_MSG);
+    return (EX_FATAL);
+  }
+
+  /* locate variable array in which to store the map */
+  if ((status = nc_inq_varid(exoid,vmap, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate %s %"PRId64" in file id %d",
+	    ex_name_of_object(map_type),map_id,exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the map  */
+  start[0] = ent_start-1;
+  count[0] = ent_count;
+
+  if (count[0] == 0)
+    start[0] = 0;
+  
+  if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+    status = nc_put_vara_longlong(exoid, varid, start, count, map);
+  } else {
+    status = nc_put_vara_int(exoid, varid, start, count, map);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to store %s in file id %d",
+	    ex_name_of_object(map_type),exoid);
+    ex_err("ex_put_partial_num_map",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_one_attr.c b/exodus/cbind/src/ex_put_partial_one_attr.c
new file mode 100644
index 0000000..c333bff
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_one_attr.c
@@ -0,0 +1,229 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expoea - ex_put_partial_one_attr
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                object type (edge, face, elem block)
+*       int     obj_id                  object id (edge, face, elem block ID)
+*       int     attrib_index            index of attribute to write
+*       float*  attrib                  array of attributes
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t, ptrdiff_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+ * writes the specified attribute for a block
+ * \param      exoid         exodus file id
+ * \param      obj_type      object type (edge, face, elem block)
+ * \param      obj_id        object id (edge, face, elem block ID)
+ * \param      start_num     the starting index of the attributes to be written
+ * \param      num_ent       the number of entities to write attributes for.
+ * \param      attrib_index  index of attribute to write
+ * \param      attrib        array of attributes
+ */
+
+int ex_put_partial_one_attr( int   exoid,
+		       ex_entity_type obj_type,
+		       ex_entity_id   obj_id,
+		       int64_t   start_num,
+		       int64_t   num_ent,
+		       int   attrib_index,
+		       const void *attrib )
+{
+  int status;
+  int attrid, obj_id_ndx, temp;
+  size_t num_entries_this_obj, num_attr;
+  size_t start[2], count[2];
+  ptrdiff_t stride[2];
+  char errmsg[MAX_ERR_LENGTH];
+  const char* dnumobjent;
+  const char* dnumobjatt;
+  const char* vattrbname;
+
+  exerrval = 0; /* clear error code */
+
+  /* Determine index of obj_id in id array */
+  if (obj_type != EX_NODAL) {
+    obj_id_ndx = ex_id_lkup(exoid,obj_type,obj_id);
+    if (exerrval != 0) {
+      if (exerrval == EX_NULLENTITY) {
+	sprintf(errmsg,
+		"Warning: no attributes allowed for NULL %s %"PRId64" in file id %d",
+		ex_name_of_object(obj_type),obj_id,exoid);
+	ex_err("ex_put_partial_one_attr",errmsg,EX_NULLENTITY);
+	return (EX_WARN);              /* no attributes for this element block */
+      } else {
+	sprintf(errmsg,
+		"Error: no %s id %"PRId64" in id array in file id %d",
+		ex_name_of_object(obj_type), obj_id, exoid);
+	ex_err("ex_put_partial_one_attr",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+  }
+  
+  switch (obj_type) {
+  case EX_SIDE_SET:
+    dnumobjent = DIM_NUM_SIDE_SS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_SS(obj_id_ndx);
+    vattrbname = VAR_SSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODE_SET:
+    dnumobjent = DIM_NUM_NOD_NS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_NS(obj_id_ndx);
+    vattrbname = VAR_NSATTRIB(obj_id_ndx);
+    break;
+  case EX_EDGE_SET:
+    dnumobjent = DIM_NUM_EDGE_ES(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ES(obj_id_ndx);
+    vattrbname = VAR_ESATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_SET:
+    dnumobjent = DIM_NUM_FACE_FS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FS(obj_id_ndx);
+    vattrbname = VAR_FSATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_SET:
+    dnumobjent = DIM_NUM_ELE_ELS(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_ELS(obj_id_ndx);
+    vattrbname = VAR_ELSATTRIB(obj_id_ndx);
+    break;
+  case EX_NODAL:
+    dnumobjent = DIM_NUM_NODES;
+    dnumobjatt = DIM_NUM_ATT_IN_NBLK;
+    vattrbname = VAR_NATTRIB;
+    break;
+  case EX_EDGE_BLOCK:
+    dnumobjent = DIM_NUM_ED_IN_EBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_EBLK(obj_id_ndx);
+    vattrbname = VAR_EATTRIB(obj_id_ndx);
+    break;
+  case EX_FACE_BLOCK:
+    dnumobjent = DIM_NUM_FA_IN_FBLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_FBLK(obj_id_ndx);
+    vattrbname = VAR_FATTRIB(obj_id_ndx);
+    break;
+  case EX_ELEM_BLOCK:
+    dnumobjent = DIM_NUM_EL_IN_BLK(obj_id_ndx);
+    dnumobjatt = DIM_NUM_ATT_IN_BLK(obj_id_ndx);
+    vattrbname = VAR_ATTRIB(obj_id_ndx);
+    break;
+  default:
+    exerrval = 1005;
+    sprintf(errmsg,
+	    "Internal Error: unrecognized object type in switch: %d in file id %d",
+	    obj_type,exoid);
+    ex_err("ex_putt_partial_one_attr",errmsg,EX_MSG);
+    return (EX_FATAL);
+  }
+
+  /* inquire id's of previously defined dimensions  */
+  if (ex_get_dimension(exoid, dnumobjent,"entries", &num_entries_this_obj, &temp, "ex_put_partial_one_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if (start_num + num_ent -1 > num_entries_this_obj) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: start index (%"PRId64") + count (%"PRId64") is larger than total number of entities (%"ST_ZU") in file id %d",
+	    start_num, num_ent, num_entries_this_obj, exoid);
+    ex_err("ex_put_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  if (ex_get_dimension(exoid, dnumobjatt,"attributes", &num_attr, &temp, "ex_put_partial_one_attr") != NC_NOERR)
+    return EX_FATAL;
+
+  if (attrib_index < 1 || attrib_index > (int)num_attr) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+            "Error: Invalid attribute index specified: %d.  Valid range is 1 to %"ST_ZU" for %s %"PRId64" in file id %d",
+            attrib_index, num_attr, ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_put_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid(exoid, vattrbname, &attrid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate attribute variable for %s %"PRId64" in file id %d",
+	    ex_name_of_object(obj_type),obj_id,exoid);
+    ex_err("ex_put_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the attributes  */
+
+  start[0] = start_num-1;
+  start[1] = attrib_index-1;
+
+  count[0] = num_ent;
+  count[1] = 1;
+
+  stride[0] = 1;
+  stride[1] = num_attr;
+  
+  if (count[0] == 0)
+    start[0] = 0;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vars_float(exoid, attrid, start, count, stride, attrib);
+  } else {
+    status = nc_put_vars_double(exoid, attrid, start, count, stride, attrib);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put attribute %d for %s %"PRId64" in file id %d",
+            attrib_index, ex_name_of_object(obj_type), obj_id, exoid);
+    ex_err("ex_put_partial_one_attr",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_set.c b/exodus/cbind/src/ex_put_partial_set.c
new file mode 100644
index 0000000..73ac639
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_set.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expss - ex_put_set
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                set type
+*       int     set_id                  set id
+*       int*    set_entry_list          array of entries in set
+*       int*    set_extra_list          array of extras in set
+
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+ * writes the set entry list and set extra list for a single set
+ * \param   exoid                   exodus file id
+ * \param   set_type                set type
+ * \param   set_id                  set id
+ * \param  *set_entry_list          array of entries in set. Set to NULL to not write.
+ * \param  *set_extra_list          array of extras in set. Set to NULL to not write.
+ */
+
+int ex_put_partial_set (int   exoid,
+			ex_entity_type set_type,
+			ex_entity_id   set_id,
+			int64_t offset,
+			int64_t num_to_put,
+			const void_int  *set_entry_list,
+			const void_int  *set_extra_list)
+{
+  int dimid, status;
+  int entry_list_id, extra_list_id, set_id_ndx;
+  size_t start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+  char* entryptr = NULL;
+  char* extraptr = NULL;
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no %ss defined in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid, set_type,set_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type),set_id,exoid);
+      ex_err("ex_put_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    entryptr = VAR_NODE_NS(set_id_ndx);
+    extraptr = NULL;
+  }
+  else if (set_type == EX_EDGE_SET) {
+    entryptr = VAR_EDGE_ES(set_id_ndx);
+    extraptr = VAR_ORNT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    entryptr = VAR_FACE_FS(set_id_ndx);
+    extraptr = VAR_ORNT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    entryptr = VAR_ELEM_SS(set_id_ndx);
+    extraptr = VAR_SIDE_SS(set_id_ndx);
+  }
+  else if (set_type == EX_ELEM_SET) {
+    entryptr = VAR_ELEM_ELS(set_id_ndx);
+    extraptr = NULL;
+  }
+
+  /* inquire id's of previously defined variables  */
+  if ((status = nc_inq_varid(exoid, entryptr, &entry_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate entry list for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_put_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* only do for edge, face and side sets */
+  if (extraptr) {
+    if ((status = nc_inq_varid(exoid, extraptr, &extra_list_id)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate extra list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* write out the entry list and extra list arrays */
+  if (set_entry_list != NULL || ex_is_parallel(exoid)) {
+    start[0] = offset-1;
+    count[0] = num_to_put;
+    if (count[0] == 0)
+      start[0] = 0;
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_put_vara_longlong(exoid, entry_list_id, start, count, set_entry_list);
+    } else {
+      status = nc_put_vara_int(exoid, entry_list_id, start, count, set_entry_list);
+    }
+    
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store entry list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+
+  /* only do for edge, face and side sets */
+  if (extraptr && set_extra_list != NULL ) {
+    
+    start[0] = offset-1;
+    count[0] = num_to_put;
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_put_vara_longlong(exoid, extra_list_id, start, count, set_extra_list);
+    } else {
+      status = nc_put_vara_int(exoid, extra_list_id, start, count, set_extra_list);
+    }    
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store extra list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* warn if extra data was sent in for node sets and elem sets */
+  if ((set_type == EX_NODE_SET || set_type == EX_ELEM_SET) &&
+      set_extra_list != NULL) {
+    sprintf(errmsg,
+	    "Warning: extra list was ignored for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id, exoid);
+    ex_err("ex_put_set",errmsg,EX_MSG);
+    return(EX_WARN); 
+  }
+
+  return (EX_NOERR);
+
+}
diff --git a/exodus/cbind/src/ex_put_partial_set_dist_fact.c b/exodus/cbind/src/ex_put_partial_set_dist_fact.c
new file mode 100644
index 0000000..795005d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_set_dist_fact.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expssd - ex_put_partial_set_dist_fact
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                set type
+*       int     set_id                  set id
+*       int     offset                  index (1-based) of first dist factor to write
+*       int     num_to_put              number of dist factors to write.
+*       void*   set_dist_fact           array of dist factors for set
+
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+ * writes the partial distribution factors for a single set
+ * \param  exoid                   exodus file id
+ * \param  set_type                set type
+ * \param  set_id                  set id
+ * \param  offset                  index (1-based) of first dist factor to write
+ * \param  num_to_put              number of dist factors to write.
+ * \param *set_dist_fact           array of dist factors for set
+ */
+
+int ex_put_partial_set_dist_fact (int   exoid,
+				  ex_entity_type set_type,
+				  ex_entity_id   set_id,
+				  int64_t   offset,
+				  int64_t   num_to_put,
+				  const void *set_dist_fact)
+{
+  int status;
+  int dimid, set_id_ndx;
+  int dist_id;
+  size_t start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+  char* factptr = NULL;
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no %ss specified in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid,set_type,set_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set_fact",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    /* note we are using DIM_NUM_NODE_NS instead of DIM_NUM_DF_NS */
+    factptr = VAR_FACT_NS(set_id_ndx);
+  }
+  else if (set_type == EX_EDGE_SET) {
+    factptr = VAR_FACT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    factptr = VAR_FACT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    factptr = VAR_FACT_SS(set_id_ndx);
+  }
+  if (set_type == EX_ELEM_SET) {
+    factptr = VAR_FACT_ELS(set_id_ndx);
+  }
+
+  /* find id of distribution factors variable
+   */
+
+  if ((status = nc_inq_varid(exoid, factptr, &dist_id)) != NC_NOERR) {
+    /* this test is only needed for node set because we're using
+       DIM_NUM_NOD_NS instead of  DIM_NUM_DF_NS*/
+    if (status == NC_ENOTVAR) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Warning: no dist factors defined for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id, exoid);
+      ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+      return (EX_WARN);
+    } else  {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate dist factors list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  start[0] = offset-1;
+  count[0] = num_to_put;
+  if (num_to_put == 0)
+    start[0] = 0;
+  
+  /* write out the distribution factors array */
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, dist_id, start, count, set_dist_fact);
+  } else {
+    status = nc_put_vara_double(exoid, dist_id, start, count, set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store dist factors for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_put_partial_set_dist_fact",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_side_set.c b/exodus/cbind/src/ex_put_partial_side_set.c
new file mode 100644
index 0000000..5e3dd06
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_side_set.c
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_partial_side_set()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to read.
+ *      start_side_num     - The starting index of the sides to be read.
+ *      num_sides          - The number of sides to read in.
+ *      side_set_elem_list - List of element IDs in side set.
+ *      side_set_side_list - List of side IDs in side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the side set element list and side set side list for a single side set
+ */
+
+int ex_put_partial_side_set (int   exoid,
+                       ex_entity_id   side_set_id,
+                       int64_t   start_side_num,
+                       int64_t   num_sides,
+                       const void_int  *side_set_elem_list,
+                       const void_int  *side_set_side_list)
+{
+  int status;
+  int dimid;
+  int elem_list_id, side_list_id, side_set_id_ndx;
+  size_t  num_side_in_set, start[1], count[1]; 
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_SS, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no side sets defined in file id %d",
+            exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of side set id in VAR_SS_IDS array */
+
+  if ((side_set_id_ndx = ex_id_lkup(exoid, EX_SIDE_SET, side_set_id)) < 0)
+  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL side set %"PRId64" in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_put_partial_side_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+     "Error: failed to locate side set id %"PRId64" in VAR_SS_IDS array in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_put_partial_side_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimensions  */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_SIDE_SS(side_set_id_ndx), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+      "Error: failed to locate number of sides in side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_side_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+         "Error: failed to get number of sides in side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of side numbers */
+  if (start_side_num < 0 || (num_sides > 0 && start_side_num > num_side_in_set)) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_sides < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of elements in side set!");
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_side_num now starts at 1, not 0 */
+  if ((start_side_num + num_sides) > num_side_in_set+1) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of elements in set!");
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* inquire id's of previously defined variables  */
+  if ((status = nc_inq_varid (exoid, VAR_ELEM_SS(side_set_id_ndx), &elem_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+           "Error: failed to locate element list for side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_SIDE_SS(side_set_id_ndx), &side_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate side list for side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* write out the element list and side list arrays */
+  start[0] = --start_side_num;
+  count[0] = num_sides;
+  if (num_sides == 0)
+    start[0] = 0;
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, elem_list_id, start, count, side_set_elem_list);
+  } else {
+    status = nc_put_vara_int(exoid, elem_list_id, start, count, side_set_elem_list);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+      "Error: failed to store element list for side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_vara_longlong(exoid, side_list_id, start, count, side_set_side_list);
+  } else {
+    status = nc_put_vara_int(exoid, side_list_id, start, count, side_set_side_list);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+      "Error: failed to store side list for side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_side_set_df.c b/exodus/cbind/src/ex_put_partial_side_set_df.c
new file mode 100644
index 0000000..990cf11
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_side_set_df.c
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *
+ *      ex_put_partial_side_set_df()
+ *
+ *****************************************************************************
+ *
+ *  Variable Index:
+ *
+ *      exoid               - The NetCDF ID of an already open NemesisI file.
+ *      side_set_id        - ID of side set to written.
+ *      start_num          - The starting index of the df's to be written.
+ *      num_df_to_get      - The number of sides to write.
+ *      side_set_dist_fact - List of distribution factors for the side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+
+/*
+ * writes the distribution factors for a single side set
+ */
+
+int ex_put_partial_side_set_df (int   exoid,
+                          ex_entity_id   side_set_id,
+                          int64_t   start_num,
+                          int64_t   num_df_to_get,
+                          void *side_set_dist_fact)
+{
+  int status;
+  int dimid, side_set_id_ndx;
+  int dist_id;
+  size_t num_df_in_set,  start[1], count[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any side sets are specified */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_SS, &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no side sets specified in file id %d",
+            exoid);
+    ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of side set id in VAR_SS_IDS array */
+
+  if ((side_set_id_ndx = ex_id_lkup(exoid, EX_SIDE_SET, side_set_id)) < 0)
+  {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL side set %"PRId64" in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_put_side_set_fact",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+     "Error: failed to locate side set id %"PRId64" in VAR_SS_IDS array in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* inquire id's of previously defined dimension and variable */
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_DF_SS(side_set_id_ndx), &dimid)) != NC_NOERR) {
+    if (status == NC_EBADDIM) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+              "Warning: no dist factors defined for side set %"PRId64" in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+      return (EX_WARN);
+
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+  "Error: failed to locate number of dist factors in side set %"PRId64" in file id %d",
+              side_set_id, exoid);
+      ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ((status = nc_inq_dimlen(exoid, dimid, &num_df_in_set)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+     "Error: failed to get number of dist factors in side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Check input parameters for a valid range of numbers */
+  if (start_num < 0 || (num_df_to_get > 0 && start_num > num_df_in_set)) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid input");
+    ex_err("ex_put_partial_side_set_df", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (num_df_to_get < 0) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: Invalid number of df's to put!");
+    ex_err("ex_put_partial_side_set_df", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* start_num now starts at 1, not 0 */
+  if ((start_num + num_df_to_get) > num_df_in_set+1) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg, "Error: request larger than number of df's in set!");
+    ex_err("ex_put_partial_side_set_df", errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_varid (exoid, VAR_FACT_SS(side_set_id_ndx), &dist_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+      "Error: failed to locate dist factors list for side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* write out the distribution factors array */
+  start[0] = --start_num;
+  count[0] = num_df_to_get;
+  if (num_df_to_get == 0)
+    start[0] = 0;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, dist_id, start, count, side_set_dist_fact);
+  } else {
+    status = nc_put_vara_double(exoid, dist_id, start, count, side_set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to store dist factors for side set %"PRId64" in file id %d",
+            side_set_id, exoid);
+    ex_err("ex_put_partial_side_set_df",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_partial_var.c b/exodus/cbind/src/ex_put_partial_var.c
new file mode 100644
index 0000000..b067988
--- /dev/null
+++ b/exodus/cbind/src/ex_put_partial_var.c
@@ -0,0 +1,315 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_get_dimension, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+ * writes the values of a single variable for a partial block at one time
+ * step to the database; assume the first time step and variable index
+ * are 1
+ * \param      exoid           exodus file id
+ * \param      time_step       time step number
+ * \param      var_type        type (edge block, face block, edge set, ... )
+ * \param      var_index       element variable index
+ * \param      obj_id          element block id
+ * \param      start_index     index of first entity in block to write (1-based)
+ * \param      num_entities    number of entries in this block/set
+ * \param      var_vals        the values to be written
+ */
+
+int ex_put_partial_var (int   exoid,
+			int   time_step,
+			ex_entity_type var_type,
+			int   var_index,
+			ex_entity_id   obj_id,
+			int64_t   start_index,
+			int64_t   num_entities,
+			const void *var_vals)
+{
+  int varid, dimid,time_dim, numobjdim, dims[2], obj_id_ndx;
+  size_t num_obj;
+  size_t num_obj_var;
+  size_t num_entity;
+  size_t start[2], count[2];
+  int *obj_var_truth_tab;
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+#define EX_LOOK_UP_VAR(VOBJID,VVAR,VOBJTAB,DNUMOBJ,DNUMOBJVAR)		\
+  /* Determine index of obj_id in VOBJID array */			\
+    obj_id_ndx = ex_id_lkup(exoid,var_type,obj_id);			\
+    if (exerrval != 0)							\
+      {									\
+	if (exerrval == EX_NULLENTITY)					\
+	  {								\
+	    sprintf(errmsg,						\
+		    "Warning: no variables allowed for NULL block %"PRId64" in file id %d", \
+		    obj_id,exoid);					\
+	    ex_err("ex_put_partial_var",errmsg,EX_NULLENTITY);		\
+	    return (EX_WARN);						\
+	  }								\
+	else								\
+	  {								\
+	    sprintf(errmsg,						\
+		    "Error: failed to locate %s id %"PRId64" in %s array in file id %d", \
+		    ex_name_of_object(var_type), obj_id, VOBJID, exoid); \
+	    ex_err("ex_put_partial_var",errmsg,exerrval);		\
+	    return (EX_FATAL);						\
+	  }								\
+      }									\
+									\
+    if ((status = nc_inq_varid (exoid, VVAR(var_index,obj_id_ndx), &varid)) != NC_NOERR) \
+      {									\
+	if (status == NC_ENOTVAR) /* variable doesn't exist, create it! */ \
+	  {								\
+	    /* check for the existance of an TNAME variable truth table */ \
+	    if (nc_inq_varid(exoid, VOBJTAB, &varid) == NC_NOERR) {	\
+	      /* find out number of TNAMEs and TNAME variables */	\
+	      status = ex_get_dimension(exoid, DNUMOBJ, ex_name_of_object(var_type), &num_obj, &dimid, "ex_put_partial_var"); \
+	      if (status != NC_NOERR) return status;			\
+									\
+	      status = ex_get_dimension(exoid, DNUMOBJVAR, ex_name_of_object(var_type), &num_obj_var, &dimid, "ex_put_partial_var"); \
+	      if (status != NC_NOERR) return status;			\
+									\
+	      if (!(obj_var_truth_tab = malloc(num_obj*num_obj_var*sizeof(int)))) \
+		{							\
+		  exerrval = EX_MEMFAIL;				\
+		  sprintf(errmsg,					\
+			  "Error: failed to allocate memory for %s variable truth table in file id %d", \
+			  ex_name_of_object(var_type), exoid);		\
+		  ex_err("ex_put_partial_var",errmsg,exerrval);		\
+		  return (EX_FATAL);					\
+		}							\
+									\
+	      /*   read in the TNAME variable truth table */		\
+	      if ((status = nc_get_var_int (exoid, varid, obj_var_truth_tab)) != NC_NOERR) \
+		{							\
+		  exerrval = status;					\
+		  sprintf(errmsg,					\
+			  "Error: failed to get truth table from file id %d", exoid); \
+		  ex_err("ex_put_partial_var",errmsg,exerrval);		\
+		  return (EX_FATAL);					\
+		}							\
+									\
+	      if(obj_var_truth_tab[num_obj_var*(obj_id_ndx-1)+var_index-1] \
+		 == 0L)							\
+		{							\
+		  free(obj_var_truth_tab);				\
+		  exerrval = EX_BADPARAM;				\
+		  sprintf(errmsg,					\
+			  "Error: Invalid %s variable %d, %s %"PRId64" in file id %d", \
+			  ex_name_of_object(var_type), var_index, ex_name_of_object(var_type), obj_id, exoid); \
+		  ex_err("ex_put_partial_var",errmsg,exerrval);		\
+		  return (EX_FATAL);					\
+		}							\
+	      free(obj_var_truth_tab);					\
+	    }								\
+									\
+	    if ((status = nc_inq_dimid(exoid, DIM_TIME, &time_dim)) != NC_NOERR) { \
+	      exerrval = status;					\
+	      sprintf(errmsg,						\
+		      "Error: failed to locate time dimension in file id %d", exoid); \
+	      ex_err("ex_put_partial_var",errmsg,exerrval);		\
+	      goto error_ret;         /* exit define mode and return */ \
+	    }								\
+									\
+	    ex_get_dimension(exoid, ex_dim_num_entries_in_object(var_type, obj_id_ndx), \
+			     ex_name_of_object(var_type), &num_entity, &numobjdim,  "ex_put_partial_var"); \
+									\
+	    /*    variable doesn't exist so put file into define mode  */ \
+	    if ((status = nc_redef (exoid)) != NC_NOERR) {		\
+	      exerrval = status;					\
+	      sprintf(errmsg,						\
+		      "Error: failed to put file id %d into define mode", exoid); \
+	      ex_err("ex_put_partial_var",errmsg,exerrval);		\
+	      return (EX_FATAL);					\
+	    }								\
+									\
+	    /* define netCDF variable to store TNAME variable values */	\
+	    dims[0] = time_dim;						\
+	    dims[1] = numobjdim;					\
+	    if ((status = nc_def_var(exoid, VVAR(var_index,obj_id_ndx), \
+				     nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR)	\
+	      {								\
+		exerrval = status;					\
+		sprintf(errmsg,						\
+			"Error: failed to define %s variable %d in file id %d", \
+			ex_name_of_object(var_type), var_index,exoid);	\
+		ex_err("ex_put_partial_var",errmsg,exerrval);		\
+		goto error_ret;						\
+	      }								\
+	    ex_compress_variable(exoid, varid, 2);			\
+									\
+	    /*    leave define mode  */					\
+									\
+	    if ((status = nc_enddef (exoid)) != NC_NOERR)		\
+	      {								\
+		exerrval = status;					\
+		sprintf(errmsg,						\
+			"Error: failed to complete %s variable %s definition to file id %d", \
+			ex_name_of_object(var_type), VVAR(var_index,obj_id_ndx), exoid); \
+		ex_err("ex_put_partial_var",errmsg,exerrval);		\
+		return (EX_FATAL);					\
+	      }								\
+	  }								\
+	else								\
+	  {								\
+	    exerrval = status;						\
+	    sprintf(errmsg,						\
+		    "Error: failed to locate %s variable %s in file id %d", \
+		    ex_name_of_object(var_type), VVAR(var_index,obj_id_ndx),exoid); \
+	    ex_err("ex_put_partial_var",errmsg,exerrval);		\
+	    return (EX_FATAL);						\
+	  }								\
+      }
+
+  switch (var_type) {
+  case EX_GLOBAL:
+    if ( num_entities <= 0 ) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+	      "Warning: no global variables specified for file id %d",
+	      exoid);
+      ex_err("ex_put_glob_vars",errmsg,exerrval);
+
+      return (EX_WARN);
+    }
+    /* inquire previously defined variable */
+
+    if ((status = nc_inq_varid (exoid, VAR_GLO_VAR, &varid)) != NC_NOERR) {
+      if (status == NC_ENOTVAR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: no global variables defined in file id %d",
+		exoid);
+        ex_err("ex_put_glob_vars",errmsg,exerrval);
+      } else {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to get global variables parameters in file id %d",
+		exoid);
+        ex_err("ex_put_glob_vars",errmsg,exerrval);
+      }
+      return (EX_FATAL);
+    } 
+    break;
+  case EX_NODAL:
+    return ex_put_partial_nodal_var(exoid, time_step, var_index, start_index, num_entities, var_vals);
+    break;
+  case EX_EDGE_BLOCK:
+    EX_LOOK_UP_VAR(VAR_ID_ED_BLK,VAR_EDGE_VAR,VAR_EBLK_TAB,DIM_NUM_ED_BLK,DIM_NUM_EDG_VAR);
+    break;
+  case EX_FACE_BLOCK:
+    EX_LOOK_UP_VAR(VAR_ID_FA_BLK,VAR_FACE_VAR,VAR_FBLK_TAB,DIM_NUM_FA_BLK,DIM_NUM_FAC_VAR);
+    break;
+  case EX_ELEM_BLOCK:
+    EX_LOOK_UP_VAR(VAR_ID_EL_BLK,VAR_ELEM_VAR,VAR_ELEM_TAB,DIM_NUM_EL_BLK,DIM_NUM_ELE_VAR);
+    break;
+  case EX_NODE_SET:
+    EX_LOOK_UP_VAR(VAR_NS_IDS,VAR_NS_VAR,VAR_NSET_TAB,DIM_NUM_NS,DIM_NUM_NSET_VAR);
+    break;
+  case EX_EDGE_SET:
+    EX_LOOK_UP_VAR(VAR_ES_IDS,VAR_ES_VAR,VAR_ESET_TAB,DIM_NUM_ES,DIM_NUM_ESET_VAR);
+    break;
+  case EX_FACE_SET:
+    EX_LOOK_UP_VAR(VAR_FS_IDS,VAR_FS_VAR,VAR_FSET_TAB,DIM_NUM_FS,DIM_NUM_FSET_VAR);
+    break;
+  case EX_SIDE_SET:
+    EX_LOOK_UP_VAR(VAR_SS_IDS,VAR_SS_VAR,VAR_SSET_TAB,DIM_NUM_SS,DIM_NUM_SSET_VAR);
+    break;
+  case EX_ELEM_SET:
+    EX_LOOK_UP_VAR(VAR_ELS_IDS,VAR_ELS_VAR,VAR_ELSET_TAB,DIM_NUM_ELS,DIM_NUM_ELSET_VAR);
+    break;
+  default:
+    exerrval = EX_MSG;
+    sprintf( errmsg, "Error: invalid variable type (%d) specified for file id %d",
+	     var_type, exoid );
+    ex_err( "ex_put_partial_var", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+  /* store element variable values */
+
+  start[0] = --time_step;
+  start[1] = start_index-1;
+  if ( var_type == EX_GLOBAL ) {
+    /* global variables may be written
+     * - all at once (by setting var_index to 1 and num_entries_this_obj to num_glob, or
+     * - one at a time (by setting var_index to the desired index and num_entries_this_obj to 1.
+     */
+    count[0] = var_index;
+  } else {
+    count[0] = 1;
+  }
+  count[1] = num_entities;
+  if (count[1] == 0)
+    start[1] = 0;
+  
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, varid, start, count, var_vals);
+  } else {
+    status = nc_put_vara_double(exoid, varid, start, count, var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store %s %"PRId64" variable %d in file id %d", 
+	    ex_name_of_object(var_type), obj_id, var_index,exoid);
+    ex_err("ex_put_partial_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+	      "Error: failed to complete definition for file id %d",
+	      exoid);
+      ex_err("ex_put_partial_var",errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_processor_elem_maps.c b/exodus/cbind/src/ex_put_processor_elem_maps.c
new file mode 100644
index 0000000..f1e2d68
--- /dev/null
+++ b/exodus/cbind/src/ex_put_processor_elem_maps.c
@@ -0,0 +1,267 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *      ex_put_elem_map()
+ *****************************************************************************
+ * This function outputs the elemental map.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid             - The NetCDF ID of an already open NemesisI file.
+ *      elem_mapi        - Vector of internal element IDs.
+ *      elem_mapb        - Vector of border element IDs.
+ *      processor        - The processor ID for which info is to be read.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for ex_err, exerrval, etc
+#include <exodusII_int.h>               // for EX_FATAL, DIM_NUM_BOR_ELEMS, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_processor_elem_maps(int  exoid,
+			       void_int *elem_mapi,
+			       void_int *elem_mapb,
+			       int  processor
+			       )
+{
+  const char  *func_name="ex_put_processor_elem_maps";
+
+  char    ftype[2];
+  int     status, dimid, varid;
+  size_t  start[1], count[1];
+  int64_t varidx[2];
+  int  nmstat;
+
+  char   errmsg[MAX_ERR_LENGTH];
+  /*-----------------------------Execution begins-----------------------------*/
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: unable to find file type for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the status of the internal element map */
+  if ((status = nc_inq_varid(exoid, VAR_INT_E_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get variable \"%s\" from file ID %d",
+            VAR_INT_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_ELEM_MAP_INT_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_ELEM_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    if (varidx[1] == -1) {
+      /* Get the size of the internal element map */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_INT_ELEMS, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_INT_ELEMS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_INT_ELEMS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_ELEM_MAP_INT, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_ELEM_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Output the map */
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_put_vara_longlong(exoid, varid, start, count, elem_mapi);
+    } else {
+      status = nc_put_vara_int(exoid, varid, start, count, elem_mapi);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+  } /* End "if (nmstat == 1)" */
+
+  /* Get the status of the border element map */
+  if ((status = nc_inq_varid(exoid, VAR_BOR_E_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 's')
+    start[0] = processor;
+  else
+    start[0] = 0;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file %d",
+            VAR_BOR_E_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_ELEM_MAP_BOR_IDX, varidx, processor) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_ELEM_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    if (varidx[1] == -1) {
+      /* Get the size of the border element map */
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_BOR_ELEMS, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_BOR_ELEMS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_BOR_ELEMS, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_ELEM_MAP_BOR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_ELEM_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Output the map */
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_put_vara_longlong(exoid, varid, start, count, elem_mapb);
+    } else {
+      status = nc_put_vara_int(exoid, varid, start, count, elem_mapb);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable \"%s\" in file ID %d",
+              VAR_ELEM_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (nmstat == 1)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_processor_node_maps.c b/exodus/cbind/src/ex_put_processor_node_maps.c
new file mode 100644
index 0000000..207cdf5
--- /dev/null
+++ b/exodus/cbind/src/ex_put_processor_node_maps.c
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************
+ * This function outputs the nodal map.
+ *****************************************************************************
+ * Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      node_mapi       - Pointer to vector containing the internal FEM
+ *                        nodal IDs.
+ *      node_mapb       - Pointer to vector containing the border FEM
+ *                        nodal IDs.
+ *      node_mape       - Pointer to vector containing the external FEM
+ *                        nodal IDs.
+ *      proc_id         - The processor the file is being written for.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+
+#include <exodusII.h>                   // for exerrval, ex_err, etc
+#include <exodusII_int.h>               // for EX_FATAL, DIM_NUM_BOR_NODES, etc
+#include <netcdf.h>                     // for NC_NOERR, nc_inq_varid, etc
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <sys/types.h>                  // for int64_t
+
+
+
+int ex_put_processor_node_maps(int  exoid,
+			       void_int *node_mapi,
+			       void_int *node_mapb,
+			       void_int *node_mape,
+			       int  proc_id
+			       )
+{
+  const char  *func_name="ex_put_processor_node_maps";
+
+  int     status, varid, dimid;
+  char    ftype[2];
+  size_t  start[1], count[1];
+  int64_t varidx[2];
+  int  nmstat;
+
+  char   errmsg[MAX_ERR_LENGTH];
+  /*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the file type */
+  if (ex_get_file_type(exoid, ftype) != EX_NOERR) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+            "Error: unable to find file type for file ID %d",
+            exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the status of this node map */
+  if ((status = nc_inq_varid(exoid, VAR_INT_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = proc_id;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file %d",
+            VAR_INT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Write out the internal node-number map */
+  if (nmstat == 1) {
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_NODE_MAP_INT_IDX, varidx, proc_id) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_NODE_MAP_INT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension */
+    if (varidx[1] == -1) {
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_INT_NODES, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_INT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_INT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_NODE_MAP_INT, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NODE_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_put_vara_longlong(exoid, varid, start, count, node_mapi);
+    } else {
+      status = nc_put_vara_int(exoid, varid, start, count, node_mapi);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_INT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (nmstat == 1)" */
+
+  /* Get the status of this node map */
+  if ((status = nc_inq_varid(exoid, VAR_BOR_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = proc_id;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file %d",
+            VAR_BOR_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* Write out the border node-number map */
+    /* get the index */
+    if (ex_get_idx(exoid, VAR_NODE_MAP_BOR_IDX, varidx, proc_id) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_NODE_MAP_BOR_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension */
+    if (varidx[1] == -1) {
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_BOR_NODES, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_BOR_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_BOR_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_NODE_MAP_BOR, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NODE_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* Output the map */
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_put_vara_longlong(exoid, varid, start, count, node_mapb);
+    } else {
+      status = nc_put_vara_int(exoid, varid, start, count, node_mapb);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_BOR, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (nmstat == 1)" */
+
+  /* Get the status of this node map */
+  if ((status = nc_inq_varid(exoid, VAR_EXT_N_STAT, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" from file ID %d",
+            VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (ftype[0] == 'p')
+    start[0] = 0;
+  else
+    start[0] = proc_id;
+
+  if ((status = nc_get_var1_int(exoid, varid, start, &nmstat)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get status for \"%s\" from file %d",
+            VAR_EXT_N_STAT, exoid);
+    ex_err(func_name, errmsg, exerrval);
+    return (EX_FATAL);
+  }
+
+  if (nmstat == 1) {
+    /* Write out the external node-number map */
+    if (ex_get_idx(exoid, VAR_NODE_MAP_EXT_IDX, varidx, proc_id) == -1) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find index variable, \"%s\", in file ID %d",
+              VAR_NODE_MAP_EXT_IDX, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* check if I need to get the dimension */
+    if (varidx[1] == -1) {
+      if ((status = nc_inq_dimid(exoid, DIM_NUM_EXT_NODES, &dimid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find dimension ID for \"%s\" in file ID %d",
+                DIM_NUM_EXT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimlen(exoid, dimid, count)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+		"Error: failed to find length of dimension \"%s\" in file ID %d",
+                DIM_NUM_EXT_NODES, exoid);
+        ex_err(func_name, errmsg, exerrval);
+        return (EX_FATAL);
+      }
+      varidx[1] = count[0];
+    }
+
+    if ((status = nc_inq_varid(exoid, VAR_NODE_MAP_EXT, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to find variable ID for \"%s\" in file ID %d",
+              VAR_NODE_MAP_EXT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+
+      return (EX_FATAL);
+    }
+
+    /* Output the map */
+    start[0] = varidx[0];
+    count[0] = varidx[1] - varidx[0];
+    if (ex_int64_status(exoid) & EX_MAPS_INT64_API) {
+      status = nc_put_vara_longlong(exoid, varid, start, count, node_mape);
+    } else {
+      status = nc_put_vara_int(exoid, varid, start, count, node_mape);
+    }
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to output variable \"%s\" in file ID %d",
+              VAR_NODE_MAP_EXT, exoid);
+      ex_err(func_name, errmsg, exerrval);
+      return (EX_FATAL);
+    }
+  } /* End "if (nmstat == 1)" */
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_prop.c b/exodus/cbind/src/ex_put_prop.c
new file mode 100644
index 0000000..98e5442
--- /dev/null
+++ b/exodus/cbind/src/ex_put_prop.c
@@ -0,0 +1,416 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include <string.h>                     // for strcpy, memset, strcmp, etc
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_id_lkup, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_set_fill, etc
+
+/*!
+  
+The function ex_put_prop() stores an integer object property value to
+a single element block, node set, or side set. Although it is not
+necessary to invoke ex_put_prop_names(), since ex_put_prop() will
+allocate space within the data file if it hasn't been previously
+allocated, it is more efficient to use ex_put_prop_names() if there is
+more than one property to store. \see Efficiency for a discussion of
+efficiency issues.
+
+It should be noted that the interpretation of the values of the
+integers stored as properties is left to the application code. In
+general, a zero (0) means the object does not have the specified
+property (or is not in the specified group); a nonzero value means the
+object does have the specified property. When space is allocated for
+the properties using ex_put_prop_names() or ex_put_prop(), the
+properties are initialized to zero (0).
+
+Because the ID of an element block, node set, or side set is just
+another property (named \b ID), this routine can be used to change
+the value of an ID. This feature must be used with caution, though,
+because changing the ID of an object to the ID of another object of
+the same type (element block, node set, or side set) would cause two
+objects to have the same ID, and thus only the first would be
+accessible. Therefore, ex_put_prop() issues a warning if a user
+attempts to give two objects the same ID.
+
+\return In case of an error, ex_put_prop() returns a negative number;
+a warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  invalid object type specified.
+  -  a warning is issued if a user attempts to change the ID of an
+     object to the ID of an existing object of the same type.
+
+\param[in] exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] obj_type   Type of object; use one of the options in the table below.
+\param[in] obj_id     The element block, node set, or side set ID.
+\param[in]  prop_name The name of the property for which the value will be stored. 
+                      Maximum length of this string is \p MAX_STR_LENGTH .
+\param[in] value      The value of the property.
+
+<table>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_MAP   </td><td>  Element Map entity type  </td></tr>
+<tr><td> \c EX_NODE_MAP   </td><td>  Node Map entity type     </td></tr>
+<tr><td> \c EX_EDGE_MAP   </td><td>  Edge Map entity type     </td></tr>
+<tr><td> \c EX_FACE_MAP   </td><td>  Face Map entity type     </td></tr>
+</table>
+
+For an example of code to write out an object property, refer to the
+description for ex_put_prop_names().
+*/
+
+int ex_put_prop (int   exoid,
+                 ex_entity_type obj_type,
+                 ex_entity_id   obj_id,
+                 const char *prop_name,
+                 ex_entity_id   value)
+{
+  int status;
+  int oldfill = 0;
+  int temp;
+  int found = EX_FALSE;
+  int num_props, i, dimid, propid, dims[1];
+  int int_type;
+  size_t start[1]; 
+  size_t prop_name_len, name_length;
+  char name[MAX_VAR_NAME_LENGTH+1];
+  char tmpstr[MAX_STR_LENGTH+1];
+  char dim_name[MAX_VAR_NAME_LENGTH+1];
+  long long vals[1];
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval  = 0; /* clear error code */
+
+  /* check if property has already been created */
+
+  num_props = ex_get_num_props(exoid, obj_type);
+
+  if (num_props > 1) {  /* any properties other than the default 1? */
+
+    for (i=1; i<=num_props; i++) {
+      switch (obj_type) {
+      case EX_ELEM_BLOCK:
+	strcpy (name, VAR_EB_PROP(i));
+	break;
+      case EX_EDGE_BLOCK:
+	strcpy (name, VAR_ED_PROP(i));
+	break;
+      case EX_FACE_BLOCK:
+	strcpy (name, VAR_FA_PROP(i));
+	break;
+      case EX_NODE_SET:
+	strcpy (name, VAR_NS_PROP(i));
+	break;
+      case EX_EDGE_SET:
+	strcpy (name, VAR_ES_PROP(i));
+	break;
+      case EX_FACE_SET:
+	strcpy (name, VAR_FS_PROP(i));
+	break;
+      case EX_ELEM_SET:
+	strcpy (name, VAR_ELS_PROP(i));
+	break;
+      case EX_SIDE_SET:
+	strcpy (name, VAR_SS_PROP(i));
+	break;
+      case EX_ELEM_MAP:
+	strcpy (name, VAR_EM_PROP(i));
+	break;
+      case EX_FACE_MAP:
+	strcpy (name, VAR_FAM_PROP(i));
+	break;
+      case EX_EDGE_MAP:
+	strcpy (name, VAR_EDM_PROP(i));
+	break;
+      case EX_NODE_MAP:
+	strcpy (name, VAR_NM_PROP(i));
+	break;
+      default:
+	exerrval = EX_BADPARAM;
+	sprintf(errmsg, "Error: object type %d not supported; file id %d",
+		obj_type, exoid);
+	ex_err("ex_put_prop",errmsg,exerrval);
+	return(EX_FATAL);
+      }
+
+      if ((status = nc_inq_varid(exoid, name, &propid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get property array id in file id %d",
+		exoid);
+	ex_err("ex_put_prop",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      /*   compare stored attribute name with passed property name   */
+      memset(tmpstr, 0, MAX_STR_LENGTH+1);
+      if ((status = nc_get_att_text(exoid, propid, ATT_PROP_NAME, tmpstr)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get property name in file id %d", exoid);
+	ex_err("ex_put_prop",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      if (strcmp(tmpstr, prop_name) == 0) {
+	found = EX_TRUE;
+	break;
+      }
+    }
+  }
+
+  /* if property array has not been created, create it */
+  if (!found) {
+
+    name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH)+1;
+
+    /* put netcdf file into define mode  */
+    if ((status = nc_redef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /*   create a variable with a name xx_prop#, where # is the new number   */
+    /*   of the property                                                     */
+
+    switch (obj_type){
+    case EX_ELEM_BLOCK:
+      strcpy (name, VAR_EB_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_EL_BLK);
+      break;
+    case EX_FACE_BLOCK:
+      strcpy (name, VAR_FA_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_FA_BLK);
+      break;
+    case EX_EDGE_BLOCK:
+      strcpy (name, VAR_ED_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_ED_BLK);
+      break;
+    case EX_NODE_SET:
+      strcpy (name, VAR_NS_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_NS);
+      break;
+    case EX_EDGE_SET:
+      strcpy (name, VAR_ES_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_ES);
+      break;
+    case EX_FACE_SET:
+      strcpy (name, VAR_FS_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_FS);
+      break;
+    case EX_ELEM_SET:
+      strcpy (name, VAR_ELS_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_ELS);
+      break;
+    case EX_SIDE_SET:
+      strcpy (name, VAR_SS_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_SS);
+      break;
+    case EX_ELEM_MAP:
+      strcpy (name, VAR_EM_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_EM);
+      break;
+    case EX_FACE_MAP:
+      strcpy (name, VAR_FAM_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_FAM);
+      break;
+    case EX_EDGE_MAP:
+      strcpy (name, VAR_EDM_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_EDM);
+      break;
+    case EX_NODE_MAP:
+      strcpy (name, VAR_NM_PROP(num_props+1));
+      strcpy (dim_name, DIM_NUM_NM);
+      break;
+    default:
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg, "Error: object type %d not supported; file id %d",
+	      obj_type, exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      goto error_ret;        /* Exit define mode and return */
+    }
+
+    /*   inquire id of previously defined dimension (number of objects) */
+    if ((status = nc_inq_dimid(exoid, dim_name, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate number of objects in file id %d",
+	      exoid);
+      ex_err("ex_put_prop",errmsg, exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    dims[0] = dimid;
+    nc_set_fill(exoid, NC_FILL, &oldfill); /* fill with zeros per routine spec */
+
+    int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+      int_type = NC_INT64;
+    }
+
+    if ((status = nc_def_var(exoid, name, int_type, 1, dims, &propid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create property array variable in file id %d",
+	      exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    vals[0] = 0; /* fill value */
+    /*   create attribute to cause variable to fill with zeros per routine spec */
+    if ((status = nc_put_att_longlong(exoid, propid, _FillValue, int_type, 1, vals)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create property name fill attribute in file id %d",
+	      exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    /*   Check that the property name length is less than MAX_NAME_LENGTH */
+    prop_name_len = strlen(prop_name)+1;
+    if (prop_name_len > name_length) {
+      fprintf(stderr,
+	      "Warning: The property name '%s' is too long.\n\tIt will be truncated from %d to %d characters\n",
+	      prop_name, (int)prop_name_len-1, (int)name_length-1);
+      prop_name_len = name_length;
+    }
+
+    /*   store property name as attribute of property array variable */
+    if ((status = nc_put_att_text(exoid, propid, ATT_PROP_NAME, 
+				  prop_name_len, (void*)prop_name)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store property name %s in file id %d",
+	      prop_name,exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    ex_update_max_name_length(exoid, prop_name_len-1);
+    
+    /* leave define mode  */
+    if ((status = nc_enddef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to leave define mode in file id %d",
+	      exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    nc_set_fill(exoid, oldfill, &temp); /* default: nofill */
+  }
+
+  /* find index into property array using obj_id; put value in property */
+  /* array at proper index; ex_id_lkup returns an index that is 1-based,*/
+  /* but netcdf expects 0-based arrays so subtract 1                    */
+
+  /* special case: property name ID - check for duplicate ID assignment */
+  if (strcmp("ID",prop_name) == 0) {
+    start[0] = ex_id_lkup (exoid, obj_type, value);
+    if (exerrval != EX_LOOKUPFAIL)   /* found the id */
+      {
+	exerrval = EX_BADPARAM;
+	sprintf(errmsg,
+		"Warning: attempt to assign duplicate %s ID %"PRId64" in file id %d",
+		ex_name_of_object(obj_type), value, exoid);
+	ex_err("ex_put_prop",errmsg,exerrval);
+	return (EX_WARN);
+      }
+  }
+
+  start[0] = ex_id_lkup (exoid, obj_type, obj_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: no properties allowed for NULL %s id %"PRId64" in file id %d",
+	      ex_name_of_object(obj_type), obj_id,exoid);
+      ex_err("ex_put_prop",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to find value %"PRId64" in %s property array in file id %d",
+	      obj_id, ex_name_of_object(obj_type), exoid);
+      ex_err("ex_put_prop",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  start[0] = start[0] - 1; 
+
+  /* value is of type 'ex_entity_id' which is a typedef to int64_t or long long */
+  status = nc_put_var1_longlong(exoid, propid, start, (long long*)&value);
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store property value in file id %d",
+	    exoid);
+    ex_err("ex_put_prop",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  nc_set_fill(exoid, oldfill, &temp); /* default: nofill */
+
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_prop",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_prop_array.c b/exodus/cbind/src/ex_put_prop_array.c
new file mode 100644
index 0000000..7b3b8af
--- /dev/null
+++ b/exodus/cbind/src/ex_put_prop_array.c
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strcpy, memset, strlen, etc
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, ATT_PROP_NAME, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_set_fill, etc
+
+/*!
+
+The function ex_put_prop_array() stores an array of ({num_elem_blk},
+\c num_node_sets, or \c num_side_sets) integer property values for all
+element blocks, node sets, or side sets. The order of the values in
+the array must correspond to the order in which the element blocks,
+node sets, or side sets were introduced into the file. For instance,
+if the parameters for element block with ID 20 were written to a file
+(via ex_put_elem_block()), and then parameters for element block with
+ID 10, followed by the parameters for element block with ID 30, the
+first, second, and third elements in the property array would
+correspond to element block 20, element block 10, and element block
+30, respectively.
+
+One should note that this same functionality (writing properties to
+multiple objects) can be accomplished with multiple calls to
+ex_put_prop().
+
+Although it is not necessary to invoke ex_put_prop_names(), since
+ex_put_prop_array() will allocate space within the data file if it
+hasn't been previously allocated, it is more efficient to use
+ex_put_prop_names() if there is more than one property to store. \see
+See Efficiency for a discussion of efficiency issues.
+
+\return In case of an error, ex_put_prop_array() returns a negative
+number; a warning will return a positive number. Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  invalid object type specified.
+
+\param[in] exoid      exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] obj_type   Type of object; use one of the options in the table below.
+\param[in] prop_name  The name of the property for which the values will be stored. Maximum
+                      length of this string is \p MAX_STR_LENGTH .
+\param[in] values     An array of property values.
+
+<table>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_MAP   </td><td>  Element Map entity type  </td></tr>
+<tr><td> \c EX_NODE_MAP   </td><td>  Node Map entity type     </td></tr>
+<tr><td> \c EX_EDGE_MAP   </td><td>  Edge Map entity type     </td></tr>
+<tr><td> \c EX_FACE_MAP   </td><td>  Face Map entity type     </td></tr>
+</table>
+
+For an example of code to write an array of object properties, refer
+to the description for ex_put_prop_names().
+ */
+
+int ex_put_prop_array (int   exoid,
+                       ex_entity_type obj_type,
+                       const char *prop_name,
+                       const void_int  *values)
+{
+  int oldfill = 0;
+  int temp;
+  int num_props, i, propid, dimid, dims[1], status;
+  int found = EX_FALSE;
+  int int_type;
+  size_t num_obj; 
+  char name[MAX_VAR_NAME_LENGTH+1];
+  char tmpstr[MAX_STR_LENGTH+1];
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval  = 0; /* clear error code */
+
+  /* check if property has already been created */
+
+  num_props = ex_get_num_props(exoid, obj_type);
+
+  /* inquire id of previously defined dimension (number of objects) */
+  status = ex_get_dimension(exoid, ex_dim_num_objects(obj_type), ex_name_of_object(obj_type),
+			    &num_obj, &dimid, "ex_put_prop_array");
+  if (status != NC_NOERR) return status;
+
+  for (i=1; i<=num_props; i++) {
+    switch (obj_type){
+    case EX_ELEM_BLOCK:
+      strcpy (name, VAR_EB_PROP(i));
+      break;
+    case EX_FACE_BLOCK:
+      strcpy (name, VAR_FA_PROP(i));
+      break;
+    case EX_EDGE_BLOCK:
+      strcpy (name, VAR_ED_PROP(i));
+      break;
+    case EX_NODE_SET:
+      strcpy (name, VAR_NS_PROP(i));
+      break;
+    case EX_EDGE_SET:
+      strcpy (name, VAR_ES_PROP(i));
+      break;
+    case EX_FACE_SET:
+      strcpy (name, VAR_FS_PROP(i));
+      break;
+    case EX_ELEM_SET:
+      strcpy (name, VAR_ELS_PROP(i));
+      break;
+    case EX_SIDE_SET:
+      strcpy (name, VAR_SS_PROP(i));
+      break;
+    case EX_ELEM_MAP:
+      strcpy (name, VAR_EM_PROP(i));
+      break;
+    case EX_FACE_MAP:
+      strcpy (name, VAR_FAM_PROP(i));
+      break;
+    case EX_EDGE_MAP:
+      strcpy (name, VAR_EDM_PROP(i));
+      break;
+    case EX_NODE_MAP:
+      strcpy (name, VAR_NM_PROP(i));
+      break;
+    default:
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg, "Error: object type %d not supported; file id %d",
+	      obj_type, exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      return(EX_FATAL);
+    }
+
+    if ((status = nc_inq_varid(exoid, name, &propid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get property array id in file id %d",
+	      exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* compare stored attribute name with passed property name   */
+    memset(tmpstr, 0, MAX_STR_LENGTH+1);
+    if ((status = nc_get_att_text(exoid, propid, ATT_PROP_NAME, tmpstr)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to get property name in file id %d", exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (strcmp(tmpstr, prop_name) == 0) {
+      found = EX_TRUE;
+      break;
+    }
+  }
+
+  /* if property array has not been created, create it */
+  if (!found) {
+
+    /* put netcdf file into define mode  */
+    if ((status = nc_redef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /*   create a variable with a name xx_prop#, where # is the new number   */
+    /*   of properties                                                       */
+    switch (obj_type){
+    case EX_ELEM_BLOCK:
+      strcpy (name, VAR_EB_PROP(num_props+1));
+      break;
+    case EX_FACE_BLOCK:
+      strcpy (name, VAR_FA_PROP(num_props+1));
+      break;
+    case EX_EDGE_BLOCK:
+      strcpy (name, VAR_ED_PROP(num_props+1));
+      break;
+    case EX_NODE_SET:
+      strcpy (name, VAR_NS_PROP(num_props+1));
+      break;
+    case EX_EDGE_SET:
+      strcpy (name, VAR_ES_PROP(num_props+1));
+      break;
+    case EX_FACE_SET:
+      strcpy (name, VAR_FS_PROP(num_props+1));
+      break;
+    case EX_ELEM_SET:
+      strcpy (name, VAR_ELS_PROP(num_props+1));
+      break;
+    case EX_SIDE_SET:
+      strcpy (name, VAR_SS_PROP(num_props+1));
+      break;
+    case EX_ELEM_MAP:
+      strcpy (name, VAR_EM_PROP(num_props+1));
+      break;
+    case EX_FACE_MAP:
+      strcpy (name, VAR_FAM_PROP(num_props+1));
+      break;
+    case EX_EDGE_MAP:
+      strcpy (name, VAR_EDM_PROP(num_props+1));
+      break;
+    case EX_NODE_MAP:
+      strcpy (name, VAR_NM_PROP(num_props+1));
+      break;
+    default:
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg, "Error: object type %d not supported; file id %d",
+	      obj_type, exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      goto error_ret;        /* Exit define mode and return */
+    }
+
+    dims[0] = dimid;
+    nc_set_fill(exoid, NC_FILL, &oldfill); /* fill with zeros per routine spec */
+
+    int_type = NC_INT;
+    if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+      int_type = NC_INT64;
+    }
+
+    if ((status = nc_def_var(exoid, name, int_type, 1, dims, &propid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create property array variable in file id %d",
+	      exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+    nc_set_fill(exoid, oldfill, &temp); /* default: nofill */
+
+
+    /*   store property name as attribute of property array variable */
+    if ((status = nc_put_att_text(exoid, propid, ATT_PROP_NAME, 
+				  strlen(prop_name)+1, prop_name)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to store property name %s in file id %d",
+	      prop_name,exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    /* leave define mode  */
+
+    if ((status = nc_enddef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to leave define mode in file id %d",
+	      exoid);
+      ex_err("ex_put_prop_array",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* put num_obj values in property array */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, propid, values);
+  } else {
+    status = nc_put_var_int(exoid, propid, values);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store property values in file id %d",
+	    exoid);
+    ex_err("ex_put_prop_array",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  nc_set_fill(exoid, oldfill, &temp); /* default: nofill */
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_prop_array",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_prop_names.c b/exodus/cbind/src/ex_put_prop_names.c
new file mode 100644
index 0000000..90aed3b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_prop_names.c
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf, fprintf, stderr
+#include <string.h>                     // for strcpy, strlen
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_enddef, etc
+
+/*!
+
+The function ex_put_prop_names() writes object property names and
+allocates space for object property arrays used to assign integer
+properties to element blocks, node sets, or side sets. The property
+arrays are initialized to zero (0). Although this function is
+optional, since ex_put_prop() will allocate space within the data file
+if it hasn't been previously allocated, it is more efficient to use
+ex_put_prop_names() if there is more than one property to store. \see
+Efficiency for a discussion of efficiency issues.
+
+\return In case of an error, ex_put_prop_names() returns a negative number; a
+warning will return a positive number.  Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  data file not initialized properly with call to ex_put_init().
+  -  invalid object type specified.
+  -  no object of the specified type is stored in the file.
+
+\param[in] exoid       exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] obj_type    Type of object; use one of the options in the table below.
+\param[in] num_props   The number of integer properties to be assigned to all of the objects
+                       of the type specified (element blocks, node sets, or side sets).
+\param[in] prop_names  Array containing \c num_props names (of maximum length 
+                       of \p MAX_STR_LENGTH ) of properties to be stored.
+
+<table>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_MAP   </td><td>  Element Map entity type  </td></tr>
+<tr><td> \c EX_NODE_MAP   </td><td>  Node Map entity type     </td></tr>
+<tr><td> \c EX_EDGE_MAP   </td><td>  Edge Map entity type     </td></tr>
+<tr><td> \c EX_FACE_MAP   </td><td>  Face Map entity type     </td></tr>
+</table>
+
+For instance, suppose a user wanted to assign the 1st, 3rd, and 5th
+element blocks (those element blocks stored 1st, 3rd, and 5th,
+regardless of their ID) to a group (property) called \b TOP, and the
+2nd, 3rd, and 4th element blocks to a group called \b LSIDE. This
+could be accomplished with the following code:
+
+\code
+
+char* prop_names[2];
+int top_part[]   = {1,0,1,0,1};
+int lside_part[] = {0,1,1,1,0};
+
+int id[] = {10, 20, 30, 40, 50};
+
+prop_names[0] = "TOP";
+prop_names[1] = "LSIDE";
+
+\comment{This call to ex_put_prop_names is optional, but more efficient}
+ex_put_prop_names (exoid, EX_ELEM_BLOCK, 2, prop_names);
+
+\comment{The property values can be output individually thus}
+for (i=0; i < 5; i++) {
+   ex_put_prop (exoid, EX_ELEM_BLOCK, id[i], prop_names[0], 
+                top_part[i]);
+
+   ex_put_prop (exoid, EX_ELEM_BLOCK, id[i], prop_names[1], 
+                lside_part[i]);
+}
+
+\comment{Alternatively, the values can be output as an array}
+ex_put_prop_array (exoid, EX_ELEM_BLOCK, prop_names[0], 
+                   top_part);
+
+ex_put_prop_array (exoid, EX_ELEM_BLOCK, prop_names[1], 
+                   lside_part);
+
+\endcode
+
+*/
+
+int ex_put_prop_names (int   exoid,
+                       ex_entity_type obj_type,
+                       int   num_props,
+                       char **prop_names)
+{
+  int status;
+  int oldfill, temp;
+  int i, propid, dimid, dims[1];
+  size_t name_length, prop_name_len;
+  char name[MAX_VAR_NAME_LENGTH+1];
+  long long vals[1];
+  int max_name_len = 0;
+  int int_type = NC_INT;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval  = 0; /* clear error code */
+
+  if (ex_int64_status(exoid) & EX_IDS_INT64_DB) {
+    int_type = NC_INT64;
+  }
+
+  /* Get the name string length */
+  name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH)+1;
+
+  /* inquire id of previously defined dimension (number of objects) */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(obj_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate number of %s in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_put_prop_names",errmsg, exerrval);
+    return(EX_FATAL);
+  }
+
+  nc_set_fill(exoid, NC_FILL, &oldfill); /* fill with zeros per routine spec */
+
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,"Error: failed to place file id %d into define mode",exoid);
+    ex_err("ex_put_prop_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* define num_props variables; we postpend the netcdf variable name with  */
+  /* a counter starting at 2 because "xx_prop1" is reserved for the id array*/
+  dims[0] = dimid;
+
+  for (i=0; i<num_props; i++) {
+    switch (obj_type) {
+    case EX_ELEM_BLOCK:
+      strcpy (name, VAR_EB_PROP(i+2));
+      break;
+    case EX_FACE_BLOCK:
+      strcpy (name, VAR_FA_PROP(i+2));
+      break;
+    case EX_EDGE_BLOCK:
+      strcpy (name, VAR_ED_PROP(i+2));
+      break;
+    case EX_NODE_SET:
+      strcpy (name, VAR_NS_PROP(i+2));
+      break;
+    case EX_SIDE_SET:
+      strcpy (name, VAR_SS_PROP(i+2));
+      break;
+    case EX_EDGE_SET:
+      strcpy (name, VAR_ES_PROP(i+2));
+      break;
+    case EX_FACE_SET:
+      strcpy (name, VAR_FS_PROP(i+2));
+      break;
+    case EX_ELEM_SET:
+      strcpy (name, VAR_ELS_PROP(i+2));
+      break;
+    case EX_ELEM_MAP:
+      strcpy (name, VAR_EM_PROP(i+2));
+      break;
+    case EX_FACE_MAP:
+      strcpy (name, VAR_FAM_PROP(i+2));
+      break;
+    case EX_EDGE_MAP:
+      strcpy (name, VAR_EDM_PROP(i+2));
+      break;
+    case EX_NODE_MAP:
+      strcpy (name, VAR_NM_PROP(i+2));
+      break;
+    default:
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg, "Error: object type %d not supported; file id %d",
+	      obj_type, exoid);
+      ex_err("ex_put_prop_names",errmsg,exerrval);
+      goto error_ret;        /* Exit define mode and return */
+    }
+
+    if ((status = nc_def_var(exoid, name, int_type, 1, dims, &propid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create property array variable in file id %d",
+	      exoid);
+      ex_err("ex_put_prop_names",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    vals[0] = 0; /* fill value */
+
+    /*   create attribute to cause variable to fill with zeros per routine spec */
+    if ((status = nc_put_att_longlong(exoid, propid, _FillValue, int_type, 1, vals)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to create property name fill attribute in file id %d",
+	      exoid);
+      ex_err("ex_put_prop_names",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+
+    /*   Check that the property name length is less than MAX_NAME_LENGTH */
+    prop_name_len = strlen(prop_names[i])+1;
+    if (prop_name_len > name_length) {
+      fprintf(stderr,
+	      "Warning: The property name '%s' is too long.\n\tIt will be truncated from %d to %d characters\n",
+	      prop_names[i], (int)prop_name_len-1, (int)name_length-1);
+      prop_name_len = name_length;
+    }
+
+    if (prop_name_len > max_name_len)
+      max_name_len = prop_name_len;
+
+    /*   store property name as attribute of property array variable */
+    if ((status = nc_put_att_text(exoid, propid, ATT_PROP_NAME,
+				  prop_name_len, prop_names[i])) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+              "Error: failed to store property name %s in file id %d",
+	      prop_names[i],exoid);
+      ex_err("ex_put_prop_names",errmsg,exerrval);
+      goto error_ret;  /* Exit define mode and return */
+    }
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to leave define mode in file id %d", 
+	    exoid);
+    ex_err("ex_put_prop_names",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Update the maximum_name_length attribute on the file. */
+  ex_update_max_name_length(exoid, max_name_len-1);
+
+  nc_set_fill(exoid, oldfill, &temp); /* default: turn off fill */
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_prop_names",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_qa.c b/exodus/cbind/src/ex_put_qa.c
new file mode 100644
index 0000000..16c578c
--- /dev/null
+++ b/exodus/cbind/src/ex_put_qa.c
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <string.h>                     // for strlen, NULL
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, DIM_NUM_QA, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+
+The function ex_put_qa() writes the QA records to the database. Each
+QA record contains four \c MAX_STR_LENGTH-byte character
+strings. The character strings are:
+
+ -  the analysis code name
+ -  the analysis code QA descriptor
+ -  the analysis date
+ -  the analysis time
+
+\return In case of an error, ex_put_qa() returns a negative number; a
+        warning will return a positive number. Possible causes of errors
+        include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  QA records already exist in file.
+
+\param[in] exoid            exodus file ID returned from a previous call to ex_create() or ex_open().
+
+\param[in] num_qa_records   The number of QA records.
+\param[in]  qa_record       Array containing the QA records. To only
+                            define the number of qa records instead of
+                            defining and outputting, pass NULL for
+                            qa_record argument.
+
+The following code segment will write out two QA records:
+
+\code
+int num_qa_rec, error, exoid;
+char *qa_record[2][4];
+
+\comment{write QA records}
+num_qa_rec = 2;
+
+qa_record[0][0] = "TESTWT1";
+qa_record[0][1] = "testwt1";
+qa_record[0][2] = "07/07/93";
+qa_record[0][3] = "15:41:33";
+qa_record[1][0] = "FASTQ";
+qa_record[1][1] = "fastq";
+qa_record[1][2] = "07/07/93";
+qa_record[1][3] = "16:41:33";
+
+error = ex_put_qa (exoid, num_qa_rec, qa_record);
+\endcode
+
+ */
+
+int ex_put_qa (int   exoid,
+               int   num_qa_records,
+               char* qa_record[][4])
+{
+  int status;
+  int i, j, strdim, num_qa_dim, varid, n4dim;
+  int dims[3];
+  size_t start[3], count[3];
+  char errmsg[MAX_ERR_LENGTH];
+
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  exerrval = 0; /* clear error code */
+
+  /* only do this if there are records */
+
+  if (num_qa_records > 0) {
+    /* See if the number of qa records has already been defined.
+       Assume that if the DIM_NUM_QA dimension exists, then the
+       VAR_QA_TITLE variable also exists...
+     */
+    status =  nc_inq_dimid(rootid, DIM_NUM_QA, &num_qa_dim);
+    if (status != NC_NOERR) {
+
+      /*   inquire previously defined dimensions  */
+      if ((status =  nc_inq_dimid(rootid, DIM_STR, &strdim)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to locate string length in file id %d", rootid);
+        ex_err("ex_put_qa",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_inq_dimid(rootid, DIM_N4, &n4dim)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to locate record length in file id %d", rootid);
+        ex_err("ex_put_qa",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+      /*   put file into define mode  */
+      if ((status = nc_redef(rootid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to put file id %d into define mode", rootid);
+        ex_err("ex_put_qa",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+
+      /*   define dimensions */
+      if ((status = nc_def_dim(rootid,DIM_NUM_QA,num_qa_records, &num_qa_dim)) != NC_NOERR) {
+        if (status == NC_ENAMEINUSE) {     /* duplicate entry? */
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: qa records already exist in file id %d", rootid);
+          ex_err("ex_put_qa",errmsg,exerrval);
+        } else {
+          exerrval = status;
+          sprintf(errmsg,
+                  "Error: failed to define qa record array size in file id %d", rootid);
+          ex_err("ex_put_qa",errmsg,exerrval);
+        }
+
+        goto error_ret;         /* exit define mode and return */
+      }
+
+      /*   define variable  */
+      dims[0] = num_qa_dim;
+      dims[1] = n4dim;
+      dims[2] = strdim;
+
+      if ((status = nc_def_var(rootid, VAR_QA_TITLE, NC_CHAR, 3, dims, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to define qa record array in file id %d", rootid);
+        ex_err("ex_put_qa",errmsg,exerrval);
+        goto error_ret;         /* exit define mode and return */
+      }
+
+      /*   leave define mode  */
+      if ((status = nc_enddef (rootid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to complete definition in file id %d", rootid);
+        ex_err("ex_put_qa",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+    } else {
+      if ((status = nc_inq_varid(rootid, VAR_QA_TITLE, &varid)) != NC_NOERR) {
+        exerrval = status;
+        sprintf(errmsg,
+                "Error: failed to find qa records variable in file id %d", rootid);
+        ex_err("ex_put_qa",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+    }
+
+    if (qa_record != NULL) {
+      /*   write out QA records */
+
+      for (i=0; i<num_qa_records; i++) {
+        for (j=0; j<4; j++) {
+          start[0] = i;
+          start[1] = j;
+          start[2] = 0;
+
+          count[0] = 1;
+          count[1] = 1;
+          count[2] = strlen(qa_record[i][j]) + 1;
+
+          if ((status = nc_put_vara_text(rootid, varid, start, count, qa_record[i][j])) != NC_NOERR) {
+            exerrval = status;
+            sprintf(errmsg,
+                    "Error: failed to store qa record in file id %d", rootid);
+            ex_err("ex_put_qa",errmsg,exerrval);
+            return (EX_FATAL);
+          }
+        }
+      }
+    } else if (ex_is_parallel(rootid)) {
+      /* In case we are in a collective mode, all processors need to call */
+      const char dummy[] = " ";
+      for (i=0; i<num_qa_records; i++) {
+        for (j=0; j<4; j++) {
+          start[0] = start[1] = start[2] = 0;
+          count[0] = count[1] = count[2] = 0;
+          nc_put_vara_text(rootid, varid, start, count, dummy);
+        }
+      }
+    }
+  }
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+  error_ret:
+  if (nc_enddef (rootid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+        "Error: failed to complete definition for file id %d",
+        rootid);
+    ex_err("ex_put_qa",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_set.c b/exodus/cbind/src/ex_put_set.c
new file mode 100644
index 0000000..398cb1f
--- /dev/null
+++ b/exodus/cbind/src/ex_put_set.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expss - ex_put_set
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                set type
+*       int     set_id                  set id
+*       int*    set_entry_list          array of entries in set
+*       int*    set_extra_list          array of extras in set
+
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+ * writes the set entry list and set extra list for a single set
+ * \param   exoid                   exodus file id
+ * \param   set_type                set type
+ * \param   set_id                  set id
+ * \param  *set_entry_list          array of entries in set. Set to NULL to not write.
+ * \param  *set_extra_list          array of extras in set. Set to NULL to not write.
+ */
+
+int ex_put_set (int   exoid,
+		ex_entity_type set_type,
+		ex_entity_id   set_id,
+		const void_int  *set_entry_list,
+		const void_int  *set_extra_list)
+{
+  int dimid, status;
+  int entry_list_id, extra_list_id, set_id_ndx;
+  char errmsg[MAX_ERR_LENGTH];
+  char* entryptr = NULL;
+  char* extraptr = NULL;
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no %ss defined in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid, set_type,set_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type),set_id,exoid);
+      ex_err("ex_put_set",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    entryptr = VAR_NODE_NS(set_id_ndx);
+    extraptr = NULL;
+  }
+  else if (set_type == EX_EDGE_SET) {
+    entryptr = VAR_EDGE_ES(set_id_ndx);
+    extraptr = VAR_ORNT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    entryptr = VAR_FACE_FS(set_id_ndx);
+    extraptr = VAR_ORNT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    entryptr = VAR_ELEM_SS(set_id_ndx);
+    extraptr = VAR_SIDE_SS(set_id_ndx);
+  }
+  else if (set_type == EX_ELEM_SET) {
+    entryptr = VAR_ELEM_ELS(set_id_ndx);
+    extraptr = NULL;
+  }
+
+  /* inquire id's of previously defined variables  */
+  if ((status = nc_inq_varid(exoid, entryptr, &entry_list_id)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate entry list for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_put_set",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* only do for edge, face and side sets */
+  if (extraptr) {
+    if ((status = nc_inq_varid(exoid, extraptr, &extra_list_id)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate extra list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* write out the entry list and extra list arrays */
+  if (set_entry_list != NULL) {
+
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_put_var_longlong(exoid, entry_list_id, set_entry_list);
+    } else {
+      status = nc_put_var_int(exoid, entry_list_id, set_entry_list);
+    }
+    
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store entry list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+
+  /* only do for edge, face and side sets */
+  if (extraptr && set_extra_list != NULL ) {
+    
+    if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+      status = nc_put_var_longlong(exoid, extra_list_id, set_extra_list);
+    } else {
+      status = nc_put_var_int(exoid, extra_list_id, set_extra_list);
+    }    
+
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store extra list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* warn if extra data was sent in for node sets and elem sets */
+  if ((set_type == EX_NODE_SET || set_type == EX_ELEM_SET) &&
+      set_extra_list != NULL) {
+    sprintf(errmsg,
+	    "Warning: extra list was ignored for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id, exoid);
+    ex_err("ex_put_set",errmsg,EX_MSG);
+    return(EX_WARN); 
+  }
+
+  return (EX_NOERR);
+
+}
diff --git a/exodus/cbind/src/ex_put_set_dist_fact.c b/exodus/cbind/src/ex_put_set_dist_fact.c
new file mode 100644
index 0000000..84bbc0e
--- /dev/null
+++ b/exodus/cbind/src/ex_put_set_dist_fact.c
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expssd - ex_put_set_dist_fact
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                set type
+*       int     set_id                  set id
+*       void*   set_dist_fact           array of dist factors for set
+
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stdio.h>                      // for sprintf, NULL
+#include "exodusII.h"                   // for ex_err, ex_name_of_object, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_WARN, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+/*!
+ * writes the distribution factors for a single set
+ * \param  exoid                   exodus file id
+ * \param  set_type                set type
+ * \param  set_id                  set id
+ * \param *set_dist_fact           array of dist factors for set
+ */
+
+int ex_put_set_dist_fact (int   exoid,
+			  ex_entity_type set_type,
+			  ex_entity_id   set_id,
+			  const void *set_dist_fact)
+{
+  int status;
+  int dimid, set_id_ndx;
+  int dist_id;
+  char errmsg[MAX_ERR_LENGTH];
+  char* factptr = NULL;
+
+  exerrval = 0; /* clear error code */
+
+  /* first check if any sets are specified */
+  if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(set_type), &dimid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: no %ss specified in file id %d",
+	    ex_name_of_object(set_type), exoid);
+    ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Lookup index of set id in VAR_*S_IDS array */
+  set_id_ndx = ex_id_lkup(exoid,set_type,set_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+              "Warning: no data allowed for NULL %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set_fact",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    } else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in VAR_*S_IDS array in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* setup more pointers based on set_type */
+  if (set_type == EX_NODE_SET) {
+    /* note we are using DIM_NUM_NODE_NS instead of DIM_NUM_DF_NS */
+    factptr = VAR_FACT_NS(set_id_ndx);
+  }
+  else if (set_type == EX_EDGE_SET) {
+    factptr = VAR_FACT_ES(set_id_ndx);
+  }
+  else if (set_type == EX_FACE_SET) {
+    factptr = VAR_FACT_FS(set_id_ndx);
+  }
+  else if (set_type == EX_SIDE_SET) {
+    factptr = VAR_FACT_SS(set_id_ndx);
+  }
+  if (set_type == EX_ELEM_SET) {
+    factptr = VAR_FACT_ELS(set_id_ndx);
+  }
+
+  /* find id of distribution factors variable
+   */
+
+  if ((status = nc_inq_varid(exoid, factptr, &dist_id)) != NC_NOERR) {
+    /* this test is only needed for node set because we're using
+       DIM_NUM_NOD_NS instead of  DIM_NUM_DF_NS*/
+    if (status == NC_ENOTVAR) {
+      exerrval = EX_BADPARAM;
+      sprintf(errmsg,
+	      "Warning: no dist factors defined for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id, exoid);
+      ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+      return (EX_WARN);
+    } else  {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate dist factors list for %s %"PRId64" in file id %d",
+	      ex_name_of_object(set_type), set_id,exoid);
+      ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  /* write out the distribution factors array */
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_var_float(exoid, dist_id, set_dist_fact);
+  } else {
+    status = nc_put_var_double(exoid, dist_id, set_dist_fact);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store dist factors for %s %"PRId64" in file id %d",
+	    ex_name_of_object(set_type), set_id,exoid);
+    ex_err("ex_put_set_dist_fact",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+
+}
diff --git a/exodus/cbind/src/ex_put_set_param.c b/exodus/cbind/src/ex_put_set_param.c
new file mode 100644
index 0000000..ee73678
--- /dev/null
+++ b/exodus/cbind/src/ex_put_set_param.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expsetp - ex_put_set_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     set_type                the type of set
+*       int     set_id                  set id
+*       int     num_entries_in_set       number of entries in the set
+*       int     num_dist_fact_in_set    number of distribution factors in the
+*                                       set
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for NULL
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_set, ex_put_sets, etc
+
+/*!
+ * writes the set id and the number of entries which describe a single set
+ * \param  exoid                   exodus file id
+ * \param  set_type                the type of set
+ * \param  set_id                  set id
+ * \param  num_entries_in_set      number of entries in the set
+ * \param  num_dist_fact_in_set    number of distribution factors in the set
+ */
+
+int ex_put_set_param (int exoid,
+                      ex_entity_type set_type,
+                      ex_entity_id   set_id,
+                      int64_t num_entries_in_set,
+                      int64_t num_dist_fact_in_set)
+{
+  struct ex_set set[1];
+  set[0].type = set_type;
+  set[0].id   = set_id;
+  set[0].num_entry = num_entries_in_set;
+  set[0].num_distribution_factor = num_dist_fact_in_set;
+  set[0].entry_list = NULL;
+  set[0].extra_list = NULL;
+  set[0].distribution_factor_list = NULL;
+  
+  return ex_put_sets(exoid, 1, set);
+}
diff --git a/exodus/cbind/src/ex_put_sets.c b/exodus/cbind/src/ex_put_sets.c
new file mode 100644
index 0000000..ac760d2
--- /dev/null
+++ b/exodus/cbind/src/ex_put_sets.c
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2012 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for NULL, free, malloc
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_set, ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+/*!
+ * writes the set parameters and optionally set data for 1 or more sets
+ * \param   exoid                   exodus file id
+ * \param   set_count               number of sets to write
+ * \param  *sets                    array of ex_set structures
+ */
+
+int ex_put_sets (int   exoid,
+		 size_t set_count,
+		 const struct ex_set *sets)
+{
+  size_t i;
+  int needs_define = 0;
+  int set_stat;
+  int dimid, varid, status, dims[1];
+  int set_id_ndx;
+  size_t start[1]; 
+  int cur_num_sets;
+  char errmsg[MAX_ERR_LENGTH];
+  int* sets_to_define = NULL;
+  char* numentryptr 	= NULL;
+  char* entryptr = NULL;
+  char* extraptr = NULL;
+  char* idsptr = NULL;
+  char* statptr = NULL;
+  char* numdfptr = NULL;
+  char* factptr = NULL;
+
+  size_t int_size;
+  
+  exerrval = 0; /* clear error code */
+
+  sets_to_define = malloc(set_count*sizeof(int));
+  
+  /* Note that this routine can be called:
+     1) just define the sets
+     2) just output the set data (after a previous call to define)
+     3) define and output the set data in one call.
+  */
+  for (i=0; i < set_count; i++) {
+    /* first check if any sets are specified */
+    if ((status = nc_inq_dimid(exoid, ex_dim_num_objects(sets[i].type), &dimid)) != NC_NOERR) {
+      if (status == NC_EBADDIM) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: no %ss defined for file id %d", ex_name_of_object(sets[i].type), exoid);
+	ex_err("ex_put_sets",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate %ss defined in file id %d",
+		ex_name_of_object(sets[i].type), exoid);
+	ex_err("ex_put_sets",errmsg,exerrval);
+      }
+      free(sets_to_define);
+      return (EX_FATAL);
+    }
+
+    set_id_ndx = ex_id_lkup(exoid, sets[i].type, sets[i].id);
+    if (exerrval != EX_LOOKUPFAIL) {  /* found the side set id, so set is already defined... */
+      sets_to_define[i] = 0;
+      continue;
+    } else {
+      needs_define++;
+      sets_to_define[i] = 1;
+    }
+  }
+    
+  if (needs_define > 0) {
+    /* put netcdf file into define mode  */
+    if ((status = nc_redef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to put file id %d into define mode",
+	      exoid);
+      ex_err("ex_put_sets",errmsg,exerrval);
+      free(sets_to_define);
+      return (EX_FATAL);
+    }
+    
+    for (i=0; i < set_count; i++) {
+      if (sets_to_define[i] == 0)
+	continue;
+      
+      /*   NOTE: ex_inc_file_item finds the current number of sets defined
+	   for a specific file and returns that value incremented. */
+      cur_num_sets=ex_inc_file_item(exoid, ex_get_counter_list(sets[i].type));
+      set_id_ndx = cur_num_sets + 1;
+      sets_to_define[i] = set_id_ndx;
+      
+      if (sets[i].num_entry == 0)
+	continue;
+      
+      /* setup pointers based on set_type */
+      if (sets[i].type == EX_NODE_SET) {
+	numentryptr = DIM_NUM_NOD_NS(set_id_ndx);
+	entryptr = VAR_NODE_NS(set_id_ndx);
+	extraptr = NULL;
+	/* note we are using DIM_NUM_NODE_NS instead of DIM_NUM_DF_NS */
+	numdfptr = DIM_NUM_NOD_NS(set_id_ndx);
+	factptr = VAR_FACT_NS(set_id_ndx);
+      }
+      else if (sets[i].type == EX_EDGE_SET) {
+	numentryptr = DIM_NUM_EDGE_ES(set_id_ndx);
+	entryptr = VAR_EDGE_ES(set_id_ndx);
+	extraptr = VAR_ORNT_ES(set_id_ndx);
+	numdfptr = DIM_NUM_DF_ES(set_id_ndx);
+	factptr = VAR_FACT_ES(set_id_ndx);
+      }
+      else if (sets[i].type == EX_FACE_SET) {
+	numentryptr = DIM_NUM_FACE_FS(set_id_ndx);
+	entryptr = VAR_FACE_FS(set_id_ndx);
+	extraptr = VAR_ORNT_FS(set_id_ndx);
+	numdfptr = DIM_NUM_DF_FS(set_id_ndx);
+	factptr = VAR_FACT_FS(set_id_ndx);
+      }
+      else if (sets[i].type == EX_SIDE_SET) {
+	numentryptr = DIM_NUM_SIDE_SS(set_id_ndx);
+	entryptr = VAR_ELEM_SS(set_id_ndx);
+	extraptr = VAR_SIDE_SS(set_id_ndx);
+	numdfptr = DIM_NUM_DF_SS(set_id_ndx);
+	factptr = VAR_FACT_SS(set_id_ndx);
+      }
+      else if (sets[i].type == EX_ELEM_SET) {
+	numentryptr = DIM_NUM_ELE_ELS(set_id_ndx);
+	entryptr = VAR_ELEM_ELS(set_id_ndx);
+	extraptr = NULL;
+	numdfptr = DIM_NUM_DF_ELS(set_id_ndx);
+	factptr = VAR_FACT_ELS(set_id_ndx);
+      }
+
+      /* define dimensions and variables */
+      if ((status = nc_def_dim(exoid, numentryptr,
+			       sets[i].num_entry, &dimid)) != NC_NOERR) {
+	exerrval = status;
+	if (status == NC_ENAMEINUSE) {
+	  sprintf(errmsg,
+		  "Error: %s %"PRId64" -- size already defined in file id %d",
+		  ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	  ex_err("ex_put_sets",errmsg,exerrval);
+	}
+	else {
+	  sprintf(errmsg,
+		  "Error: failed to define number of entries in %s %"PRId64" in file id %d",
+		  ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	  ex_err("ex_put_sets",errmsg,exerrval);
+	}
+	goto error_ret;
+      }
+      
+      int_size = sizeof(int);
+      if (ex_int64_status(exoid) & EX_BULK_INT64_DB) {
+	int_size = sizeof(int64_t);
+      }
+      
+      /* create variable array in which to store the entry lists */
+      dims[0] = dimid;
+      if ((status = nc_def_var(exoid, entryptr, int_size, 1, dims, &varid)) != NC_NOERR) {
+	exerrval = status;
+	if (status == NC_ENAMEINUSE) {
+	  sprintf(errmsg,
+		  "Error: entry list already exists for %s %"PRId64" in file id %d",
+		  ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	  ex_err("ex_put_sets",errmsg,exerrval);
+	} else {
+	  sprintf(errmsg,
+		  "Error: failed to create entry list for %s %"PRId64" in file id %d",
+		  ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	  ex_err("ex_put_sets",errmsg,exerrval);
+	}
+	goto error_ret;            /* exit define mode and return */
+      }
+      ex_compress_variable(exoid, varid, 1);
+      
+      if (extraptr) {
+	if ((status = nc_def_var(exoid, extraptr, int_size, 1, dims, &varid)) != NC_NOERR) {
+	  exerrval = status;
+	  if (status == NC_ENAMEINUSE) {
+	    sprintf(errmsg,
+		    "Error: extra list already exists for %s %"PRId64" in file id %d",
+		    ex_name_of_object(sets[i].type), sets[i].id, exoid);
+	    ex_err("ex_put_sets",errmsg,exerrval);
+	  } else {
+	    sprintf(errmsg,
+		    "Error: failed to create extra list for %s %"PRId64" in file id %d",
+		    ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	    ex_err("ex_put_sets",errmsg,exerrval);
+	  }
+	  goto error_ret;         /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, varid, 1);
+      }
+
+      /* Create distribution factors variable if required */
+      if (sets[i].num_distribution_factor > 0) {
+	if (sets[i].type != EX_SIDE_SET) {
+	  /* but sets[i].num_distribution_factor must equal number of nodes */
+	  if (sets[i].num_distribution_factor != sets[i].num_entry) {
+	    exerrval = EX_FATAL;
+	    sprintf(errmsg,
+		    "Error: # dist fact (%"PRId64") not equal to # nodes (%"PRId64") in node  set %"PRId64" file id %d",
+		    sets[i].num_distribution_factor, sets[i].num_entry, sets[i].id, exoid);
+	    ex_err("ex_put_sets",errmsg,exerrval);
+	    goto error_ret;    /* exit define mode and return */
+	  }
+	} else {
+	  /* resuse dimid from entry lists */
+	  if ((status = nc_def_dim(exoid, numdfptr, 
+				   sets[i].num_distribution_factor, &dimid)) != NC_NOERR) {
+	    exerrval = status;
+	    sprintf(errmsg,
+		    "Error: failed to define number of dist factors in %s %"PRId64" in file id %d",
+		    ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	    ex_err("ex_put_sets",errmsg,exerrval);
+	    goto error_ret;          /* exit define mode and return */
+	  }
+	}
+	
+	/* create variable array in which to store the set distribution factors
+	 */
+	dims[0] = dimid;
+	if ((status = nc_def_var(exoid, factptr, nc_flt_code(exoid), 1, dims, &varid)) != NC_NOERR) {
+	  exerrval = status;
+	  if (status == NC_ENAMEINUSE) {
+	    sprintf(errmsg,
+		    "Error: dist factors list already exists for %s %"PRId64" in file id %d",
+		    ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	    ex_err("ex_put_sets",errmsg,exerrval);
+	  } else {
+	    sprintf(errmsg,
+		    "Error: failed to create dist factors list for %s %"PRId64" in file id %d",
+		    ex_name_of_object(sets[i].type), sets[i].id,exoid);
+	    ex_err("ex_put_sets",errmsg,exerrval);
+	  }
+	  goto error_ret;            /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, varid, 2);
+      }
+    }
+
+    /* leave define mode  */
+    if ((status = nc_enddef (exoid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to complete definition in file id %d", exoid);
+      ex_err("ex_put_sets",errmsg,exerrval);
+      free(sets_to_define);
+      return (EX_FATAL);
+    }
+
+    /* Output the set ids and status... */
+    for (i=0; i < set_count; i++) {
+    /* setup pointers based on sets[i].type */
+      if (sets[i].type == EX_NODE_SET) {
+	idsptr = VAR_NS_IDS;
+	statptr = VAR_NS_STAT;
+      }
+      else if (sets[i].type == EX_EDGE_SET) {
+	idsptr = VAR_ES_IDS;
+	statptr = VAR_ES_STAT;
+      }
+      else if (sets[i].type == EX_FACE_SET) {
+	idsptr = VAR_FS_IDS;
+	statptr = VAR_FS_STAT;
+      }
+      else if (sets[i].type == EX_SIDE_SET) {
+	idsptr = VAR_SS_IDS;
+	statptr = VAR_SS_STAT;
+      }
+      else if (sets[i].type == EX_ELEM_SET) {
+	idsptr = VAR_ELS_IDS;
+	statptr = VAR_ELS_STAT;
+      }
+      
+      /* first: get id of set id variable */
+      if ((status = nc_inq_varid(exoid, idsptr, &varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate %s %"PRId64" in file id %d", ex_name_of_object(sets[i].type),
+		sets[i].id, exoid);
+	ex_err("ex_put_sets",errmsg,exerrval);
+	free(sets_to_define);
+	return (EX_FATAL);
+      }
+      
+      /* write out set id */
+      start[0] = sets_to_define[i]-1;
+      status = nc_put_var1_longlong(exoid, varid, start, (long long*)&sets[i].id);
+    
+      if (status != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to store %s id %"PRId64" in file id %d", ex_name_of_object(sets[i].type),
+		sets[i].id, exoid);
+	ex_err("ex_put_sets",errmsg,exerrval);
+	free(sets_to_define);
+	return (EX_FATAL);
+      }
+      
+      set_stat = (sets[i].num_entry == 0) ? 0 : 1;
+      
+      if ((status = nc_inq_varid(exoid, statptr, &varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate %s status in file id %d", ex_name_of_object(sets[i].type),
+		exoid);
+	ex_err("ex_put_sets",errmsg,exerrval);
+	free(sets_to_define);
+	return (EX_FATAL);
+      }
+      
+      if ((status = nc_put_var1_int(exoid, varid, start, &set_stat)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to store %s %"PRId64" status to file id %d", ex_name_of_object(sets[i].type),
+		sets[i].id, exoid);
+	ex_err("ex_put_sets",errmsg,exerrval);
+	free(sets_to_define);
+	return (EX_FATAL);
+      }
+    }
+  }
+  
+  free(sets_to_define);
+
+  /* Sets are now all defined; see if any set data needs to be output... */
+  status = EX_NOERR;
+  for (i=0; i < set_count; i++) {
+    int stat;
+    if (sets[i].entry_list != NULL || sets[i].extra_list != NULL) {
+      /* NOTE: ex_put_set will write the warning/error message... */
+      stat = ex_put_set(exoid, sets[i].type, sets[i].id, sets[i].entry_list, sets[i].extra_list);
+      if (stat != EX_NOERR) status = EX_FATAL;
+    }
+    if (sets[i].distribution_factor_list != NULL) {
+      /* NOTE: ex_put_set_dist_fact will write the warning/error message... */
+      stat = ex_put_set_dist_fact(exoid, sets[i].type, sets[i].id, sets[i].distribution_factor_list);
+      if (stat != EX_NOERR) status = EX_FATAL;
+    }
+  }  
+  return (status);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  free(sets_to_define);
+  
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_sets",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_side_set.c b/exodus/cbind/src/ex_put_side_set.c
new file mode 100644
index 0000000..2ad2bf3
--- /dev/null
+++ b/exodus/cbind/src/ex_put_side_set.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expss - ex_put_side_set
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*       int*    side_set_elem_list      array of elements in side set
+*       int*    side_set_side_list      array of sides in side set
+
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_set, void_int, etc
+
+/*!
+ * writes the side set element list and side set side list for a single side set
+ * \param   exoid                   exodus file id
+ * \param   side_set_id             side set id
+ * \param  *side_set_elem_list      array of elements in side set
+ * \param  *side_set_side_list      array of sides in side set
+ * \deprecated  Use ex_put_set()(exoid, EX_SIDE_SET, side_set_id, side_set_elem_list, side_set_side_list)
+ */
+
+int ex_put_side_set (int   exoid,
+                     ex_entity_id   side_set_id,
+                     const void_int  *side_set_elem_list,
+                     const void_int  *side_set_side_list)
+{
+  return ex_put_set(exoid, EX_SIDE_SET, side_set_id,
+		    side_set_elem_list, side_set_side_list);
+}
diff --git a/exodus/cbind/src/ex_put_side_set_dist_fact.c b/exodus/cbind/src/ex_put_side_set_dist_fact.c
new file mode 100644
index 0000000..237a722
--- /dev/null
+++ b/exodus/cbind/src/ex_put_side_set_dist_fact.c
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expssd - ex_put_side_set_dist_fact
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*       void*   side_set_dist_fact      array of dist factors for side set
+
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_set_dist_fact, etc
+
+/*!
+ * writes the distribution factors for a single side set
+ * \param       exoid                   exodus file id
+ * \param       side_set_id             side set id
+ * \param      *side_set_dist_fact      array of dist factors for side set
+ * \deprecated Use ex_put_set_dist_fact()(exoid, EX_SIDE_SET, side_set_id, side_set_dist_fact)
+ */
+
+int ex_put_side_set_dist_fact (int   exoid,
+                               ex_entity_id   side_set_id,
+                               const void *side_set_dist_fact)
+{
+  return ex_put_set_dist_fact(exoid, EX_SIDE_SET, side_set_id,
+			      side_set_dist_fact);
+}
diff --git a/exodus/cbind/src/ex_put_side_set_param.c b/exodus/cbind/src/ex_put_side_set_param.c
new file mode 100644
index 0000000..37b24a3
--- /dev/null
+++ b/exodus/cbind/src/ex_put_side_set_param.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expsp - ex_put_side_set_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     side_set_id             side set id
+*       int     num_side_in_set         number of sides in the side set
+*       int     num_dist_fact_in_set    number of distribution factors in the
+*                                       side set
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_set_param, etc
+
+/*!
+ * writes the side set id and the number of sides (edges or faces) 
+ * which describe a single side set
+ * \param  exoid                   exodus file id
+ * \param  side_set_id             side set id
+ * \param  num_side_in_set         number of sides in the side set
+ * \param  num_dist_fact_in_set    number of distribution factors in the side set
+ * \deprecated Use ex_put_set_param()(exoid, EX_SIDE_SET, side_set_id, num_side_in_set, num_dist_fact_in_set)
+ */
+
+int ex_put_side_set_param (int exoid,
+                           ex_entity_id side_set_id,
+                           int64_t num_side_in_set,
+                           int64_t num_dist_fact_in_set)
+{
+  return ex_put_set_param(exoid, EX_SIDE_SET, side_set_id,
+			  num_side_in_set, num_dist_fact_in_set);
+}
diff --git a/exodus/cbind/src/ex_put_ss_param_global.c b/exodus/cbind/src/ex_put_ss_param_global.c
new file mode 100644
index 0000000..ce2615c
--- /dev/null
+++ b/exodus/cbind/src/ex_put_ss_param_global.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* Function(s) contained in this file:
+ *     ex_put_ss_param_global()
+ *****************************************************************************
+ * This function outputs the global side-set parameters.
+ *****************************************************************************
+ *  Variable Index:
+ *      exoid            - The NetCDF ID of an already open NemesisI file.
+ *      global_ids      - Pointer to a vector of global side-set IDs.
+ *      side_cnts       - Pointer to a vector of global side counts in
+ *                        each global side set.
+ *      df_cnts         - Pointer to a vector of global distribution
+ *                        factors in each global side set.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stdio.h>
+
+#include <netcdf.h>
+
+#include <exodusII.h>
+#include <exodusII_int.h>
+
+int ex_put_ss_param_global(int exoid,
+                           void_int *global_ids,
+                           void_int *side_cnts,
+                           void_int *df_cnts
+                           )
+{
+  const char   *func_name="ex_put_ss_param_global";
+  int     varid;
+
+  int     status;
+  char    errmsg[MAX_ERR_LENGTH];
+/*-----------------------------Execution begins-----------------------------*/
+
+  exerrval = 0; /* clear error code */
+
+  /* Get the variable ID for the vector of global side set IDs */
+  if ((status = nc_inq_varid(exoid, VAR_SS_IDS_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_SS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the vector of global side set IDs */
+  if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, global_ids);
+  } else {
+    status = nc_put_var_int(exoid, varid, global_ids);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" to file ID %d",
+            VAR_SS_IDS_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the vector of global side-set side counts */
+  if ((status = nc_inq_varid(exoid, VAR_SS_SIDE_CNT_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_SS_SIDE_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the vector of global side counts in each global side set */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, side_cnts);
+  } else {
+    status = nc_put_var_int(exoid, varid, side_cnts);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put variable \"%s\" in file ID %d",
+            VAR_SS_SIDE_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Get the variable ID for the number of dist. factors in each side set */
+  if ((status = nc_inq_varid(exoid, VAR_SS_DF_CNT_GLOBAL, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to find variable ID for \"%s\" in file ID %d",
+            VAR_SS_DF_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  /* Output the vector of dist. factor counts */
+  if (ex_int64_status(exoid) & EX_BULK_INT64_API) {
+    status = nc_put_var_longlong(exoid, varid, df_cnts);
+  } else {
+    status = nc_put_var_int(exoid, varid, df_cnts);
+  }
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to output variable \"%s\" in file ID %d",
+            VAR_SS_DF_CNT_GLOBAL, exoid);
+    ex_err(func_name, errmsg, exerrval);
+
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_sset_var.c b/exodus/cbind/src/ex_put_sset_var.c
new file mode 100644
index 0000000..ab3cc7d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_sset_var.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expev - ex_put_sset_var
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     sset_var_index          sideset variable index
+*       int     sset_id                 sideset id
+*       int     num_faces_this_sset     number of faces in this sideset
+*
+* exit conditions -
+*
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_put_var, ex_entity_id, etc
+
+/*!
+ * writes the values of a single sideset variable for one sideset at 
+ * one time step to the database; assume the first time step and 
+ * sideset variable index are 1
+ * \param      exoid                   exodus file id
+ * \param      time_step               time step number
+ * \param      sset_var_index          sideset variable index
+ * \param      sset_id                 sideset id
+ * \param      num_faces_this_sset     number of faces in this sideset
+ * \param      sset_var_vals           the variable values to be written
+ * \deprecated Use ex_put_var()(exoid, time_step, EX_SIDE_SET, sset_var_index, sset_id, num_faces_this_sset, sset_var_vals)
+ */
+
+int ex_put_sset_var (int   exoid,
+                     int   time_step,
+                     int   sset_var_index,
+                     ex_entity_id   sset_id,
+                     int64_t num_faces_this_sset,
+                     const void *sset_var_vals)
+{
+  return ex_put_var(exoid, time_step, EX_SIDE_SET, sset_var_index, sset_id, num_faces_this_sset, sset_var_vals);
+}
diff --git a/exodus/cbind/src/ex_put_sset_var_tab.c b/exodus/cbind/src/ex_put_sset_var_tab.c
new file mode 100644
index 0000000..26a82df
--- /dev/null
+++ b/exodus/cbind/src/ex_put_sset_var_tab.c
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expsstt - ex_put_sset_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     num_sset                number of sidesets
+*       int     num_sset_var            number of sideset variables
+*       int*    sset_var_tab            sideset variable truth table array
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_truth_table, etc
+
+/*!
+ * writes the EXODUS II sideset variable truth table to the database; 
+ * also, creates netCDF variables in which to store EXODUS II sideset
+ * variable values; although this table isn't required (because the
+ * netCDF variables can also be created in ex_put_sset_var), this call
+ * will save tremendous time because all of the variables are defined
+ * at once while the file is in define mode, rather than going in and out
+ * of define mode (causing the entire file to be copied over and over)
+ * which is what occurs when the sideset variable values variables are
+ * defined in ex_put_sset_var
+ * \param      exoid                   exodus file id
+ * \param      num_sset                number of sidesets
+ * \param      num_sset_var            number of sideset variables
+ * \param     *sset_var_tab            sideset variable truth table array
+ * \deprecated Use ex_put_truth_table()(exoid, EX_SIDE_SET, num_sset, num_sset_var, sset_var_tab)
+ */
+
+int ex_put_sset_var_tab (int  exoid,
+                         int  num_sset,
+                         int  num_sset_var,
+                         int *sset_var_tab)
+{
+  return ex_put_truth_table(exoid, EX_SIDE_SET, num_sset, num_sset_var, sset_var_tab);
+}
+
diff --git a/exodus/cbind/src/ex_put_time.c b/exodus/cbind/src/ex_put_time.c
new file mode 100644
index 0000000..d6680b3
--- /dev/null
+++ b/exodus/cbind/src/ex_put_time.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, ex_comp_ws, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+/*!
+
+The function ex_put_time() writes the time value for a specified time
+step.
+
+Because time values are floating point values, the application code
+must declare the array passed to be the appropriate type (\c float or
+\c double) to match the compute word size passed in ex_create() or
+ex_open().
+
+\return In case of an error, ex_put_time() returns a negative number;
+a warning will return a positive number. Possible causes of errors
+include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+
+\param[in]  exoid         exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in]  time_step     The time step number. This is essentially a counter that is
+                          incremented only when results variables are output to the data
+			  file. The first time step is 1.
+\param[in]  time_value    The time at the specified time step.
+
+The following code segment will write out the simulation time value at
+simulation time step n:
+
+\code
+int error, exoid, n;
+float time_value;
+
+\comment{write time value}
+error = ex_put_time (exoid, n, &time_value);
+\endcode
+
+*/
+
+int ex_put_time (int   exoid,
+                 int   time_step,
+                 const void *time_value)
+{
+  int status;
+  int varid; 
+  size_t start[1];
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  /* inquire previously defined variable */
+  if ((status = nc_inq_varid(exoid, VAR_WHOLE_TIME, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to locate time variable in file id %d", exoid);
+    ex_err("ex_put_time",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* store time value */
+  start[0] = --time_step;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_var1_float(exoid, varid, start, time_value);
+  } else {
+    status = nc_put_var1_double(exoid, varid, start, time_value);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to store time value in file id %d", exoid);
+    ex_err("ex_put_time",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_truth_table.c b/exodus/cbind/src/ex_put_truth_table.c
new file mode 100644
index 0000000..bcaa649
--- /dev/null
+++ b/exodus/cbind/src/ex_put_truth_table.c
@@ -0,0 +1,370 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvtt - ex_put_truth_table
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid              exodus file id
+*       int     obj_type           object type
+*       int     num_blk            number of blocks
+*       int     num_var            number of variables
+*       int*    variable_table            variable truth table array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, NULL, malloc
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for ex_get_dimension, EX_FATAL, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR, etc
+
+/*!
+ * writes the EXODUS II variable truth table to the database; also,
+ * creates netCDF variables in which to store EXODUS II variable
+ * values; although this table isn't required (because the netCDF
+ * variables can also be created in ex_put_var), this call will save
+ * tremendous time because all of the variables are defined at once
+ * while the file is in define mode, rather than going in and out of
+ * define mode (causing the entire file to be copied over and over)
+ * which is what occurs when the variables are defined in ex_put_var
+ * \param       exoid              exodus file id
+ * \param       obj_type           object type
+ * \param       num_blk            number of blocks
+ * \param       num_var            number of variables
+ * \param      *var_tab            variable truth table array
+ */
+
+int ex_put_truth_table (int  exoid,
+			ex_entity_type obj_type,
+			int  num_blk,
+			int  num_var,
+			int *var_tab)
+{
+  int numelblkdim, numelvardim, timedim, dims[2], varid;
+  char *sta_type, *tab_type;
+  size_t num_entity = 0;
+  size_t num_var_db = 0;
+  int *stat_vals;
+  int i, j, k;
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+  const char* routine = "ex_put_truth_table";
+  
+  /*
+   * The ent_type and the var_name are used to build the netcdf
+   * variables name.  Normally this is done via a macro defined in
+   * exodusII_int.h
+   */
+  const char* ent_type = NULL;
+  const char* var_name = NULL;
+  const char* ent_size = NULL;
+  exerrval = 0; /* clear error code */
+   
+  ex_get_dimension(exoid, ex_dim_num_objects(obj_type),
+		   ex_name_of_object(obj_type), &num_entity, &numelblkdim, routine);
+
+  if (obj_type == EX_ELEM_BLOCK) {
+    ex_get_dimension(exoid, DIM_NUM_ELE_VAR,  "element variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_elem_var";
+    ent_type = "eb";
+    ent_size = "num_el_in_blk";
+    sta_type = VAR_STAT_EL_BLK;
+    tab_type = VAR_ELEM_TAB;
+  }
+  else if (obj_type == EX_EDGE_BLOCK) {
+    ex_get_dimension(exoid, DIM_NUM_EDG_VAR, "edge block variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_edge_var";
+    ent_type = "eb";
+    ent_size = "num_ed_in_blk";
+    sta_type = VAR_STAT_ED_BLK;
+    tab_type = VAR_EBLK_TAB;
+  }
+  else if (obj_type  == EX_FACE_BLOCK) {
+    ex_get_dimension(exoid, DIM_NUM_FAC_VAR, "face block variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_face_var";
+    ent_type = "fb";
+    ent_size = "num_fa_in_blk";
+    sta_type = VAR_STAT_FA_BLK;
+    tab_type = VAR_FBLK_TAB;
+  }
+  else if (obj_type == EX_SIDE_SET) {
+    ex_get_dimension(exoid, DIM_NUM_SSET_VAR, "sideset variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_sset_var";
+    ent_type = "ss";
+    ent_size = "num_side_ss";
+    sta_type = VAR_SS_STAT;
+    tab_type = VAR_SSET_TAB;
+  }
+  else if (obj_type == EX_NODE_SET) {
+    ex_get_dimension(exoid, DIM_NUM_NSET_VAR, "nodeset variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_nset_var";
+    ent_type = "ns";
+    ent_size = "num_nod_ns";
+    sta_type = VAR_NS_STAT;
+    tab_type = VAR_NSET_TAB;
+  }
+  else if (obj_type == EX_EDGE_SET) {
+    ex_get_dimension(exoid, DIM_NUM_ESET_VAR, "edge set variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_eset_var";
+    ent_type = "es";
+    ent_size = "num_edge_es";
+    sta_type = VAR_ES_STAT;
+    tab_type = VAR_ESET_TAB;
+  }
+  else if (obj_type == EX_FACE_SET) {
+    ex_get_dimension(exoid, DIM_NUM_FSET_VAR, "face set variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_fset_var";
+    ent_type = "fs";
+    ent_size = "num_face_fs";
+    sta_type = VAR_FS_STAT;
+    tab_type = VAR_FSET_TAB;
+  }
+  else if (obj_type == EX_ELEM_SET) {
+    ex_get_dimension(exoid, DIM_NUM_ELSET_VAR, "element set variables",
+		     &num_var_db, &numelvardim, routine);
+    var_name = "vals_elset_var";
+    ent_type = "es";
+    ent_size = "num_ele_els";
+    sta_type = VAR_ELS_STAT;
+    tab_type = VAR_ELSET_TAB;
+  }
+
+  else {       /* invalid variable type */
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: Invalid variable type %d specified in file id %d",
+	    obj_type, exoid);
+    ex_err("ex_get_varid",errmsg,exerrval);
+    return (EX_WARN);
+  }
+       
+  if ((int)num_entity != num_blk) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: # of %s doesn't match those defined in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_get_var_tab",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((int)num_var_db != num_var) {
+    exerrval = EX_FATAL;
+    sprintf(errmsg,
+	    "Error: # of %s variables doesn't match those defined in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err("ex_get_var_tab",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* Get status array for later use */
+  if (!(stat_vals = malloc(num_blk*sizeof(int)))) {
+    exerrval = EX_MEMFAIL;
+    sprintf(errmsg,
+	    "Error: failed to allocate memory for %s status array for file id %d",
+            ex_name_of_object(obj_type), exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  status = nc_inq_varid (exoid, sta_type, &varid);
+
+  /* get variable id of status array */
+  if (status == NC_NOERR) {
+    /* if status array exists (V 2.01+), use it, otherwise assume
+       object exists to be backward compatible */
+
+    if ((status = nc_get_var_int (exoid, varid, stat_vals)) != NC_NOERR) {
+      exerrval = status;
+      free(stat_vals);
+      sprintf(errmsg,
+	      "Error: failed to get %s status array from file id %d",
+              ex_name_of_object(obj_type), exoid);
+      ex_err("put_var_tab",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  } else {
+    /* status array doesn't exist (V2.00), dummy one up for later checking */
+    for(i=0;i<num_blk;i++)
+      stat_vals[i] = 1;
+  }
+
+  /* put netcdf file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    free(stat_vals);
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to put file id %d into define mode",
+	    exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* inquire previously defined dimensions */
+  if ((status = nc_inq_dimid (exoid, DIM_TIME, &timedim)) != NC_NOERR) {
+    exerrval = status;
+    free(stat_vals);
+    sprintf(errmsg,
+	    "Error: failed to locate time variable in file id %d",
+	    exoid);
+    ex_err(routine,errmsg,exerrval);
+    goto error_ret;          /* exit define mode and return */
+  }
+  
+  /* define netCDF variables in which to store EXODUS II element
+   * variable values
+   */
+
+  k = 0;
+  for (i=0; i<num_blk; i++) {
+    for (j=1; j<=num_var; j++) {
+
+      /* check if variables are to be put out for this entity */
+      if (var_tab[k] != 0) {
+	if (stat_vals[i] != 0) {/* check for NULL entity */
+	  /* NOTE: This code used to zero out the var_tab entry
+	     if the stat_vals[i] value was zero. However, in some
+	     cases it is good to know that a variable was assigned to
+	     an entity even if that entity is empty. The code was
+	     changed to not modify the truth table.
+	  */
+	  dims[0] = timedim;
+	  
+	  /* Determine number of entities in block */
+	  if ((status = nc_inq_dimid(exoid, ex_catstr(ent_size, (i+1)), &dims[1])) != NC_NOERR) {
+	    exerrval = status;
+	    free(stat_vals);
+	    sprintf(errmsg,
+		    "Error: failed to locate number of entities in %d'th %s in file id %d",
+		    i+1, ex_name_of_object(obj_type), exoid);
+	    ex_err(routine,errmsg,exerrval);
+	    goto error_ret;          /* exit define mode and return */
+	    }
+
+
+	  /* define netCDF variable to store variable values; the j
+	   * index cycles from 1 through the number of variables so
+	   * that the index of the EXODUS II variable (which is part
+	   * of the name of the netCDF variable) will begin at 1
+	   * instead of 0
+	   */
+
+	  if ((status = nc_def_var(exoid, ex_catstr2(var_name, j, ent_type, i+1),
+				  nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+	    if (status != NC_ENAMEINUSE) {
+	      exerrval = status;
+	      free(stat_vals);
+	      sprintf(errmsg,
+		      "Error: failed to define variable for %d'th %s in file id %d",
+		      i+1, ex_name_of_object(obj_type), exoid);
+	      ex_err(routine,errmsg,exerrval);
+	      goto error_ret;  /* exit define mode and return */
+	    }
+	    ex_compress_variable(exoid, varid, 2);
+	  }
+	}
+      }  /* if */
+      k++; /* increment element truth table pointer */
+    }  /* for j */
+  }  /* for i */
+
+  free (stat_vals);
+
+  /* create a variable array in which to store the truth table
+   */
+
+  dims[0] = numelblkdim;
+  dims[1] = numelvardim;
+  status = nc_def_var (exoid, tab_type, NC_INT, 2, dims, &varid);
+  
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to define %s variable truth table in file id %d",
+	    ex_name_of_object(obj_type), exoid);
+    ex_err(routine,errmsg,exerrval);
+    goto error_ret;          /* exit define mode and return */
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete definitions in file id %d",
+	    exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* write out the element variable truth table */
+  status = nc_put_var_int(exoid, varid, var_tab);
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store variable truth table in file id %d",
+	    exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR)     /* exit define mode */
+    {
+      sprintf(errmsg,
+	      "Error: failed to complete definition for file id %d",
+	      exoid);
+      ex_err(routine,errmsg,exerrval);
+    }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_put_var.c b/exodus/cbind/src/ex_put_var.c
new file mode 100644
index 0000000..ea9672d
--- /dev/null
+++ b/exodus/cbind/src/ex_put_var.c
@@ -0,0 +1,345 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/*****************************************************************************
+*
+* expvar - ex_put_var
+*
+* entry conditions -
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     time_step               time step number
+*       int     var_type                type (edge block, face block, edge set, ... )
+*       int     var_index               element variable index
+*       int     obj_id                  element block id
+*       int     num_entries_this_obj    number of entries in this block/set
+*
+* exit conditions -
+*
+*
+* exit conditions -
+*
+* revision history -
+*
+*
+*****************************************************************************/
+
+#include <inttypes.h>                   // for PRId64
+#include <stddef.h>                     // for size_t
+#include <stdio.h>                      // for sprintf
+#include <stdlib.h>                     // for free, malloc
+#include <sys/types.h>                  // for int64_t
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_varid, etc
+
+static int
+ex_look_up_var(int exoid, ex_entity_type var_type, int var_index, ex_entity_id obj_id, 
+	       const char *VOBJID, const char *VOBJTAB, const char *DNUMOBJ,
+	       const char *DNUMOBJVAR, int *varid)
+{
+  int status;
+  int obj_id_ndx;
+  int dimid,time_dim, numobjdim, dims[2];
+
+  size_t num_obj;
+  size_t num_obj_var;
+  size_t num_entity;
+
+  int *obj_var_truth_tab;
+  char errmsg[MAX_ERR_LENGTH];
+
+  /* Determine index of obj_id in VOBJID array */
+  obj_id_ndx = ex_id_lkup(exoid,var_type,obj_id);
+  if (exerrval != 0) {
+    if (exerrval == EX_NULLENTITY) {
+      sprintf(errmsg,
+	      "Warning: no variables allowed for NULL block %"PRId64" in file id %d",
+	      obj_id,exoid);
+      ex_err("ex_put_var",errmsg,EX_NULLENTITY);
+      return (EX_WARN);
+    }
+    else {
+      sprintf(errmsg,
+	      "Error: failed to locate %s id %"PRId64" in %s array in file id %d",
+	      ex_name_of_object(var_type), obj_id, VOBJID, exoid);
+      ex_err("ex_put_var",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+
+  if ((status = nc_inq_varid (exoid, ex_name_var_of_object(var_type, var_index, obj_id_ndx), varid)) != NC_NOERR) {
+    if (status == NC_ENOTVAR) {/* variable doesn't exist, create it! */
+      /* check for the existance of an TNAME variable truth table */
+      if (nc_inq_varid(exoid, VOBJTAB, varid) == NC_NOERR) {
+	/* find out number of TNAMEs and TNAME variables */
+	status = ex_get_dimension(exoid, DNUMOBJ, ex_name_of_object(var_type), &num_obj, &dimid, "ex_put_var");
+	if (status != NC_NOERR) return status;
+
+	status = ex_get_dimension(exoid, DNUMOBJVAR, ex_name_of_object(var_type), &num_obj_var, &dimid, "ex_put_var");
+	if (status != NC_NOERR) return status;
+
+	if (!(obj_var_truth_tab = malloc(num_obj*num_obj_var*sizeof(int)))) {
+	  exerrval = EX_MEMFAIL;
+	  sprintf(errmsg,
+		  "Error: failed to allocate memory for %s variable truth table in file id %d",
+		  ex_name_of_object(var_type), exoid);
+	  ex_err("ex_put_var",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+
+	/*   read in the TNAME variable truth table */
+	if ((status = nc_get_var_int (exoid, *varid, obj_var_truth_tab)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to get truth table from file id %d", exoid);
+	  ex_err("ex_put_var",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+
+	if(obj_var_truth_tab[num_obj_var*(obj_id_ndx-1)+var_index-1] == 0L) {
+	  free(obj_var_truth_tab);
+	  exerrval = EX_BADPARAM;
+	  sprintf(errmsg,
+		  "Error: Invalid %s variable %d, %s %"PRId64" in file id %d",
+		  ex_name_of_object(var_type), var_index, ex_name_of_object(var_type), obj_id, exoid);
+	  ex_err("ex_put_var",errmsg,exerrval);
+	  return (EX_FATAL);
+	}
+	free(obj_var_truth_tab);
+      }
+
+      if ((status = nc_inq_dimid(exoid, DIM_TIME, &time_dim)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to locate time dimension in file id %d", exoid);
+	ex_err("ex_put_var",errmsg,exerrval);
+	goto error_ret;         /* exit define mode and return */
+      }
+
+      ex_get_dimension(exoid, ex_dim_num_entries_in_object(var_type, obj_id_ndx),
+		       ex_name_of_object(var_type), &num_entity, &numobjdim,  "ex_put_var");
+
+      /*    variable doesn't exist so put file into define mode  */
+      if ((status = nc_redef (exoid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to put file id %d into define mode", exoid);
+	ex_err("ex_put_var",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      /* define netCDF variable to store TNAME variable values */
+      dims[0] = time_dim;
+      dims[1] = numobjdim;
+      if ((status = nc_def_var(exoid, ex_name_var_of_object(var_type, var_index, obj_id_ndx),
+			       nc_flt_code(exoid), 2, dims, varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define %s variable %d in file id %d",
+		ex_name_of_object(var_type), var_index,exoid);
+	ex_err("ex_put_var",errmsg,exerrval);
+	goto error_ret;
+      }
+      ex_compress_variable(exoid, *varid, 2);
+
+      /*    leave define mode  */
+      if ((status = nc_enddef (exoid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to complete %s variable %s definition to file id %d",
+		ex_name_of_object(var_type), ex_name_var_of_object(var_type, var_index, obj_id_ndx), exoid);
+	ex_err("ex_put_var",errmsg,exerrval);
+	return (EX_FATAL);
+      }
+    }
+    else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to locate %s variable %s in file id %d",
+	      ex_name_of_object(var_type), ex_name_var_of_object(var_type, var_index, obj_id_ndx), exoid);
+      ex_err("ex_put_var",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+  }
+  return (EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if (nc_enddef (exoid) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_var",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
+
+/*!
+ * writes the values of a single variable for one entity at one time
+ * step to the database; assume the first time step and variable index
+ * are 1
+ * \param      exoid                   exodus file id
+ * \param      time_step               time step number
+ * \param      var_type                type (edge block, face block, edge set, ... )
+ * \param      var_index               variable index
+ * \param      obj_id                  entity block id
+ * \param      num_entries_this_obj    number of entries in this block/set
+ * \param      var_vals                the values to be written
+ */
+
+int ex_put_var (int   exoid,
+		int   time_step,
+		ex_entity_type var_type,
+		int   var_index,
+		ex_entity_id   obj_id,
+		int64_t   num_entries_this_obj,
+		const void *var_vals)
+{
+  int varid;
+  size_t start[2], count[2];
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  switch (var_type) {
+  case EX_GLOBAL:
+    if ( num_entries_this_obj <= 0 ) {
+      exerrval = EX_MSG;
+      sprintf(errmsg,
+	      "Warning: no global variables specified for file id %d",
+	      exoid);
+      ex_err("ex_put_glob_vars",errmsg,exerrval);
+
+      return (EX_WARN);
+    }
+
+    /* inquire previously defined variable */
+    if ((status = nc_inq_varid (exoid, VAR_GLO_VAR, &varid)) != NC_NOERR) {
+      if (status == NC_ENOTVAR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: no global variables defined in file id %d",
+		exoid);
+	ex_err("ex_put_glob_vars",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to get global variables parameters in file id %d",
+		exoid);
+	ex_err("ex_put_glob_vars",errmsg,exerrval);
+      }
+      return (EX_FATAL);
+    }
+    break;
+  case EX_NODAL:
+    return ex_put_nodal_var(exoid, time_step, var_index, num_entries_this_obj, var_vals);
+    break;
+  case EX_EDGE_BLOCK:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+			    VAR_ID_ED_BLK,VAR_EBLK_TAB,DIM_NUM_ED_BLK,DIM_NUM_EDG_VAR, &varid);
+    break;
+  case EX_FACE_BLOCK:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_ID_FA_BLK,VAR_FBLK_TAB,DIM_NUM_FA_BLK,DIM_NUM_FAC_VAR, &varid);
+    break;
+  case EX_ELEM_BLOCK:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_ID_EL_BLK,VAR_ELEM_TAB,DIM_NUM_EL_BLK,DIM_NUM_ELE_VAR, &varid);
+    break;
+  case EX_NODE_SET:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_NS_IDS,VAR_NSET_TAB,DIM_NUM_NS,DIM_NUM_NSET_VAR, &varid);
+    break;
+  case EX_EDGE_SET:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_ES_IDS,VAR_ESET_TAB,DIM_NUM_ES,DIM_NUM_ESET_VAR, &varid);
+    break;
+  case EX_FACE_SET:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_FS_IDS,VAR_FSET_TAB,DIM_NUM_FS,DIM_NUM_FSET_VAR, &varid);
+    break;
+  case EX_SIDE_SET:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_SS_IDS,VAR_SSET_TAB,DIM_NUM_SS,DIM_NUM_SSET_VAR, &varid);
+    break;
+  case EX_ELEM_SET:
+    status = ex_look_up_var(exoid, var_type, var_index, obj_id,
+		   VAR_ELS_IDS,VAR_ELSET_TAB,DIM_NUM_ELS,DIM_NUM_ELSET_VAR, &varid);
+    break;
+  default:
+    exerrval = EX_MSG;
+    sprintf( errmsg, "Error: invalid variable type (%d) specified for file id %d",
+	     var_type, exoid );
+    ex_err( "ex_put_var", errmsg, exerrval );
+    return (EX_FATAL);
+  }
+
+  if (status != EX_NOERR) {
+    return status;
+  }    
+
+  /* store element variable values */
+  start[0] = --time_step;
+  start[1] = 0;
+
+  if ( var_type == EX_GLOBAL ) {
+    /* global variables may be written
+     * - all at once (by setting var_index to 1 and num_entries_this_obj to num_glob, or
+     * - one at a time (by setting var_index to the desired index and num_entries_this_obj to 1.
+     */
+    count[0] = var_index;
+  } else {
+    count[0] = 1;
+  }
+  count[1] = num_entries_this_obj;
+
+  if (ex_comp_ws(exoid) == 4) {
+    status = nc_put_vara_float(exoid, varid, start, count, var_vals);
+  } else {
+    status = nc_put_vara_double(exoid, varid, start, count, var_vals);
+  }
+
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to store %s %"PRId64" variable %d in file id %d",
+	    ex_name_of_object(var_type), obj_id, var_index,exoid);
+    ex_err("ex_put_var",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return (EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_put_var_name.c b/exodus/cbind/src/ex_put_var_name.c
new file mode 100644
index 0000000..05273bc
--- /dev/null
+++ b/exodus/cbind/src/ex_put_var_name.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvnm - ex_put_var_name
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   var_type                variable type: G,N, or E
+*       int     var_num                 variable number name to write 1..num_var
+*       char*   var_name                ptr of variable name
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_variable_name, etc
+
+/*!
+ * writes the name of a particular results variable to the database
+ * \param       exoid                   exodus file id
+ * \param      *var_type                variable type: G,N, or E
+ * \param       var_num                 variable number name to write 1..num_var
+ * \param      *var_name                ptr of variable name
+ * \deprecated use ex_put_variable_name()(exoid, obj_type, var_num, *var_name)
+ */
+
+int ex_put_var_name (int   exoid,
+                     const char *var_type,
+                     int   var_num,
+                     const char *var_name)
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return ex_put_variable_name(exoid, obj_type, var_num, var_name);
+}
diff --git a/exodus/cbind/src/ex_put_var_names.c b/exodus/cbind/src/ex_put_var_names.c
new file mode 100644
index 0000000..8d8685c
--- /dev/null
+++ b/exodus/cbind/src/ex_put_var_names.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvan - ex_put_var_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   var_type                variable type: G,N, or E
+*       int     num_vars                # of variables to read
+*       char*   var_names               ptr array of variable names
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_variable_names, etc
+
+/*!
+ * writes the names of the results variables to the database
+ * \param     exoid                   exodus file id
+ * \param    *var_type                variable type: G,N, or E
+ * \param     num_vars                # of variables to read
+ * \param    *var_names               ptr array of variable names
+ * \deprecated Use ex_put_variable_names()(exoid, obj_type, num_vars, var_names)
+ */
+
+int ex_put_var_names (int   exoid,
+                      const char *var_type,
+                      int   num_vars,
+                      char* var_names[])
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return ex_put_variable_names(exoid, obj_type, num_vars, var_names);
+}
diff --git a/exodus/cbind/src/ex_put_var_param.c b/exodus/cbind/src/ex_put_var_param.c
new file mode 100644
index 0000000..a413ad9
--- /dev/null
+++ b/exodus/cbind/src/ex_put_var_param.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvp - ex_put_var_param
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   var_type                variable type G,N, or E
+*       int*    num_vars                number of variables in database
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_variable_param, etc
+
+
+/*!
+ * writes the number and names of global, nodal, or element variables 
+ * that will be written to the database
+ * \param       exoid                   exodus file id
+ * \param       var_type                variable type G,N, or E
+ * \param       num_vars                number of variables in database
+ * \deprecated Use ex_put_variable_param()(exoid, obj_type, num_vars)
+ */
+
+int ex_put_var_param (int   exoid,
+                      const char *var_type,
+                      int   num_vars)
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return (ex_put_variable_param(exoid, obj_type, num_vars));
+}
diff --git a/exodus/cbind/src/ex_put_var_tab.c b/exodus/cbind/src/ex_put_var_tab.c
new file mode 100644
index 0000000..77d568b
--- /dev/null
+++ b/exodus/cbind/src/ex_put_var_tab.c
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvtt - ex_put_var_tab
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       char*   type                    'e', 'm', 's' element, nodeset, sideset
+*       int     num_blk            number of blocks
+*       int     num_var            number of variables
+*       int*    var_tab            variable truth table array
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include "exodusII.h"                   // for ex_put_truth_table, etc
+
+/*!
+ * writes the EXODUS II variable truth table to the database; also,
+ * creates netCDF variables in which to store EXODUS II variable
+ * values; although this table isn't required (because the netCDF
+ * variables can also be created in ex_put_var), this call will save
+ * tremendous time because all of the variables are defined at once
+ * while the file is in define mode, rather than going in and out of
+ * define mode (causing the entire file to be copied over and over)
+ * which is what occurs when the variables are defined in ex_put_var
+ * \param      exoid              exodus file id
+ * \param     *var_type               'e', 'm', 's' element, nodeset, sideset
+ * \param      num_blk            number of blocks
+ * \param      num_var            number of variables
+ * \param     *var_tab            variable truth table array
+ * \deprecated Use ex_put_truth_table()(exoid, obj_type, num_blk, num_var, var_tab)
+ */
+
+int ex_put_var_tab (int  exoid,
+		    const char *var_type,
+		    int  num_blk,
+		    int  num_var,
+		    int *var_tab)
+{
+  ex_entity_type obj_type;
+  obj_type = ex_var_type_to_ex_entity_type(*var_type);
+  return ex_put_truth_table(exoid, obj_type, num_blk, num_var, var_tab);
+}
diff --git a/exodus/cbind/src/ex_put_variable_name.c b/exodus/cbind/src/ex_put_variable_name.c
new file mode 100644
index 0000000..46945f4
--- /dev/null
+++ b/exodus/cbind/src/ex_put_variable_name.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright (c) 2006 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvnm - ex_put_variable_name
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                variable type: G,N, or E
+*       int     var_num                 variable number name to write 1..num_var
+*       char*   var_name                ptr of variable name
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_WARN, etc
+#include "netcdf.h"                     // for nc_inq_varid, NC_NOERR
+
+/*!
+ * writes the name of a particular results variable to the database
+ *  \param     exoid                   exodus file id
+ *  \param     obj_type                variable type
+ *  \param     var_num                 variable number name to write 1..num_var
+ *  \param    *var_name                ptr of variable name
+ */
+
+int ex_put_variable_name (int   exoid,
+			  ex_entity_type obj_type,
+			  int   var_num,
+			  const char *var_name)
+{
+  int status;
+  int varid; 
+  char errmsg[MAX_ERR_LENGTH];
+  const char* vname;
+
+  exerrval = 0; /* clear error code */
+
+ /* inquire previously defined variables  */
+  switch (obj_type) {
+  case EX_GLOBAL:
+    vname = VAR_NAME_GLO_VAR;
+    break;
+  case EX_NODAL:
+    vname = VAR_NAME_NOD_VAR;
+    break;
+  case EX_EDGE_BLOCK:
+    vname = VAR_NAME_EDG_VAR;
+    break;
+  case EX_FACE_BLOCK:
+    vname = VAR_NAME_FAC_VAR;
+    break;
+  case EX_ELEM_BLOCK:
+    vname = VAR_NAME_ELE_VAR;
+    break;
+  case EX_NODE_SET:
+    vname = VAR_NAME_NSET_VAR;
+    break;
+  case EX_EDGE_SET:
+    vname = VAR_NAME_ESET_VAR;
+    break;
+  case EX_FACE_SET:
+    vname = VAR_NAME_FSET_VAR;
+    break;
+  case EX_SIDE_SET:
+    vname = VAR_NAME_SSET_VAR;
+    break;
+  case EX_ELEM_SET:
+    vname = VAR_NAME_ELSET_VAR;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf( errmsg, "Error: Invalid variable type (%d) given for file id %d", obj_type, exoid );
+    ex_err( "ex_put_variable_name", errmsg, exerrval );
+    return (EX_WARN);
+  }
+
+  if ((status = nc_inq_varid(exoid, vname, &varid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf( errmsg,
+	     "Warning: no %s variables names stored in file id %d",
+	     ex_name_of_object(obj_type), exoid );
+    ex_err("ex_put_variable_name",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* write EXODUS variable name */
+  status = ex_put_name_internal(exoid, varid, var_num-1, var_name, obj_type,
+				"variable", "ex_put_variable_name");
+
+  return(status);
+}
diff --git a/exodus/cbind/src/ex_put_variable_names.c b/exodus/cbind/src/ex_put_variable_names.c
new file mode 100644
index 0000000..a21a5da
--- /dev/null
+++ b/exodus/cbind/src/ex_put_variable_names.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* expvan - ex_put_variable_names
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*       int     obj_type                variable type: G,N, or E
+*       int     num_vars                # of variables to read
+*       char*   var_names               ptr array of variable names
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for EX_FATAL, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_inq_dimid, etc
+
+#define EX_PUT_NAMES(TNAME,DNUMVAR,VNAMES)				\
+  if ((status = nc_inq_dimid(exoid, DNUMVAR, &dimid)) != NC_NOERR) {	\
+    exerrval = status;							\
+    if (status == NC_EBADDIM) {						\
+      sprintf(errmsg,							\
+	      "Error: no " TNAME " variables defined in file id %d",	\
+	      exoid);							\
+      ex_err("ex_put_var_names",errmsg,exerrval);			\
+    } else  {								\
+      sprintf(errmsg,							\
+	      "Error: failed to locate number of " TNAME " variables in file id %d", \
+	      exoid);							\
+      ex_err("ex_put_var_names",errmsg,exerrval);			\
+    }									\
+    return(EX_FATAL);							\
+  }									\
+									\
+  if ((status = nc_inq_varid(exoid, VNAMES, &varid)) != NC_NOERR) {	\
+    exerrval = status;							\
+    if (status == NC_ENOTVAR)						\
+      {									\
+	sprintf(errmsg,							\
+		"Error: no " TNAME " variable names defined in file id %d", \
+		exoid);							\
+	ex_err("ex_put_var_names",errmsg,exerrval);			\
+      }	 else {								\
+      sprintf(errmsg,							\
+	      "Error: " TNAME " name variable names not found in file id %d", \
+	      exoid);							\
+      ex_err("ex_put_var_names",errmsg,exerrval);			\
+    }									\
+    return(EX_FATAL);							\
+  }
+
+/*!
+
+The function ex_put_variable_names() writes the names of the results
+variables to the database. The names are \p MAX_STR_LENGTH -characters
+in length. The function ex_put_variable_param() must be called before
+this function is invoked.
+
+\return In case of an error, ex_put_variable_names() returns a negative
+number; a warning will return a positive number.  Possible causes of
+errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file not initialized properly with call to ex_put_init().
+  -  invalid variable type specified.
+  -  ex_put_variable_param() was not called previously or was
+     called with zero variables of the specified type.
+  -  ex_put_variable_names() has been called previously for the
+     specified variable type.
+
+\param[in]  exoid      exodus file ID returned from a previous call to ex_create() or ex_open(). 
+\param[in]  obj_type   Variable indicating the type of variable which is described. 
+                       Use one of the options in the table below.
+\param[in]  num_vars   The number of \c var_type variables that will be written 
+                       to the database.
+\param[in]  var_names  Array of pointers to \c num_vars variable names.
+
+<table>
+<tr><td> \c EX_GLOBAL}    </td><td>  Global entity type       </td></tr>
+<tr><td> \c EX_NODAL}     </td><td>  Nodal entity type        </td></tr>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+</table>
+
+The following coding will write out the names associated with the
+nodal variables:
+\code
+int num_nod_vars, error, exoid;
+char *var_names[2];
+
+\comment{write results variables parameters and names}
+num_nod_vars = 2;
+
+var_names[0] = "disx";
+var_names[1] = "disy";
+
+error = ex_put_variable_param (exoid, EX_NODAL, num_nod_vars);
+error = ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, var_names);
+\endcode
+
+*/
+
+int ex_put_variable_names (int   exoid,
+			   ex_entity_type obj_type,
+			   int   num_vars,
+			   char* var_names[])
+{
+  int varid, dimid, status; 
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval = 0; /* clear error code */
+
+  switch (obj_type) {
+  case EX_GLOBAL:
+    EX_PUT_NAMES(     "global",DIM_NUM_GLO_VAR,  VAR_NAME_GLO_VAR);
+    break;
+  case EX_NODAL:
+    EX_PUT_NAMES(      "nodal",DIM_NUM_NOD_VAR,  VAR_NAME_NOD_VAR);
+    break;
+  case EX_EDGE_BLOCK:
+    EX_PUT_NAMES(       "edge",DIM_NUM_EDG_VAR,  VAR_NAME_EDG_VAR);
+    break;
+  case EX_FACE_BLOCK:
+    EX_PUT_NAMES(       "face",DIM_NUM_FAC_VAR,  VAR_NAME_FAC_VAR);
+    break;
+  case EX_ELEM_BLOCK:
+    EX_PUT_NAMES(    "element",DIM_NUM_ELE_VAR,  VAR_NAME_ELE_VAR);
+    break;
+  case EX_NODE_SET:
+    EX_PUT_NAMES(   "node set",DIM_NUM_NSET_VAR, VAR_NAME_NSET_VAR);
+    break;
+  case EX_EDGE_SET:
+    EX_PUT_NAMES(   "edge set",DIM_NUM_ESET_VAR, VAR_NAME_ESET_VAR);
+    break;
+  case EX_FACE_SET:
+    EX_PUT_NAMES(   "face set",DIM_NUM_FSET_VAR, VAR_NAME_FSET_VAR);
+    break;
+  case EX_SIDE_SET:
+    EX_PUT_NAMES(   "side set",DIM_NUM_SSET_VAR, VAR_NAME_SSET_VAR);
+    break;
+  case EX_ELEM_SET:
+    EX_PUT_NAMES("element set",DIM_NUM_ELSET_VAR,VAR_NAME_ELSET_VAR);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+            "Error: Invalid variable type %d specified in file id %d",
+	    obj_type, exoid);
+    ex_err("ex_put_var_names",errmsg,exerrval);
+    return(EX_FATAL);
+  }
+
+  /* write EXODUS variable names */
+  status = ex_put_names_internal(exoid, varid, num_vars, var_names, obj_type,
+				 "variable", "ex_put_var_names");
+  
+  return(status);
+}
diff --git a/exodus/cbind/src/ex_put_variable_param.c b/exodus/cbind/src/ex_put_variable_param.c
new file mode 100644
index 0000000..021d697
--- /dev/null
+++ b/exodus/cbind/src/ex_put_variable_param.c
@@ -0,0 +1,405 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for ex_err, exerrval, etc
+#include "exodusII_int.h"               // for ex_compress_variable, etc
+#include "netcdf.h"                     // for NC_NOERR, nc_def_var, etc
+
+
+/*! \cond INTERNAL */
+int ex_prepare_result_var(int exoid, int num_vars,
+			  char *type_name, char *dim_name, char *variable_name)
+{
+  int status;
+  int dimid;
+  int varid;
+  int dims[2];
+  int dim_str_name;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  if ((status = nc_def_dim(exoid, dim_name, num_vars, &dimid)) != NC_NOERR) {
+    if (status == NC_ENAMEINUSE) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: %s variable name parameters are already defined in file id %d", type_name, exoid);
+      ex_err("ex_put_var_param",errmsg,exerrval);
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define number of %s variables in file id %d",
+	      type_name, exoid);
+      ex_err("ex_put_var_param",errmsg,exerrval);
+    }
+    return 1;     /* exit define mode and return */
+  }
+
+  /* Now define type_name variable name variable */
+  if ((status = nc_inq_dimid(exoid, DIM_STR_NAME, &dim_str_name)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to get string length in file id %d",exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  
+  dims[0] = dimid;
+  dims[1] = dim_str_name;
+  if ((status = nc_def_var (exoid, variable_name,
+			    NC_CHAR, 2, dims, &varid)) != NC_NOERR) {
+    if (status == NC_ENAMEINUSE) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: %s variable names are already defined in file id %d",
+	      type_name, exoid);
+      ex_err("ex_put_variable_param",errmsg,exerrval);
+    } else {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to define %s variable names in file id %d",
+	      type_name, exoid);
+      ex_err("ex_put_variable_param",errmsg,exerrval);
+    }
+    return 1;   /* exit define mode and return */
+  }
+  return 0;
+}
+/*! \endcond */
+
+/*!
+
+The function ex_put_variable_param() writes the number of global,
+nodal, nodeset, sideset, edge, face, or element variables that will be
+written to the database.
+
+\return In case of an error, ex_put_variable_param() returns a negative
+        number; a warning will return a positive number. Possible causes of
+	errors include:
+  -  data file not properly opened with call to ex_create() or ex_open()
+  -  data file opened for read only.
+  -  invalid variable type specified.
+  -  data file not initialized properly with call to ex_put_init().
+  -  this routine has already been called with the same variable
+     type; redefining the number of variables is not allowed.
+  -  a warning value is returned if the number of variables
+     is specified as zero.
+
+\param[in] exoid     exodus file ID returned from a previous call to ex_create() or ex_open().
+\param[in] obj_type  Variable indicating the type of variable which is described. Use one
+                     of the #ex_entity_type types specified in the table below.
+\param[in] num_vars  The number of \c var_type variables that will be written to the
+                     database.
+
+<table>
+<tr><td> \c EX_GLOBAL     </td><td>  Global entity type       </td></tr>
+<tr><td> \c EX_NODAL      </td><td>  Nodal entity type        </td></tr>
+<tr><td> \c EX_NODE_SET   </td><td>  Node Set entity type     </td></tr>
+<tr><td> \c EX_EDGE_BLOCK </td><td>  Edge Block entity type   </td></tr>
+<tr><td> \c EX_EDGE_SET   </td><td>  Edge Set entity type     </td></tr>
+<tr><td> \c EX_FACE_BLOCK </td><td>  Face Block entity type   </td></tr>
+<tr><td> \c EX_FACE_SET   </td><td>  Face Set entity type     </td></tr>
+<tr><td> \c EX_ELEM_BLOCK </td><td>  Element Block entity type</td></tr>
+<tr><td> \c EX_ELEM_SET   </td><td>  Element Set entity type  </td></tr>
+<tr><td> \c EX_SIDE_SET   </td><td>  Side Set entity type     </td></tr>
+</table>
+
+For example, the following code segment initializes the data file to
+store global variables:
+
+\code
+int num_glo_vars, error, exoid;
+
+\comment{write results variables parameters}
+num_glo_vars = 3;
+
+error = ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars);
+\endcode
+
+ */
+
+int ex_put_variable_param (int exoid,
+			   ex_entity_type obj_type,
+			   int num_vars)
+{
+  int time_dim, num_nod_dim, dimid, dim_str_name, varid;
+  int dims[3];
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+
+  exerrval = 0; /* clear error code */
+
+  /* if no variables are to be stored, return with warning */
+  if (num_vars == 0) {
+    exerrval = EX_MSG;
+    sprintf(errmsg,
+	    "Warning: zero %s variables specified for file id %d",
+	    ex_name_of_object(obj_type),exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+
+    return (EX_WARN);
+  }
+
+  if ( obj_type != EX_NODAL      &&
+       obj_type != EX_NODE_SET   &&
+       obj_type != EX_EDGE_BLOCK &&
+       obj_type != EX_EDGE_SET   &&
+       obj_type != EX_FACE_BLOCK &&
+       obj_type != EX_FACE_SET   &&
+       obj_type != EX_ELEM_BLOCK &&
+       obj_type != EX_ELEM_SET   &&
+       obj_type != EX_SIDE_SET   &&
+       obj_type != EX_GLOBAL) {
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+	    "Error: Invalid variable type %d specified in file id %d",
+	    obj_type, exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+    return (EX_WARN);
+  }
+
+  /* inquire previously defined dimensions  */
+  if ((status = nc_inq_dimid (exoid, DIM_TIME, &time_dim)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to locate time dimension in file id %d", exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ((status = nc_inq_dimid (exoid, DIM_NUM_NODES, &num_nod_dim)) != NC_NOERR) {
+    if (obj_type == EX_NODAL) {
+      return (EX_NOERR); /* Probably no nodes on database (e.g., badly load-balanced parallel run) */
+    }
+  }
+
+  if ((status = nc_inq_dimid (exoid, DIM_STR_NAME, &dim_str_name)) < 0) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to get name string length in file id %d",exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  /* put file into define mode  */
+  if ((status = nc_redef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to put file id %d into define mode", exoid);
+    ex_err("ex_get_var_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+
+  /* define dimensions and variables */
+  if (obj_type == EX_GLOBAL) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "global",
+					DIM_NUM_GLO_VAR,VAR_NAME_GLO_VAR)) == 1)
+      goto error_ret;
+
+    if ((status = nc_inq_dimid (exoid, DIM_NUM_GLO_VAR, &dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to get global variable count in file id %d",exoid);
+      ex_err("ex_put_variable_param",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+    dims[0] = time_dim;
+    dims[1] = dimid;
+    if ((status = nc_def_var (exoid, VAR_GLO_VAR,
+			      nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR)
+      {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define global variables in file id %d",
+		exoid);
+	ex_err("ex_put_variable_param",errmsg,exerrval);
+	goto error_ret;          /* exit define mode and return */
+      }
+    ex_compress_variable(exoid, varid, 2);
+  }
+
+  else if (obj_type == EX_NODAL) {
+    /*
+     * There are two ways to store the nodal variables. The old way *
+     * was a blob (#times,#vars,#nodes), but that was exceeding the
+     * netcdf maximum dataset size for large models. The new way is
+     * to store #vars separate datasets each of size (#times,#nodes)
+     *
+     * We want this routine to be capable of storing both formats
+     * based on some external flag.  Since the storage format of the
+     * coordinates have also been changed, we key off of their
+     * storage type to decide which method to use for nodal
+     * variables. If the variable 'coord' is defined, then store old
+     * way; otherwise store new.
+     */
+    if ((status = nc_def_dim(exoid, DIM_NUM_NOD_VAR, num_vars, &dimid)) != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: nodal variable name parameters are already defined in file id %d",
+		exoid);
+	ex_err("ex_put_variable_param",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define number of nodal variables in file id %d",
+		exoid);
+	ex_err("ex_put_variable_param",errmsg,exerrval);
+      }
+      goto error_ret;          /* exit define mode and return */
+    }
+
+    if (ex_large_model(exoid) == 0) { /* Old way */
+      dims[0] = time_dim;
+      dims[1] = dimid;
+      dims[2] = num_nod_dim;
+      if ((status = nc_def_var(exoid, VAR_NOD_VAR,
+			       nc_flt_code(exoid), 3, dims, &varid)) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define nodal variables in file id %d",
+		exoid);
+	ex_err("ex_put_variable_param",errmsg,exerrval);
+	goto error_ret;          /* exit define mode and return */
+      }
+      ex_compress_variable(exoid, varid, 2);
+    } else { /* New way */
+      int i;
+      for (i = 1; i <= num_vars; i++) {
+	dims[0] = time_dim;
+	dims[1] = num_nod_dim;
+	if ((status = nc_def_var (exoid, VAR_NOD_VAR_NEW(i),
+				  nc_flt_code(exoid), 2, dims, &varid)) != NC_NOERR) {
+	  exerrval = status;
+	  sprintf(errmsg,
+		  "Error: failed to define nodal variable %d in file id %d",
+		  i, exoid);
+	  ex_err("ex_put_variable_param",errmsg,exerrval);
+	  goto error_ret;          /* exit define mode and return */
+	}
+	ex_compress_variable(exoid, varid, 2);
+      }
+    }
+
+    /* Now define nodal variable name variable */
+    dims[0] = dimid;
+    dims[1] = dim_str_name;
+    if ((status = nc_def_var(exoid, VAR_NAME_NOD_VAR, NC_CHAR, 2, dims, &varid)) != NC_NOERR) {
+      if (status == NC_ENAMEINUSE) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: nodal variable names are already defined in file id %d",
+		exoid);
+	ex_err("ex_put_variable_param",errmsg,exerrval);
+      } else {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to define nodal variable names in file id %d",
+		exoid);
+	ex_err("ex_put_variable_param",errmsg,exerrval);
+      }
+      goto error_ret;          /* exit define mode and return */
+    }
+  }
+
+  /* netCDF variables in which to store the EXODUS obj_type variable values will
+   * be defined in ex_put_*_var_tab or ex_put_*_var; at this point, we
+   * don't know what obj_type variables are valid for which obj_type blocks
+   * (the info that is stored in the obj_type variable truth table)
+   */
+  else if (obj_type == EX_ELEM_BLOCK)  {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "element",
+					DIM_NUM_ELE_VAR, VAR_NAME_ELE_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_NODE_SET) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "nodeset",
+					DIM_NUM_NSET_VAR,VAR_NAME_NSET_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_SIDE_SET) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "sideset",
+					DIM_NUM_SSET_VAR,VAR_NAME_SSET_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_EDGE_BLOCK) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "edge",
+					DIM_NUM_EDG_VAR,VAR_NAME_EDG_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_FACE_BLOCK) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "face",
+					DIM_NUM_FAC_VAR,VAR_NAME_FAC_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_EDGE_SET) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "edgeset",
+					DIM_NUM_ESET_VAR,VAR_NAME_ESET_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_FACE_SET) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "faceset",
+					DIM_NUM_FSET_VAR,VAR_NAME_FSET_VAR)) == 1)
+      goto error_ret;
+  }
+  else if (obj_type == EX_ELEM_SET) {
+    if ((status = ex_prepare_result_var(exoid, num_vars, "elementset",
+					DIM_NUM_ELSET_VAR,VAR_NAME_ELSET_VAR))==1)
+      goto error_ret;
+  }
+
+  /* leave define mode  */
+  if ((status = nc_enddef (exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to complete definition in file id %d",
+	    exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  return(EX_NOERR);
+
+  /* Fatal error: exit definition mode and return */
+ error_ret:
+  if ((status = nc_enddef(exoid)) != NC_NOERR) {    /* exit define mode */
+    sprintf(errmsg,
+	    "Error: failed to complete definition for file id %d",
+	    exoid);
+    ex_err("ex_put_variable_param",errmsg,exerrval);
+  }
+  return (EX_FATAL);
+}
diff --git a/exodus/cbind/src/ex_update.c b/exodus/cbind/src/ex_update.c
new file mode 100644
index 0000000..3ded94c
--- /dev/null
+++ b/exodus/cbind/src/ex_update.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exupda - ex_update
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+*
+*****************************************************************************/
+
+#include <stdio.h>                      // for sprintf
+#include "exodusII.h"                   // for exerrval, ex_err, etc
+#include "exodusII_int.h"               // for EX_FATAL, EX_NOERR
+#include "netcdf.h"                     // for nc_sync, NC_NOERR
+
+/*!
+ * updates an opened EXODUS II file (or EXODUS II history file)
+ * \param  exoid                   exodus file id
+ */
+
+int ex_update (int exoid)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+
+  exerrval = 0; /* clear error code */
+
+  if ((status = nc_sync(exoid)) != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg,
+            "Error: failed to update file id %d",
+	    exoid);
+    ex_err("ex_update",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  return(EX_NOERR);
+}
diff --git a/exodus/cbind/src/ex_utils.c b/exodus/cbind/src/ex_utils.c
new file mode 100644
index 0000000..90d8597
--- /dev/null
+++ b/exodus/cbind/src/ex_utils.c
@@ -0,0 +1,1562 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* exutils - utility routines
+*
+*****************************************************************************/
+
+#if defined(DEBUG_QSORT)
+#include <assert.h>
+#endif
+
+#include <ctype.h>                      /* for tolower, isspace */
+#include <errno.h>                      /* for errno */
+#include <stddef.h>                     /* for size_t */
+#include <stdio.h>                      /* for sprintf, NULL, fprintf, etc */
+#include <stdlib.h>                     /* for free, calloc, malloc, etc */
+#include <string.h>                     /* for strcpy, strlen */
+#include <sys/types.h>                  /* for int64_t */
+
+#include "exodusII.h"                   /* for exerrval, ex_err, etc */
+#include "exodusII_int.h"               /* for obj_stats, EX_FATAL, etc */
+
+struct obj_stats*  exoII_eb = 0;
+struct obj_stats*  exoII_ed = 0;
+struct obj_stats*  exoII_fa = 0;
+struct obj_stats*  exoII_ns = 0;
+struct obj_stats*  exoII_es = 0;
+struct obj_stats*  exoII_fs = 0;
+struct obj_stats*  exoII_ss = 0;
+struct obj_stats* exoII_els = 0;
+struct obj_stats*  exoII_em = 0;
+struct obj_stats* exoII_edm = 0;
+struct obj_stats* exoII_fam = 0;
+struct obj_stats*  exoII_nm = 0;
+
+
+/*****************************************************************************
+*
+* utility routines for string conversions
+* ex_catstr  - concatenate  string/number (where number is converted to ASCII)
+* ex_catstr2 - concatenate  string1/number1/string2/number2   "
+*
+* NOTE: these routines reuse the same storage over and over to build
+*        concatenated strings, because the strings are just passed to netCDF
+*        routines as names used to look up variables.  if the strings returned
+*        by these routines are needed for any other purpose, they should
+*        immediately be copied into other storage.
+*****************************************************************************/
+
+static char ret_string[10*(MAX_VAR_NAME_LENGTH+1)];
+static char* cur_string = &ret_string[0];
+
+int ex_check_file_type(const char *path, int *type)
+{
+  /* Based on (stolen from?) NC_check_file_type from netcdf sources.
+     
+     Type is set to:
+     1 if this is a netcdf classic file,
+     2 if this is a netcdf 64-bit offset file,
+     5 if this is an hdf5 file
+  */
+  
+#define MAGIC_NUMBER_LEN 4
+
+   char magic[MAGIC_NUMBER_LEN];
+    
+   *type = 0; 
+
+   /* Get the 4-byte magic from the beginning of the file. */
+   {
+      FILE *fp;
+      int i;
+
+      if (!(fp = fopen(path, "r")))
+	 return errno;
+      i = fread(magic, MAGIC_NUMBER_LEN, 1, fp);
+      fclose(fp);
+      if(i != 1)
+	 return errno;
+   }
+    
+   /* Ignore the first byte for HDF */
+   if (magic[1] == 'H' && magic[2] == 'D' && magic[3] == 'F')
+     *type = 5;
+   else if (magic[0] == 'C' && magic[1] == 'D' && magic[2] == 'F') 
+   {
+      if (magic[3] == '\001') 
+	*type = 1;
+      else if(magic[3] == '\002') 
+	*type = 2;
+   }
+   return EX_NOERR;
+}
+
+int ex_set_max_name_length(int exoid, int length)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  if (length <= 0) {
+    exerrval = NC_EMAXNAME;
+    sprintf(errmsg, "Error: Max name length must be positive.");
+    ex_err("ex_set_max_name_length",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  else if (length > NC_MAX_NAME) {
+    exerrval = NC_EMAXNAME;
+    sprintf(errmsg, "Error: Max name length (%d) exceeds netcdf max name size (%d).",
+	    length, NC_MAX_NAME);
+    ex_err("ex_set_max_name_length",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+  else {
+    ex_set_option(exoid, EX_OPT_MAX_NAME_LENGTH, length);
+  }
+  return EX_NOERR;
+}
+
+void ex_update_max_name_length(int exoid, int length)
+{
+  int status;
+  int db_length = 0;
+  int rootid = exoid & EX_FILE_ID_MASK;
+
+  /* Get current value of the maximum_name_length attribute... */
+  if ((status = nc_get_att_int(rootid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, &db_length)) != NC_NOERR) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = status;
+    sprintf(errmsg,
+	    "Error: failed to update 'max_name_length' attribute in file id %d",
+	    exoid);
+	ex_err("ex_update_max_name_length",errmsg,exerrval);
+  }
+
+  if (length > db_length) {
+    /* Update with new value... */
+    nc_put_att_int(rootid, NC_GLOBAL, ATT_MAX_NAME_LENGTH, NC_INT, 1, &length);
+    nc_sync(rootid);
+  }
+}
+
+int ex_put_names_internal(int exoid, int varid, size_t num_entity, char **names,
+			  ex_entity_type obj_type, const char *subtype, const char *routine)
+{
+  size_t i;
+  int status;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+  int max_name_len = 0;
+  size_t name_length;
+
+  /* inquire previously defined dimensions  */
+  name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH)+1;
+
+  for (i=0; i<num_entity; i++) {
+    if (names[i] != '\0') {
+      int too_long = 0;
+      start[0] = i;
+      start[1] = 0;
+       
+      count[0] = 1;
+      count[1] = strlen(names[i]) + 1;
+       
+      if (count[1] > name_length) {
+	fprintf(stderr,
+		"Warning: The %s %s name '%s' is too long.\n\tIt will be truncated from %d to %d characters\n",
+		ex_name_of_object(obj_type), subtype, names[i], (int)strlen(names[i]), (int)name_length-1);
+	count[1] = name_length;
+	too_long = 1;
+      }
+
+      if (count[1] > max_name_len)
+	max_name_len = count[1];
+
+      if ((status = nc_put_vara_text(exoid, varid, start, count, names[i])) != NC_NOERR) {
+	exerrval = status;
+	sprintf(errmsg,
+		"Error: failed to store %s names in file id %d",
+		ex_name_of_object(obj_type), exoid);
+	ex_err(routine,errmsg,exerrval);
+	return (EX_FATAL);
+      }
+
+      /* Add the trailing null if the variable name was too long */
+      if (too_long) {
+	start[1] = name_length-1;
+	nc_put_var1_text(exoid, varid, start, "\0");
+      }
+    }
+  }
+
+  /* Update the maximum_name_length attribute on the file. */
+  ex_update_max_name_length(exoid, max_name_len-1);
+
+  return (EX_NOERR);
+}
+
+int ex_put_name_internal(int exoid, int varid, size_t index, const char *name,
+			 ex_entity_type obj_type, const char *subtype, const char *routine)
+{
+  int status;
+  size_t start[2], count[2];
+  char errmsg[MAX_ERR_LENGTH];
+  size_t name_length;
+
+  /* inquire previously defined dimensions  */
+  name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH)+1;
+
+  if (name != '\0') {
+    int too_long = 0;
+    start[0] = index;
+    start[1] = 0;
+       
+    count[0] = 1;
+    count[1] = strlen(name) + 1;
+       
+    if (count[1] > name_length) {
+      fprintf(stderr,
+	      "Warning: The %s %s name '%s' is too long.\n\tIt will be truncated from %d to %d characters\n",
+	      ex_name_of_object(obj_type), subtype, name, (int)strlen(name), (int)name_length-1);
+      count[1] = name_length;
+      too_long = 1;
+    }
+
+    if ((status = nc_put_vara_text(exoid, varid, start, count, name)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+	      "Error: failed to store %s name in file id %d",
+	      ex_name_of_object(obj_type), exoid);
+      ex_err(routine,errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* Add the trailing null if the variable name was too long */
+    if (too_long) {
+      start[1] = name_length-1;
+      nc_put_var1_text(exoid, varid, start, "\0");
+    }
+
+    /* Update the maximum_name_length attribute on the file. */
+    ex_update_max_name_length(exoid, count[1]-1);
+  }
+
+  return (EX_NOERR);
+}
+
+int ex_get_names_internal(int exoid, int varid, size_t num_entity, char **names,
+			  ex_entity_type obj_type, const char *routine)
+{
+  size_t i;
+  int status;
+
+  /* Query size of names on file
+   * Use the smaller of the size on file or user-specified length
+   */
+  int db_name_size = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);
+  int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
+  int name_size = db_name_size < api_name_size ? db_name_size : api_name_size;
+  
+  for (i=0; i<num_entity; i++) {
+    status = ex_get_name_internal(exoid, varid, i, names[i], name_size, obj_type, routine);
+    if (status != NC_NOERR)
+      return status;
+  }
+  return EX_NOERR;
+}
+
+int ex_get_name_internal(int exoid, int varid, size_t index, char *name, int name_size,
+			 ex_entity_type obj_type, const char *routine)
+{
+  size_t start[2], count[2];
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+  int api_name_size = ex_inquire_int(exoid, EX_INQ_MAX_READ_NAME_LENGTH);
+
+  /* read the name */
+  start[0] = index;  count[0] = 1;
+  start[1] = 0;      count[1] = name_size+1;
+
+  status = nc_get_vara_text(exoid, varid, start, count, name);
+  if (status != NC_NOERR) {
+    exerrval = status;
+    sprintf(errmsg, "Error: failed to get %s name at index %d from file id %d",
+	    ex_name_of_object(obj_type), (int)index, exoid);
+    ex_err(routine,errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  name[api_name_size] = '\0';
+  
+  ex_trim_internal(name);
+  return EX_NOERR;
+}
+
+void ex_trim_internal(char *name)
+{
+  /* Trim trailing spaces... */
+  size_t size;
+  char *end;
+  
+  if (name == NULL)
+    return;
+  
+  size = strlen(name);
+  if (size==0)
+    return;
+  
+  end = name + size - 1;
+  while (end >= name && isspace(*end))
+    end--;
+
+  *(end+1) = '\0';
+}
+
+/** ex_catstr  - concatenate  string/number (where number is converted to ASCII) */
+char *ex_catstr (const char *string,
+                 int   num)
+{
+  char* tmp_string = cur_string;
+  cur_string += sprintf (cur_string, "%s%d", string, num) + 1;
+  if ( cur_string - ret_string > 9*(MAX_VAR_NAME_LENGTH+1) )
+    cur_string = ret_string;
+  return (tmp_string);
+}
+
+
+/** ex_catstr2 - concatenate  string1num1string2num2   */
+char *ex_catstr2 (const char *string1,
+                  int   num1,
+                  const char *string2,
+                  int   num2)
+{
+  char* tmp_string = cur_string;
+  cur_string += sprintf (cur_string, "%s%d%s%d", string1, num1, string2, num2) + 1;
+  if ( cur_string - ret_string > 9*(MAX_VAR_NAME_LENGTH+1) )
+    cur_string = ret_string;
+  return (tmp_string);
+}
+
+char* ex_name_of_object(ex_entity_type obj_type)
+{
+  switch (obj_type) {
+  case EX_COORDINATE: /* kluge so some wrapper functions work */
+    return "coordinate";
+  case EX_NODAL:
+    return "nodal";
+  case EX_EDGE_BLOCK:
+    return "edge block";
+  case EX_FACE_BLOCK:
+    return "face block";
+  case EX_ELEM_BLOCK:
+    return "element block";
+  case EX_NODE_SET:
+    return "node set";
+  case EX_EDGE_SET:
+    return "edge set";
+  case EX_FACE_SET:
+    return "face set";
+  case EX_SIDE_SET:
+    return "side set";
+  case EX_ELEM_SET:
+    return "element set";
+  case EX_ELEM_MAP:
+    return "element map";
+  case EX_NODE_MAP:
+    return "node map";
+  case EX_EDGE_MAP:
+    return "edge map";
+  case EX_FACE_MAP:
+    return "face map";
+  case EX_GLOBAL:
+    return "global";
+  default:
+    return "invalid type";
+  }
+}
+
+ex_entity_type ex_var_type_to_ex_entity_type(char var_type)
+{
+  char var_lower = tolower(var_type);
+  if (var_lower == 'n')
+    return EX_NODAL;
+  else if (var_lower == 'l')
+    return EX_EDGE_BLOCK;
+  else if (var_lower == 'f')
+    return EX_FACE_BLOCK;
+  else if (var_lower == 'e')
+    return EX_ELEM_BLOCK;
+  else if (var_lower == 'm')
+    return EX_NODE_SET;
+  else if (var_lower == 'd')
+    return EX_EDGE_SET;
+  else if (var_lower == 'a')
+    return EX_FACE_SET;
+  else if (var_lower == 's')
+    return EX_SIDE_SET;
+  else if (var_lower == 't')
+    return EX_ELEM_SET;
+  else if (var_lower == 'g')
+    return EX_GLOBAL;
+  else
+    return EX_INVALID;
+}
+
+char* ex_dim_num_objects(ex_entity_type obj_type)
+{
+   exerrval = 0; /* clear error code */
+   switch (obj_type)
+   {
+     case EX_NODAL:
+       return DIM_NUM_NODES;
+     case EX_ELEM_BLOCK:
+       return DIM_NUM_EL_BLK;
+     case EX_EDGE_BLOCK:
+       return DIM_NUM_ED_BLK;
+     case EX_FACE_BLOCK:
+       return DIM_NUM_FA_BLK;
+     case EX_NODE_SET:
+       return DIM_NUM_NS;
+     case EX_EDGE_SET:
+       return DIM_NUM_ES;
+     case EX_FACE_SET:
+       return DIM_NUM_FS;
+     case EX_ELEM_SET:
+       return DIM_NUM_ELS;
+     case EX_SIDE_SET:
+       return DIM_NUM_SS;
+     case EX_ELEM_MAP:
+       return DIM_NUM_EM;
+     case EX_FACE_MAP:
+       return DIM_NUM_FAM;
+     case EX_EDGE_MAP:
+       return DIM_NUM_EDM;
+     case EX_NODE_MAP:
+       return DIM_NUM_NM;
+     default:
+       {
+	 char errmsg[MAX_ERR_LENGTH];
+	 exerrval = EX_BADPARAM;
+	 sprintf(errmsg, "Error: object type %d not supported in call to ex_dim_num_objects",
+		 obj_type);
+	 ex_err("ex_dim_num_objects",errmsg,exerrval);
+	 return (NULL);
+       }
+   }
+}
+
+char* ex_dim_num_entries_in_object( ex_entity_type obj_type,
+                                    int idx )
+{
+  switch (obj_type) {
+  case EX_NODAL:
+    return DIM_NUM_NODES;
+  case EX_EDGE_BLOCK:
+    return DIM_NUM_ED_IN_EBLK(idx);
+  case EX_FACE_BLOCK:
+    return DIM_NUM_FA_IN_FBLK(idx);
+  case EX_ELEM_BLOCK:
+    return DIM_NUM_EL_IN_BLK(idx);
+  case EX_NODE_SET:
+    return DIM_NUM_NOD_NS(idx);
+  case EX_EDGE_SET:
+    return DIM_NUM_EDGE_ES(idx);
+  case EX_FACE_SET:
+    return DIM_NUM_FACE_FS(idx);
+  case EX_SIDE_SET:
+    return DIM_NUM_SIDE_SS(idx);
+  case EX_ELEM_SET:
+    return DIM_NUM_ELE_ELS(idx);
+  default:
+    return 0;
+  }
+}
+
+char* ex_name_var_of_object(ex_entity_type obj_type,
+			    int i, int j)
+{
+  switch (obj_type) {
+  case EX_EDGE_BLOCK:
+    return VAR_EDGE_VAR(i,j);
+  case EX_FACE_BLOCK:
+    return VAR_FACE_VAR(i,j);
+  case EX_ELEM_BLOCK:
+    return VAR_ELEM_VAR(i,j);
+  case EX_NODE_SET:
+    return VAR_NS_VAR(i,j);
+  case EX_EDGE_SET:
+    return VAR_ES_VAR(i,j);
+  case EX_FACE_SET:
+    return VAR_FS_VAR(i,j);
+  case EX_SIDE_SET:
+    return VAR_SS_VAR(i,j);
+  case EX_ELEM_SET:
+    return VAR_ELS_VAR(i,j);
+  default:
+    return 0;
+  }
+}
+
+char* ex_name_of_map(ex_entity_type map_type, int map_index)
+{
+  switch (map_type) {
+  case EX_NODE_MAP:
+    return VAR_NODE_MAP(map_index);
+  case EX_EDGE_MAP:
+    return VAR_EDGE_MAP(map_index);
+  case EX_FACE_MAP:
+    return VAR_FACE_MAP(map_index);
+  case EX_ELEM_MAP:
+    return VAR_ELEM_MAP(map_index);
+  default:
+    return 0;
+  }
+}
+
+/*****************************************************************************
+*
+* ex_id_lkup - look up id
+*
+* entry conditions - 
+*   input parameters:
+*       int            exoid             exodus file id
+*       ex_entity_type id_type           id type name:
+*                                         elem_ss
+*                                         node_ns
+*                                         side_ss
+*       int     num                     id value
+*
+* exit conditions - 
+*       int     return                  index into table (1-based)
+*
+*****************************************************************************/
+
+int ex_id_lkup( int exoid,
+                ex_entity_type id_type,
+                ex_entity_id   num)
+{
+
+  char id_table[MAX_VAR_NAME_LENGTH+1];
+  char id_dim[MAX_VAR_NAME_LENGTH+1];
+  char stat_table[MAX_VAR_NAME_LENGTH+1];
+  int varid, dimid;
+  size_t dim_len, i;
+  int64_t *id_vals=NULL;
+  int *stat_vals=NULL;
+
+  static int filled=EX_FALSE;
+  struct obj_stats *tmp_stats;
+  int status;
+  char errmsg[MAX_ERR_LENGTH];
+
+  exerrval  = 0; /* clear error code */
+
+  switch(id_type) {
+  case EX_NODAL:
+    return 0;
+  case EX_GLOBAL:
+    return 0;
+  case EX_ELEM_BLOCK:
+    strcpy(id_table, VAR_ID_EL_BLK);            /* id array name */
+    strcpy(id_dim, DIM_NUM_EL_BLK);             /* id array dimension name*/
+    strcpy(stat_table, VAR_STAT_EL_BLK);        /* id status array name */
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_eb);
+    break;
+  case EX_NODE_SET:
+    strcpy(id_table, VAR_NS_IDS);
+    strcpy(id_dim, DIM_NUM_NS);
+    strcpy(stat_table, VAR_NS_STAT);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_ns);
+    break;
+  case EX_SIDE_SET:
+    strcpy(id_table, VAR_SS_IDS);
+    strcpy(id_dim, DIM_NUM_SS);
+    strcpy(stat_table, VAR_SS_STAT);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_ss);
+    break;
+  case EX_ELEM_MAP:
+    strcpy(id_table, VAR_EM_PROP(1));
+    strcpy(id_dim, DIM_NUM_EM);
+    strcpy(stat_table, "");
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_em);
+    break;
+  case EX_NODE_MAP:
+    strcpy(id_table, VAR_NM_PROP(1));
+    strcpy(id_dim, DIM_NUM_NM);
+    strcpy(stat_table, "");
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_nm);
+    break;
+  case EX_EDGE_BLOCK:
+    strcpy(id_table, VAR_ID_ED_BLK);
+    strcpy(id_dim, DIM_NUM_ED_BLK);
+    strcpy(stat_table, VAR_STAT_ED_BLK);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_ed);
+    break;
+  case EX_FACE_BLOCK:
+    strcpy(id_table, VAR_ID_FA_BLK);
+    strcpy(id_dim, DIM_NUM_FA_BLK);
+    strcpy(stat_table, VAR_STAT_FA_BLK);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_fa);
+    break;
+  case EX_EDGE_SET:
+    strcpy(id_table, VAR_ES_IDS);
+    strcpy(id_dim, DIM_NUM_ES);
+    strcpy(stat_table, VAR_ES_STAT);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_es);
+    break;
+  case EX_FACE_SET:
+    strcpy(id_table, VAR_FS_IDS);
+    strcpy(id_dim, DIM_NUM_FS);
+    strcpy(stat_table, VAR_FS_STAT);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_fs);
+    break;
+  case EX_ELEM_SET:
+    strcpy(id_table, VAR_ELS_IDS);
+    strcpy(id_dim, DIM_NUM_ELS);
+    strcpy(stat_table, VAR_ELS_STAT);
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_els);
+    break;
+  case EX_EDGE_MAP:
+    strcpy(id_table, VAR_EDM_PROP(1));
+    strcpy(id_dim, DIM_NUM_EDM);
+    strcpy(stat_table, "");
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_edm);
+    break;
+  case EX_FACE_MAP:
+    strcpy(id_table, VAR_FAM_PROP(1));
+    strcpy(id_dim, DIM_NUM_FAM);
+    strcpy(stat_table, "");
+    tmp_stats = ex_get_stat_ptr (exoid, &exoII_fam);
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    sprintf(errmsg,
+           "Error: unsupported id array type %d for file id %d",
+            id_type, exoid);
+    ex_err("ex_id_lkup",errmsg,exerrval);
+    return (EX_FATAL);
+  }
+
+  if ( (tmp_stats->id_vals == NULL) || (!(tmp_stats->valid_ids)) ) {
+
+    /* first time thru or id arrays haven't been completely filled yet */ 
+
+    /* get size of id array */
+
+    /* First get dimension id of id array */
+    if ((status = nc_inq_dimid(exoid,id_dim,&dimid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+           "Error: failed to locate id array dimension in file id %d",
+            exoid);
+      ex_err("ex_id_lkup",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+
+    /* Next get value of dimension */ 
+    if ((status = nc_inq_dimlen(exoid,dimid,&dim_len)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+           "Error: failed to locate %s array length in file id %d",
+            id_table,exoid);
+      ex_err("ex_id_lkup",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* get variable id of id array */
+    if ((status = nc_inq_varid (exoid, id_table, &varid)) != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+             "Error: failed to locate %s array in file id %d",
+              id_table, exoid);
+      ex_err("ex_id_lkup",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    /* allocate space for id array and initialize to zero to ensure
+     that the higher bits don't contain garbage while copy from ints */
+    if (!(id_vals = calloc(dim_len,sizeof(int64_t)))) {
+      exerrval = EX_MEMFAIL;
+      sprintf(errmsg,
+             "Error: failed to allocate memory for %s array for file id %d",
+              id_table,exoid);
+      ex_err("ex_id_lkup",errmsg,exerrval);
+      return (EX_FATAL);
+    }
+
+    if (ex_int64_status(exoid) & EX_IDS_INT64_API) {
+      status = nc_get_var_longlong (exoid, varid, (long long*)id_vals);
+    }
+    else {
+      int *id_vals_int;
+      if (!(id_vals_int = malloc(dim_len*sizeof(int)))) {
+        exerrval = EX_MEMFAIL;
+        sprintf(errmsg,
+                "Error: failed to allocate memory for temporary array id_vals_int for file id %d",
+                exoid);
+        ex_err("ex_id_lkup",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+      status = nc_get_var_int(exoid, varid, (int *)id_vals_int);
+      if (status == NC_NOERR) {
+	for (i=0;i<dim_len;i++)
+	  id_vals[i] = (int64_t) id_vals_int[i];
+      }
+      free(id_vals_int);
+    }
+    
+    if (status != NC_NOERR) {
+      exerrval = status;
+      sprintf(errmsg,
+             "Error: failed to get %s array from file id %d",
+              id_table,exoid);
+      ex_err("ex_id_lkup",errmsg,exerrval);
+      free(id_vals);
+      return (EX_FATAL);
+    }
+
+    /* check if values in stored arrays are filled with non-zeroes */
+    filled = EX_TRUE;
+    for (i=0;i<dim_len;i++) {
+      if (id_vals[i] == EX_INVALID_ID || id_vals[i] == NC_FILL_INT) {
+        filled = EX_FALSE;
+        break; /* id array hasn't been completely filled with valid ids yet */
+      }
+    }
+
+    if (filled) {
+      tmp_stats->valid_ids = EX_TRUE;
+      tmp_stats->num = dim_len;
+      tmp_stats->id_vals = id_vals;
+    }
+
+  } else {
+    id_vals = tmp_stats->id_vals;
+    dim_len = tmp_stats->num;
+  }
+
+  /* Do a linear search through the id array to find the array value
+     corresponding to the passed index number */
+
+  for (i=0;i<dim_len;i++) {
+    if (id_vals[i] == num)
+      break; /* found the id requested */
+  }
+  if (i >= dim_len) /* failed to find id number */
+  {
+    if ( !(tmp_stats->valid_ids) ) {
+      if (id_vals) free (id_vals); 
+    }
+    exerrval = EX_LOOKUPFAIL;
+    return(EX_LOOKUPFAIL); /*if we got here, the id array value doesn't exist */
+  }
+  
+  /* Now check status array to see if object is null */
+
+  /* get variable id of status array */
+  if (nc_inq_varid (exoid, stat_table, &varid) == NC_NOERR) {
+    /* if status array exists, use it, otherwise assume object exists 
+       to be backward compatible */
+
+    if ( (tmp_stats->stat_vals == NULL) || (!(tmp_stats->valid_stat)) ) {
+      /* first time thru or status arrays haven't been filled yet */ 
+
+      /* allocate space for new status array */
+
+      if (!(stat_vals = malloc(dim_len*sizeof(int)))) {
+        exerrval = EX_MEMFAIL;
+        if (id_vals) free (id_vals); 
+        sprintf(errmsg,
+                 "Error: failed to allocate memory for %s array for file id %d",
+                  id_table,exoid);
+        ex_err("ex_id_lkup",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+      if ((status = nc_get_var_int (exoid, varid, stat_vals)) != NC_NOERR) {
+        exerrval = status;
+        if (id_vals) free (id_vals); 
+        free(stat_vals);
+        sprintf(errmsg,
+               "Error: failed to get %s array from file id %d",
+                stat_table,exoid);
+        ex_err("ex_id_lkup",errmsg,exerrval);
+        return (EX_FATAL);
+      }
+
+      if (tmp_stats->valid_ids) {  
+        /* status array is valid only if ids are valid */
+        tmp_stats->valid_stat = EX_TRUE;
+        tmp_stats->stat_vals = stat_vals;
+      }
+
+    } else {
+      stat_vals = tmp_stats->stat_vals;
+    }
+
+    if (stat_vals[i] == 0) /* is this object null? */ {
+      exerrval =  EX_NULLENTITY;
+      if ( !(tmp_stats->valid_stat) ) {
+        free (stat_vals);
+      }
+      if ( !(tmp_stats->valid_ids) ) {
+        if (id_vals) free (id_vals); 
+      }
+      return(-((int)i+1)); /* return index into id array (1-based) */
+    }
+  }
+  if ( !(tmp_stats->valid_ids) ) {
+    if (id_vals) free (id_vals);
+    if (stat_vals) free (stat_vals);
+  }
+  return(i+1); /* return index into id array (1-based) */
+}
+
+/******************************************************************************
+*
+* ex_get_stat_ptr - returns a pointer to a structure of object ids
+*
+*****************************************************************************/
+
+/*! this routine returns a pointer to a structure containing the ids of 
+ * element blocks, node sets, or side sets according to exoid;  if there
+ * is not a structure that matches the exoid, one is created
+ */
+
+struct obj_stats *ex_get_stat_ptr (int exoid, struct obj_stats **obj_ptr)
+
+{
+  struct obj_stats *tmp_ptr;
+
+  tmp_ptr = *obj_ptr;
+
+  while (tmp_ptr) {
+    if ( (tmp_ptr)->exoid == exoid) {
+      break;
+    }
+    tmp_ptr = (tmp_ptr)->next;
+  }
+
+  if (!tmp_ptr) {    /* exoid not found */
+    tmp_ptr = (struct obj_stats *) calloc (1, sizeof(struct obj_stats));
+    tmp_ptr->exoid = exoid;
+    tmp_ptr->next = *obj_ptr;
+    tmp_ptr->id_vals = 0;
+    tmp_ptr->stat_vals = 0;
+    tmp_ptr->num = 0;
+    tmp_ptr->valid_ids = 0;
+    tmp_ptr->valid_stat = 0;
+    *obj_ptr = tmp_ptr;
+  }
+
+  return (tmp_ptr);
+}
+
+/******************************************************************************
+*
+* ex_rm_stat_ptr - removes a pointer to a structure of object ids
+*
+*****************************************************************************/
+
+/*! this routine removes a pointer to a structure containing the ids of 
+ * element blocks, node sets, or side sets according to exoid;  this
+ * is necessary to clean up because netCDF reuses file ids;  should be
+ * called from ex_close
+ */
+
+void ex_rm_stat_ptr (int exoid, struct obj_stats **obj_ptr)
+
+{
+  struct obj_stats *last_head_list_ptr, *tmp_ptr;
+
+  tmp_ptr = *obj_ptr;
+  last_head_list_ptr = *obj_ptr;        /* save last head pointer */
+
+  while (tmp_ptr )                      /* Walk linked list of file ids/vals */
+  {
+    if (exoid == tmp_ptr->exoid )       /* linear search for exodus file id */
+    {
+      if (tmp_ptr == *obj_ptr)          /* Are we at the head of the list? */
+        *obj_ptr = (*obj_ptr)->next;    /*   yes, reset ptr to head of list */
+      else                              /*   no, remove this record from chain*/
+        last_head_list_ptr->next=tmp_ptr->next;
+      if (tmp_ptr->id_vals != NULL)
+        free(tmp_ptr->id_vals);           /* free up memory */
+      if (tmp_ptr->stat_vals != NULL)
+        free(tmp_ptr->stat_vals);
+      free(tmp_ptr);
+      break;                            /* Quit if found */
+    }
+    last_head_list_ptr = tmp_ptr;       /* save last head pointer */
+    tmp_ptr = tmp_ptr->next;            /* Loop back if not */
+  }
+}
+
+/* structures to hold number of blocks of that type for each file id */ 
+static struct list_item*  ed_ctr_list = 0; /* edge blocks */
+static struct list_item*  fa_ctr_list = 0; /* face blocks */
+static struct list_item*  eb_ctr_list = 0; /* element blocks */
+/* structures to hold number of sets of that type for each file id */ 
+static struct list_item*  ns_ctr_list = 0; /* node sets */
+static struct list_item*  es_ctr_list = 0; /* edge sets */
+static struct list_item*  fs_ctr_list = 0; /* face sets */
+static struct list_item*  ss_ctr_list = 0; /* side sets */
+static struct list_item* els_ctr_list = 0; /* element sets */
+/* structures to hold number of maps of that type for each file id */ 
+static struct list_item*  nm_ctr_list = 0; /* node maps */
+static struct list_item* edm_ctr_list = 0; /* edge maps */
+static struct list_item* fam_ctr_list = 0; /* face maps */
+static struct list_item*  em_ctr_list = 0; /* element maps */
+
+struct list_item** ex_get_counter_list(ex_entity_type obj_type)
+{
+  switch(obj_type) {
+  case EX_ELEM_BLOCK:
+    return &eb_ctr_list;
+  case EX_NODE_SET:
+    return &ns_ctr_list;
+  case EX_SIDE_SET:
+    return &ss_ctr_list;
+  case EX_ELEM_MAP:
+    return &em_ctr_list;
+  case EX_NODE_MAP:
+    return &nm_ctr_list;
+  case EX_EDGE_BLOCK:
+    return &ed_ctr_list;
+  case EX_FACE_BLOCK:
+    return &fa_ctr_list;
+  case EX_EDGE_SET:
+    return &es_ctr_list;
+  case EX_FACE_SET:
+    return &fs_ctr_list;
+  case EX_ELEM_SET:
+    return &els_ctr_list;
+  case EX_EDGE_MAP:
+    return &edm_ctr_list;
+  case EX_FACE_MAP:
+    return &fam_ctr_list;
+  default:
+    return (NULL);
+  }
+}
+
+/******************************************************************************
+*
+* ex_inc_file_item - increment file item
+*
+*****************************************************************************/
+
+
+/*! this routine sets up a structure to track and increment a counter for
+ * each open exodus file.  it is designed to be used by the routines
+ * ex_put_elem_block() and ex_put_set_param(),
+ * to keep track of the number of element blocks, and each type of set,
+ * respectively, for each open exodus II file.
+ *
+ * The list structure is used as follows:
+ *
+ *   ptr -----------> list item structure
+ *                    -------------------
+ *                    exodus file id
+ *                    item value (int)
+ *                    ptr to next (NULL if last)
+ *
+ *
+ * NOTE: since netCDF reuses its file ids, and a user may open and close any
+ *       number of files in one application, items must be taken out of the
+ *       linked lists in each of the above routines.  these should be called
+ *       after ncclose().
+ */
+
+int ex_inc_file_item( int exoid,                /* file id */
+                      struct list_item **list_ptr)/* ptr to ptr to list_item */
+
+{
+  struct list_item* tlist_ptr;
+
+
+  /* printf("[f] list: %ld, *list: %ld \n", list_ptr, *list_ptr); */
+  tlist_ptr = *list_ptr;        /* use temp list ptr to walk linked list */
+
+  while (tlist_ptr )                    /* Walk linked list of file ids/vals */
+  {
+    if (exoid == tlist_ptr->exo_id )    /* linear search for exodus file id */
+      break;                            /* Quit if found */
+    tlist_ptr = tlist_ptr->next;        /* Loop back if not */
+  }
+
+  if (!tlist_ptr )                      /* ptr NULL? */
+  {                                     /*  yes, new file id */
+    /* allocate space for new structure record */
+    tlist_ptr = (struct list_item*) calloc(1,sizeof(struct list_item));
+    tlist_ptr->exo_id = exoid;          /* insert file id */
+    tlist_ptr->next = *list_ptr;        /* insert into head of list */
+    *list_ptr = tlist_ptr;              /* fix up new head of list  */
+  }
+
+/*  printf("[f] tlist: %ld *tlist: %ld **tlist: %ld\n",
+          tlist_ptr,*tlist_ptr,(*tlist_ptr)->value, (*tlist_ptr)->next); */
+
+  
+  return(tlist_ptr->value++);
+
+}
+
+/*****************************************************************************
+*
+* ex_get_file_item - increment file item
+*
+*****************************************************************************/
+
+
+/*! this routine accesses a structure to track and increment a counter for
+ * each open exodus file.  it is designed to be used by the routines
+ * ex_put_elem_block(), and ex_put_set_param(),
+ * to get the number of element blocks, or a type of set,
+ * respectively, for an open exodus II file.
+ *
+ * The list structure is used as follows:
+ *
+ *   ptr -----------> list item structure
+ *                    -------------------
+ *                    exodus file id
+ *                    item value (int)
+ *                    ptr to next (NULL if last)
+ *
+ *
+ * NOTE: since netCDF reuses its file ids, and a user may open and close any
+ *       number of files in one application, items must be taken out of the
+ *       linked lists in each of the above routines.  these should be called
+ *       after ncclose().
+ */
+
+int ex_get_file_item( int exoid,                /* file id */
+                      struct list_item **list_ptr)/* ptr to ptr to list_item */
+
+{
+  struct list_item* tlist_ptr;
+
+  /* printf("[f] list: %ld, *list: %ld \n", list_ptr, *list_ptr); */
+  tlist_ptr = *list_ptr;        /* use temp list ptr to walk linked list */
+
+
+  while (tlist_ptr )                    /* Walk linked list of file ids/vals */
+  {
+    if (exoid == tlist_ptr->exo_id )    /* linear search for exodus file id */
+      break;                            /* Quit if found */
+    tlist_ptr = tlist_ptr->next;        /* Loop back if not */
+  }
+
+  if (!tlist_ptr )                      /* ptr NULL? */
+  {                                     /*  yes, Error: file id not found*/
+    return(-1);
+  }
+
+/*  printf("[f] list: %ld *list: %ld **list: %ld\n",
+          list_ptr,*list_ptr,(*list_ptr)->value, (*list_ptr)->next); */
+
+  return(tlist_ptr->value);
+}
+
+/*****************************************************************************
+*
+* ex_rm_file_item - remove file item
+*
+*****************************************************************************/
+
+
+/*! this routine removes a structure to track and increment a counter for
+ * each open exodus file.
+ *
+ * The list structure is used as follows:
+ *
+ *   ptr -----------> list item structure
+ *                    -------------------
+ *                    exodus file id
+ *                    item value (int)
+ *                    ptr to next (NULL if last)
+ *
+ *
+ * NOTE: since netCDF reuses its file ids, and a user may open and close any
+ *       number of files in one application, items must be taken out of the
+ *       linked lists in each of the above routines.  these should be called
+ *       after ncclose().
+ */
+
+void ex_rm_file_item( int exoid,                /* file id */
+                      struct list_item **list_ptr)/* ptr to ptr to list_item */
+
+{
+  struct list_item *last_head_list_ptr, *tlist_ptr;
+
+  /* printf("[f] list: %ld, *list: %ld \n", list_ptr, *list_ptr); */
+  tlist_ptr = *list_ptr;
+  last_head_list_ptr = *list_ptr; /* save last head pointer */
+  /* printf("[f] last head list: %ld\n",last_head_list_ptr); */
+
+  while (tlist_ptr )                    /* Walk linked list of file ids/vals */
+  {
+    if (exoid == tlist_ptr->exo_id )    /* linear search for exodus file id */
+    {
+      if (tlist_ptr == *list_ptr)       /* Are we at the head of the list? */
+        *list_ptr = (*list_ptr)->next;  /*   yes, reset ptr to head of list */
+      else                              /*   no, remove this record from chain*/
+        last_head_list_ptr->next=tlist_ptr->next;
+      free(tlist_ptr);                  /* free up memory */
+      break;                            /* Quit if found */
+    }
+    last_head_list_ptr = tlist_ptr;     /* save last head pointer */
+    tlist_ptr = tlist_ptr->next;        /* Loop back if not */
+  }
+
+/*  printf("[f] list: %ld *list: %ld **list: %ld\n",
+          list_ptr,*list_ptr,(*list_ptr)->value, (*list_ptr)->next); */
+
+}
+
+/*****************************************************************************
+*
+* ex_get_num_props - get number of properties
+*
+*****************************************************************************/
+int ex_get_num_props (int exoid, ex_entity_type obj_type)
+{
+  int cntr, varid;
+  char var_name[MAX_VAR_NAME_LENGTH+1];
+  char  errmsg[MAX_ERR_LENGTH];
+
+  cntr = 0;
+
+  /* loop until there is not a property variable defined; the name of */
+  /* the variables begin with an increment of 1 ("xx_prop1") so use cntr+1 */
+
+  while (EX_TRUE)
+    {
+      switch (obj_type)
+	{
+	case EX_ELEM_BLOCK:
+	  strcpy (var_name, VAR_EB_PROP(cntr+1));
+	  break;
+	case EX_EDGE_BLOCK:
+	  strcpy (var_name, VAR_ED_PROP(cntr+1));
+	  break;
+	case EX_FACE_BLOCK:
+	  strcpy (var_name, VAR_FA_PROP(cntr+1));
+	  break;
+	case EX_NODE_SET:
+	  strcpy (var_name, VAR_NS_PROP(cntr+1));
+	  break;
+	case EX_EDGE_SET:
+	  strcpy (var_name, VAR_ES_PROP(cntr+1));
+	  break;
+	case EX_FACE_SET:
+	  strcpy (var_name, VAR_FS_PROP(cntr+1));
+	  break;
+	case EX_SIDE_SET:
+	  strcpy (var_name, VAR_SS_PROP(cntr+1));
+	  break;
+	case EX_ELEM_SET:
+	  strcpy (var_name, VAR_ELS_PROP(cntr+1));
+	  break;
+	case EX_ELEM_MAP:
+	  strcpy (var_name, VAR_EM_PROP(cntr+1));
+	  break;
+	case EX_FACE_MAP:
+	  strcpy (var_name, VAR_FAM_PROP(cntr+1));
+	  break;
+	case EX_EDGE_MAP:
+	  strcpy (var_name, VAR_EDM_PROP(cntr+1));
+	  break;
+	case EX_NODE_MAP:
+	  strcpy (var_name, VAR_NM_PROP(cntr+1));
+	  break;
+	default:
+	  exerrval = EX_BADPARAM;
+	  sprintf(errmsg, "Error: object type %d not supported; file id %d",
+		  obj_type, exoid);
+	  ex_err("ex_get_prop_names",errmsg,exerrval);
+	  return(EX_FATAL);
+	}
+
+      if (nc_inq_varid (exoid, var_name, &varid) != NC_NOERR) {
+	/*   no variable with this name; return cntr which is now the number of */
+	/*   properties for this type of entity */
+	return (cntr);
+      }
+      cntr++;
+    }
+}
+
+int ex_get_cpu_ws(void)
+{
+  return(sizeof(float));
+}
+
+
+/* swap - interchange v[i] and v[j] */
+static void ex_swap (int v[], int i, int j)
+{
+  int temp;
+
+  temp = v[i];
+  v[i] = v[j];
+  v[j] = temp;
+}
+
+static void ex_swap64 (int64_t v[], int64_t i, int64_t j)
+{
+  int64_t temp;
+
+  temp = v[i];
+  v[i] = v[j];
+  v[j] = temp;
+}
+
+/*!
+ * The following 'indexed qsort' routine is modified from Sedgewicks
+ * algorithm It selects the pivot based on the median of the left,
+ * right, and center values to try to avoid degenerate cases ocurring
+ * when a single value is chosen.  It performs a quicksort on
+ * intervals down to the EX_QSORT_CUTOFF size and then performs a final
+ * insertion sort on the almost sorted final array.  Based on data in
+ * Sedgewick, the EX_QSORT_CUTOFF value should be between 5 and 20.
+ *
+ * See Sedgewick for further details
+ * Define DEBUG_QSORT at the top of this file and recompile to compile
+ * in code that verifies that the array is sorted.
+ *
+ * NOTE: The 'int' implementation below assumes that *both* the items
+ *       being sorted and the *number* of items being sorted are both 
+ *       representable as 'int'.
+ */
+
+#define EX_QSORT_CUTOFF 12
+
+static int ex_int_median3(int v[], int iv[], int64_t left, int64_t right)
+{
+  int64_t center;
+  center = (left + right) / 2;
+
+  if (v[iv[left]] > v[iv[center]])
+    ex_swap(iv, left, center);
+  if (v[iv[left]] > v[iv[right]])
+    ex_swap(iv, left, right);
+  if (v[iv[center]] > v[iv[right]])
+    ex_swap(iv, center, right);
+
+  ex_swap(iv, center, right-1);
+  return iv[right-1];
+}
+
+static int64_t ex_int_median3_64(int64_t v[], int64_t iv[], int64_t left, int64_t right)
+{
+  int64_t center;
+  center = (left + right) / 2;
+
+  if (v[iv[left]] > v[iv[center]])
+    ex_swap64(iv, left, center);
+  if (v[iv[left]] > v[iv[right]])
+    ex_swap64(iv, left, right);
+  if (v[iv[center]] > v[iv[right]])
+    ex_swap64(iv, center, right);
+
+  ex_swap64(iv, center, right-1);
+  return iv[right-1];
+}
+
+static void ex_int_iqsort(int v[], int iv[], int left, int right)
+{
+  int pivot;
+  int i, j;
+  
+  if (left + EX_QSORT_CUTOFF <= right) {
+    pivot = ex_int_median3(v, iv, left, right);
+    i = left;
+    j = right - 1;
+
+    for ( ; ; ) {
+      while (v[iv[++i]] < v[pivot]);
+      while (v[iv[--j]] > v[pivot]);
+      if (i < j) {
+        ex_swap(iv, i, j);
+      } else {
+        break;
+      }
+    }
+
+    ex_swap(iv, i, right-1);
+    ex_int_iqsort(v, iv, left, i-1);
+    ex_int_iqsort(v, iv, i+1, right);
+  }
+}
+
+static void ex_int_iqsort64(int64_t v[], int64_t iv[], int64_t left, int64_t right)
+{
+  int64_t pivot;
+  int64_t i, j;
+  
+  if (left + EX_QSORT_CUTOFF <= right) {
+    pivot = ex_int_median3_64(v, iv, left, right);
+    i = left;
+    j = right - 1;
+
+    for ( ; ; ) {
+      while (v[iv[++i]] < v[pivot]);
+      while (v[iv[--j]] > v[pivot]);
+      if (i < j) {
+        ex_swap64(iv, i, j);
+      } else {
+        break;
+      }
+    }
+
+    ex_swap64(iv, i, right-1);
+    ex_int_iqsort64(v, iv, left, i-1);
+    ex_int_iqsort64(v, iv, i+1, right);
+  }
+}
+
+static void ex_int_iisort(int v[], int iv[], int N)
+{
+  int i,j;
+  int ndx = 0;
+  int small;
+  int tmp;
+  
+  small = v[iv[0]];
+  for (i = 1; i < N; i++) {
+    if (v[iv[i]] < small) {
+      small = v[iv[i]];
+      ndx = i;
+    }
+  }
+  /* Put smallest value in slot 0 */
+  ex_swap(iv, 0, ndx);
+
+  for (i=1; i <N; i++) {
+    tmp = iv[i];
+    for (j=i; v[tmp] < v[iv[j-1]]; j--) {
+      iv[j] = iv[j-1];
+    }
+    iv[j] = tmp;
+  }
+}
+
+static void ex_int_iisort64(int64_t v[], int64_t iv[], int64_t N)
+{
+  int64_t i,j;
+  int64_t ndx = 0;
+  int64_t small;
+  int64_t tmp;
+  
+  small = v[iv[0]];
+  for (i = 1; i < N; i++) {
+    if (v[iv[i]] < small) {
+      small = v[iv[i]];
+      ndx = i;
+    }
+  }
+  /* Put smallest value in slot 0 */
+  ex_swap64(iv, 0, ndx);
+
+  for (i=1; i <N; i++) {
+    tmp = iv[i];
+    for (j=i; v[tmp] < v[iv[j-1]]; j--) {
+      iv[j] = iv[j-1];
+    }
+    iv[j] = tmp;
+  }
+}
+
+void ex_iqsort(int v[], int iv[], int N)
+{
+  ex_int_iqsort(v, iv, 0, N-1);
+  ex_int_iisort(v, iv, N);
+
+#if defined(DEBUG_QSORT)
+  fprintf(stderr, "Checking sort of %d values\n", N+1);
+  int i;
+  for (i=1; i < N; i++) {
+    assert(v[iv[i-1]] <= v[iv[i]]);
+  }
+#endif
+}
+
+void ex_iqsort64(int64_t v[], int64_t iv[], int64_t N)
+{
+  ex_int_iqsort64(v, iv, 0, N-1);
+  ex_int_iisort64(v, iv, N);
+
+#if defined(DEBUG_QSORT)
+  fprintf(stderr, "Checking sort of %d values\n", N+1);
+  int i;
+  for (i=1; i < N; i++) {
+    assert(v[iv[i-1]] <= v[iv[i]]);
+  }
+#endif
+}
+
+/*!
+ * Determine whether the new large model storage is being used in this
+ * file, or old method. Basically, the difference is whether the
+ * coordinates and nodal variables are stored in a blob (xyz
+ * components together) or as a variable per component per
+ * nodal_variable.
+ */
+int ex_large_model(int exoid)
+{
+  static int message_output = EX_FALSE;
+  if (exoid < 0) {
+    /* If exoid not specified, then query is to see if user specified
+     * the large model via an environment variable
+     */
+    char *option = getenv("EXODUS_LARGE_MODEL");
+    if (option != NULL) {
+      if (option[0] == 'n' || option[0] == 'N') {
+	if (!message_output) {
+	  fprintf(stderr,
+		  "EXODUSII: Small model size selected via EXODUS_LARGE_MODEL environment variable\n");
+	  message_output = EX_TRUE;
+	}
+        return 0;
+      } else {
+	if (!message_output) {
+	  fprintf(stderr,
+		  "EXODUSII: Large model size selected via EXODUS_LARGE_MODEL environment variable\n");
+	  message_output = EX_TRUE;
+	}
+        return 1;
+      }
+    } else {
+      return EXODUS_DEFAULT_SIZE; /* Specified in exodusII_int.h */
+    }
+
+  } else {
+    /* See if the ATT_FILESIZE attribute is defined in the file */
+    int file_size = 0; 
+    if (nc_get_att_int(exoid, NC_GLOBAL, ATT_FILESIZE, &file_size) != NC_NOERR) {
+      /* Variable not found; default is 0 */
+      file_size = 0;
+    }
+    return file_size;
+  }
+}
+  
+int ex_get_dimension(int exoid, const char* DIMENSION, const char *label,
+                     size_t *count, int *dimid, const char *routine)
+{
+  char errmsg[MAX_ERR_LENGTH];
+  int status;
+  
+  *count = 0;
+  *dimid = -1;
+  
+  if ((status = nc_inq_dimid(exoid, DIMENSION, dimid)) != NC_NOERR) {
+    exerrval = status;
+    if (routine != NULL) {
+      if (status == NC_EBADDIM) {
+        sprintf(errmsg,
+                "Warning: no %s defined in file id %d",
+                label, exoid);
+        ex_err(routine, errmsg,exerrval);
+        
+      } else {
+        sprintf(errmsg,
+                "Error: failed to locate number of %s in file id %d",
+                label, exoid);
+        ex_err(routine,errmsg,exerrval);
+      }
+    }
+    return status;
+  }
+
+  if ((status = nc_inq_dimlen (exoid, *dimid, count)) != NC_NOERR) {
+    exerrval = status;
+    if (routine != NULL) {
+      sprintf(errmsg,
+              "Error: failed to get number of %s in file id %d",
+              label, exoid);
+      ex_err(routine,errmsg,exerrval);
+      return -1;
+    }
+  }
+  return status;
+}
+
+/* Deprecated. do not use */
+size_t ex_header_size(int exoid)
+{
+  return 0;
+}
+
+/* type = 1 for integer, 2 for real, 3 for character */
+void ex_compress_variable(int exoid, int varid, int type)
+{
+#if !defined(NOT_NETCDF4)
+
+  struct ex_file_item* file = ex_find_file_item(exoid);
+
+  if (!file ) {
+    char errmsg[MAX_ERR_LENGTH];
+    exerrval = EX_BADFILEID;
+    sprintf(errmsg,"Error: unknown file id %d for ex_compress_variable().",exoid);
+    ex_err("ex_compress_variable",errmsg,exerrval);
+  }
+  else {
+    int deflate_level = file->compression_level;
+    int compress = 1;
+    int shuffle = file->shuffle;
+#if 0
+    if (type == 2)
+      shuffle = 0;
+#endif
+    if (deflate_level > 0 && (file->file_type == 2 || file->file_type == 3)) {
+      nc_def_var_deflate(exoid, varid, shuffle, compress, deflate_level);
+    }
+#if 0
+    if (type != 3) {
+      nc_var_par_access(exoid, varid, NC_COLLECTIVE);
+    }
+#endif
+  }
+#endif
+}
+
+void *ex_safe_free(void *array)
+{
+  if (array != 0) free(array);
+  return 0;
+}
+
diff --git a/exodus/cbind/test/CMakeLists.txt b/exodus/cbind/test/CMakeLists.txt
new file mode 100644
index 0000000..4b8200c
--- /dev/null
+++ b/exodus/cbind/test/CMakeLists.txt
@@ -0,0 +1,85 @@
+ADD_DEFINITIONS(-DUSING_CMAKE)
+
+SET( cbind_TEST_SRCS
+  CreateEdgeFace.c
+  ReadEdgeFace.c
+)
+
+# Always report error/warning messages during testing:
+# The ex_opts call precipitates the EXTRA_INCLUDE below.
+SET( CMAKE_TESTDRIVER_BEFORE_TESTMAIN
+  "  ex_opts( EX_VERBOSE );\n"
+)
+CREATE_TEST_SOURCELIST( ExoIICTests
+  ExoIICTests.cxx
+  ${cbind_TEST_SRCS}
+  EXTRA_INCLUDE exodusII_test.h
+  )
+
+ADD_EXECUTABLE( ExoIICTests ${ExoIICTests} )
+TARGET_LINK_LIBRARIES( ExoIICTests exodus )
+
+SET( TestsToRun ${ExoIICTests} )
+REMOVE( TestsToRun ExoIICTests.cxx )
+
+FOREACH( test ${TestsToRun} )
+  GET_FILENAME_COMPONENT(TName ${test} NAME_WE)
+  ADD_TEST( ${TName} ${EXECUTABLE_OUTPUT_PATH}/ExoIICTests ${TName} )
+ENDFOREACH( test )
+ADD_TEST( CreateEdgeFaceWithConcats ${EXECUTABLE_OUTPUT_PATH}/ExoIICTests CreateEdgeFace -pcab -pcset -pvpax )
+ADD_TEST( ReadEdgeFaceWithConcats ${EXECUTABLE_OUTPUT_PATH}/ExoIICTests ReadEdgeFace )
+
+# ===============================================
+
+SET( cbind_OLDTESTS
+  testwt
+  testwtd
+  testrd
+  testrd1
+  testrdd
+  testwt1
+  testwt2
+  testwtm
+  testwt_ss
+  testwt_nossnsdf
+  testrd_ss
+  testrdwt
+  testcp
+  testcp_ln
+  testcp_nl
+  testcpd
+  testwt_clb
+  testwt_nc
+  testrd_nc
+  testwt-zeroe
+  testwt-zeron
+  testwt-one-attrib
+  testwt-partial
+  testrd-nsided
+  testwt-nsided
+  testrd-nfaced
+  testwt-nfaced
+  create_mesh
+  rd_wt_mesh
+  test_nemesis
+  testwt-long-name
+  testrd-long-name)
+
+CONFIGURE_FILE(
+  ${CMAKE_CURRENT_SOURCE_DIR}/testall.in
+  ${CMAKE_CURRENT_BINARY_DIR}/testall
+  @ONLY
+)
+
+FOREACH ( testName ${cbind_OLDTESTS} )
+  ADD_EXECUTABLE( ${testName} ${testName}.c )
+  TARGET_LINK_LIBRARIES( ${testName} exodus )
+ENDFOREACH ( testName )
+
+#SET( EXECUTABLE_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} )
+ADD_CUSTOM_TARGET( check
+  COMMAND /bin/csh ${CMAKE_CURRENT_BINARY_DIR}/testall
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+  DEPENDS ${cbind_OLDTESTS}
+)
+
diff --git a/exodus/cbind/test/CreateEdgeFace.c b/exodus/cbind/test/CreateEdgeFace.c
new file mode 100644
index 0000000..e583916
--- /dev/null
+++ b/exodus/cbind/test/CreateEdgeFace.c
@@ -0,0 +1,655 @@
+/*
+ * Copyright (c) 2014, Sandia Corporation.
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include "exodusII.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#define EX_TEST_FILENAME "edgeFace.exo"
+
+/* ======== Coordinates and connectivity ========= */
+double coordsX[] = {
+   0.,  0.,  0.,  0., 
+   3.,  3.,  3.,  3.,
+  -3., -3., -3., -3.
+};
+
+double coordsY[] = {
+  -1.,  1.,  1., -1., 
+  -3.,  3.,  3., -3.,
+  -3.,  3.,  3., -3.
+};
+
+double coordsZ[] = {
+  -1., -1.,  1.,  1., 
+  -3., -3.,  3.,  3.,
+  -3., -3.,  3.,  3.
+};
+
+const char* coordsNames[] = { "X", "Y", "Z" };
+
+int conn1[] = {
+   1,  2,  3,  4,  5,  6,  7,  8,
+   9, 10, 11, 12,  1,  2,  3,  4
+};
+
+int conn2[] = { 1, 2, 3, 5 };
+
+int econn1[] = {
+   1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+  13, 14, 15, 16,  1,  2,  3,  4, 17, 18, 19, 20
+};
+
+int fconn1[] = {
+   4,  5,  7,  6,  3,  2,
+   8,  9, 11, 10,  1,  3
+};
+
+int ebconn1[] = {
+   1,  2,
+   2,  3,
+   3,  4,
+   4,  1,
+   5,  6,
+   6,  7,
+   7,  8,
+   8,  5,
+   1,  5,
+   2,  6,
+   4,  8,
+   3,  7,
+   9, 10,
+  10, 11,
+  11, 12,
+  12,  9,
+   9,  1,
+  10,  2,
+  12,  4,
+  11,  3
+};
+
+int fbconn1[] = {
+  12, 11, 10,  9,
+   5,  6,  7,  8
+};
+
+int fbconn2[] = {
+   1,  2,  3,  4
+};
+
+int fbconn3[] = {
+   1,  5,  6,  2,
+   3,  7,  8,  4,
+   2,  6,  7,  3,
+   4,  8,  5,  1,
+   9,  1,  2, 10,
+  11,  3,  4, 12,
+  10,  2,  3, 11,
+  12,  4,  1,  9
+};
+
+int nmap1[] = {
+  12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
+};
+
+int edmap1[] = {
+  1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
+};
+
+int famap1[] = {
+  2, 1, 4, 3, 6, 5, 7, 8, 9, 10, 11
+};
+
+int emap1[] = {
+  1, 2
+};
+
+const char* eblk_names[] = {
+  "Eli_WALLACH",
+  "Angelo_NOVI"
+};
+const char* edblk_names[] = { "Aldo_GIUFFRE" };
+const char* fablk_names[] = { 
+  "Livio_LORENZON",
+  "Claudio_SCARCHILLI",
+  "John_BARTHA"
+};
+
+const char* nmap_names[] = { "Luigi_PISTILLI" };
+const char* edmap_names[] = { "Antonio_CASALE" };
+const char* famap_names[] = { "Sandro_SCARCHILLI" };
+const char* emap_names[] = { "Benito_STEFANELLI" };
+
+/* ======== Sets ========= */
+int nset_nodes[] = {
+  5, 6, 9
+};
+
+int eset_edges[] = {
+  1, 2, 4, 15, 19, 20
+};
+
+int eset_orient[] = {
+  +1, +1, +1, +1, +1, -1
+};
+
+double eset_df[] = {
+  2., 2., 0.5, 0.5, 1., 1.
+};
+
+int fset_faces[] = {
+  3, 9
+};
+
+int fset_orient[] = {
+  +1, -1
+};
+
+int sset_elems[] = {
+  1, 1, 1, 2, 2
+};
+
+int sset_sides[] = {
+  1, 3, 5, 2, 4
+};
+
+int elset_elems[] = {
+  1,
+  2
+};
+
+const char* elset_names[] = {
+  "Clint_EASTWOOD",
+  "Lee_VAN_CLEEF"
+};
+
+const char* nset_names[] = { "Ennio_MORRICONE" };
+const char* eset_names[] = { "Rada_RASSIMOV" };
+const char* fset_names[] = { "Enzo_PETITO" };
+const char* sset_names[] = { "Luciano_VINCENZONI" };
+
+/* ======== Attributes ========= */
+const char* edge_attr_names1[] = {"Sergio_LEONE"};
+
+const char* face_attr_names1[] = {"GOOD"};
+const char* face_attr_names2[] = {"BAD"};
+const char* face_attr_names3[] = {"UGLY"};
+
+const char* elem_attr_names1[] = {
+  "SPAGHETTI",
+  "WESTERN"
+};
+
+double edge_attr_values1[] = {
+   1.,  2.,  3.,  5.,  7., 11., 13., 17., 19., 23.,
+  29., 31., 37., 41., 43., 47., 53., 59., 61., 67.
+};
+
+double face_attr_values1[] = {
+  71., 73.
+};
+
+double face_attr_values2[] = {
+  79.
+};
+
+double face_attr_values3[] = {
+  83., 89., 97., 101., 103., 107., 109., 113.
+};
+
+double elem_attr_values1[] = {
+  127., 101.,
+  137., 139.
+};
+
+/* ======== Results variables ========= */
+/*           (2 time steps) */
+
+double vals_glo_var[2][2] = {
+  { 36., 37. },
+  { 42., 43. }
+};
+
+double vals_nod_var[2][12] = {
+  { 0.1, 0.8, 0.0, 0.4, 0.3, 0.9, 0.8, 0.5, 0.3, 0.7, 0.4, 0.6 },
+  { 0.7, 0.5, 0.3, 0.5, 0.2, 0.7, 0.9, 0.8, 0.0, 0.2, 0.3, 0.5 }
+} ;
+
+
+double vals_edge_var1eb1[2][20] = {
+  { 20., 19., 18., 17., 16., 15., 14., 13., 12., 11., 10., 9., 8., 7., 6., 5., 4., 3., 2., 1. },
+  { 21., 20., 19., 18., 17., 16., 15., 14., 13., 12., 11., 10., 9., 8., 7., 6., 5., 4., 3., 2. }
+};
+
+double vals_edge_var2eb1[2][20] = {
+  { 1., 1., 0., 0., 1., 1., 2., 0., 2., 0., 1., 1., 1., 1., 0., 0., 2., 2., 2., 2. },
+  { 1., 1., 0., 0., 1., 1., 2., 0., 2., 0., 1., 1., 1., 1., 0., 0., 2., 2., 2., 2. }
+};
+
+double vals_face_var1fb1[2][2] = {
+  { 0, 1 },
+  { 2, 0 }
+};
+
+double vals_face_var1fb3[2][8] = {
+  { 1, 0, 2, 0, 3, 0, 4, 0 },
+  { 0, 1, 0, 2, 0, 3, 0, 4 }
+};
+
+double vals_elem_var1eb1[2][2] = {
+  { 8,  8 },
+  { 0, -8 }
+};
+
+double vals_fset_var1fs1[2][2] = {
+  { 1., 3. },
+  { 9., 27. }
+};
+
+#define EXCHECK(funcall,errmsg)\
+  if ( (funcall) < 0 ) \
+    { \
+      fprintf( stderr, errmsg ); \
+      return 1; \
+    }
+
+int ex_have_arg( int argc, char* argv[], const char* aname )
+{
+  int i;
+  for ( i = 0; i < argc; ++i )
+    if ( ! strcmp( argv[i], aname ) )
+      return 1;
+  return 0;
+}
+
+int cCreateEdgeFace( int argc, char* argv[] )
+{
+  int exoid;
+  int appWordSize = 8;
+  int diskWordSize = 8;
+  /*  int concatBlocks = ex_have_arg( argc, argv, "-pcab" ); */
+  int concatSets   = ex_have_arg( argc, argv, "-pcset" );
+  int concatResult = ex_have_arg( argc, argv, "-pvpax" );
+  double t;
+
+  ex_init_params modelParams = {
+    "CreateEdgeFace Test", /* title */
+    3,  /* num_dim */
+    12, /* num_nodes */
+    20, /* num_edge */
+    1,  /* num_edge_blk */
+    11, /* num_face */
+    3,  /* num_face_blk */
+    3,  /* num_elem */
+    2,  /* num_elem_blk */
+    1,  /* num_node_sets */
+    1,  /* num_edge_sets */
+    1,  /* num_face_sets */
+    1,  /* num_side_sets */
+    2,  /* num_elem_sets */
+    1,  /* num_node_map */
+    1,  /* num_edge_map */
+    1,  /* num_face_map */
+    1,  /* num_elem_map */
+  };
+
+  ex_block edgeBlocks[1];
+  ex_block faceBlocks[3];
+  ex_block elemBlocks[2];
+
+  ex_var_params varParams;
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  edgeBlocks[0].type = EX_EDGE_BLOCK;
+  edgeBlocks[0].id = 100;
+  edgeBlocks[0].num_entry = 20;
+  edgeBlocks[0].num_nodes_per_entry = 2;
+  edgeBlocks[0].num_attribute = 1;
+  strcpy(edgeBlocks[0].topology, "EDGE2");
+  
+  faceBlocks[0].type = EX_FACE_BLOCK;
+  faceBlocks[0].id = 500;
+  faceBlocks[0].num_entry = 2;
+  faceBlocks[0].num_nodes_per_entry = 4;
+  faceBlocks[0].num_attribute = 1;
+  strcpy(faceBlocks[0].topology, "QUAD4");
+  
+  faceBlocks[1].type = EX_FACE_BLOCK;
+  faceBlocks[1].id = 600;
+  faceBlocks[1].num_entry = 1;
+  faceBlocks[1].num_nodes_per_entry = 4;
+  faceBlocks[1].num_attribute = 1;
+  strcpy(faceBlocks[1].topology, "QUAD4");
+  
+  faceBlocks[2].type = EX_FACE_BLOCK;
+  faceBlocks[2].id = 700;
+  faceBlocks[2].num_entry = 8;
+  faceBlocks[2].num_nodes_per_entry = 4;
+  faceBlocks[2].num_attribute = 1;
+  strcpy(faceBlocks[2].topology, "QUAD4");
+  
+  elemBlocks[0].type = EX_ELEM_BLOCK;
+  elemBlocks[0].id = 200;
+  elemBlocks[0].num_entry = 2;
+  elemBlocks[0].num_nodes_per_entry = 8;
+  elemBlocks[0].num_edges_per_entry = 12;
+  elemBlocks[0].num_faces_per_entry = 6;
+  elemBlocks[0].num_attribute = 2;
+  strcpy(elemBlocks[0].topology, "HEX8");
+  
+  elemBlocks[1].type = EX_ELEM_BLOCK;
+  elemBlocks[1].id = 201;
+  elemBlocks[1].num_entry = 1;
+  elemBlocks[1].num_nodes_per_entry = 4;
+  elemBlocks[1].num_edges_per_entry = 0;
+  elemBlocks[1].num_faces_per_entry = 0;
+  elemBlocks[1].num_attribute = 0;
+  strcpy(elemBlocks[1].topology, "TET4");
+  
+  varParams.edge_var_tab  = (int*)malloc(2 * sizeof(int));
+  varParams.face_var_tab  = (int*)malloc(3 * sizeof(int));
+  varParams.elem_var_tab  = (int*)malloc(2 * sizeof(int));
+  varParams.nset_var_tab  = (int*)0;
+  varParams.eset_var_tab  = (int*)0;
+  varParams.fset_var_tab  = (int*)malloc(1 * sizeof(int));
+  varParams.sset_var_tab  = (int*)0;
+  varParams.elset_var_tab = (int*)0;
+
+  varParams.num_glob        = 2;
+  varParams.num_node        = 1;
+  varParams.num_edge        = 2;
+  varParams.edge_var_tab[0] = 1;
+  varParams.edge_var_tab[1] = 1;
+  varParams.num_face        = 1;
+  varParams.face_var_tab[0] = 1;
+  varParams.face_var_tab[1] = 1;
+  varParams.face_var_tab[2] = 1;
+  varParams.num_elem        = 1;
+  varParams.elem_var_tab[0] = 1;
+  varParams.elem_var_tab[1] = 0;
+  varParams.num_nset        = 0;
+  varParams.num_eset        = 0;;
+  varParams.num_fset        = 1;
+  varParams.fset_var_tab[0] = 1;
+  varParams.num_sset        = 0;
+  varParams.num_elset       = 0;
+
+  exoid = ex_create( EX_TEST_FILENAME, EX_CLOBBER, &appWordSize, &diskWordSize );
+  if ( exoid <= 0 )
+    {
+      fprintf( stderr, "Unable to open \"%s\" for writing.\n", EX_TEST_FILENAME );
+      return 1;
+    }
+
+  EXCHECK( ex_put_init_ext( exoid, &modelParams ),
+	   "Unable to initialize database.\n" );
+
+  {
+    int blk;
+    for ( blk = 0; blk < modelParams.num_edge_blk; ++blk ) {
+      EXCHECK( ex_put_block_param( exoid, edgeBlocks[blk]), "Unable to write edge block" );
+    }
+    for ( blk = 0; blk < modelParams.num_face_blk; ++blk ) {
+      EXCHECK( ex_put_block_param( exoid, faceBlocks[blk]), "Unable to write face block" );
+    }
+    for ( blk = 0; blk < modelParams.num_elem_blk; ++blk ) {
+      EXCHECK( ex_put_block_param( exoid, elemBlocks[blk]), "Unable to write elem block" );
+    }
+  }
+
+  EXCHECK( ex_put_coord( exoid, (void*)coordsX, (void*)coordsY, (void*)coordsZ ),
+	   "Unable to write coordinates.\n" );
+
+  EXCHECK( ex_put_coord_names( exoid, (char**)coordsNames ),
+	   "Unable to write coordinate names.\n" );
+
+  /*                  =============== Connectivity  ================== */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_conn( exoid, EX_EDGE_BLOCK, edgeBlocks[0].id, ebconn1, 0, 0 ),
+	   "Unable to write edge block connectivity.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, faceBlocks[0].id, fbconn1, 0, 0 ),
+	   "Unable to write face block 1 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, faceBlocks[1].id, fbconn2, 0, 0 ),
+	   "Unable to write face block 2 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, faceBlocks[2].id, fbconn3, 0, 0 ),
+	   "Unable to write face block 3 connectivity.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, elemBlocks[0].id, conn1, econn1, fconn1 ),
+	   "Unable to write elem block 1 connectivity.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, elemBlocks[1].id, conn2, 0, 0 ),
+	   "Unable to write elem block 2 connectivity.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_names( exoid, EX_EDGE_BLOCK, (char**)edblk_names ), "Unable to write edge block names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_FACE_BLOCK, (char**)fablk_names ), "Unable to write face block names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_ELEM_BLOCK, (char**) eblk_names ), "Unable to write element block names.\n" );
+
+  /*                  =============== Number Maps   ================== */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_num_map( exoid, EX_NODE_MAP, 300, nmap1 ),  "Unable to write node map.\n" );
+  EXCHECK( ex_put_num_map( exoid, EX_EDGE_MAP, 800, edmap1 ), "Unable to write edge map.\n" );
+  EXCHECK( ex_put_num_map( exoid, EX_FACE_MAP, 900, famap1 ), "Unable to write face map.\n" );
+  EXCHECK( ex_put_num_map( exoid, EX_ELEM_MAP, 400, emap1 ),  "Unable to write element map.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_names( exoid, EX_NODE_MAP, (char**) nmap_names ), "Unable to write node map names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_EDGE_MAP, (char**)edmap_names ), "Unable to write edge map names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_FACE_MAP, (char**)famap_names ), "Unable to write face map names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_ELEM_MAP, (char**) emap_names ), "Unable to write element map names.\n" );
+
+  /*                 =============== Attribute names ================ */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_attr_names( exoid, EX_EDGE_BLOCK, edgeBlocks[0].id, (char**)edge_attr_names1 ),
+	   "Unable to write edge block 1 attribute names.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, faceBlocks[0].id, (char**)face_attr_names1 ),
+	   "Unable to write face block 1 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, faceBlocks[1].id, (char**)face_attr_names2 ),
+	   "Unable to write face block 1 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, faceBlocks[2].id, (char**)face_attr_names3 ),
+	   "Unable to write face block 1 attribute names.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_attr_names( exoid, EX_ELEM_BLOCK, elemBlocks[0].id, (char**)elem_attr_names1 ),
+	   "Unable to write elem block 1 attribute names.\n" );
+
+  /*                  =============== Attribute values =============== */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_attr( exoid, EX_EDGE_BLOCK, edgeBlocks[0].id, edge_attr_values1 ),
+	   "Unable to write edge block 1 attribute values.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, faceBlocks[0].id, face_attr_values1 ),
+	   "Unable to write face block 1 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, faceBlocks[1].id, face_attr_values2 ),
+	   "Unable to write face block 1 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, faceBlocks[2].id, face_attr_values3 ),
+	   "Unable to write face block 1 attribute values.\n" );
+
+  /* *** NEW API *** */
+  EXCHECK( ex_put_attr( exoid, EX_ELEM_BLOCK, elemBlocks[0].id, elem_attr_values1 ),
+	   "Unable to write elem block 1 attribute values.\n" );
+
+  /*                  =============== Set parameters ================= */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_names( exoid, EX_NODE_SET,  (char**)nset_names ), "Unable to write node set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_EDGE_SET,  (char**)eset_names ), "Unable to write edge set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_FACE_SET,  (char**)fset_names ), "Unable to write face set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_SIDE_SET,  (char**)sset_names ), "Unable to write side set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_ELEM_SET, (char**)elset_names ), "Unable to write element set names.\n" );
+
+  {
+    ex_set allSets[1+1+1+1+2];
+
+    ex_set *nodeSets = &allSets[0];
+    ex_set *edgeSets = &allSets[1];
+    ex_set *faceSets = &allSets[2];
+    ex_set *sideSets = &allSets[3];
+    ex_set *elemSets = &allSets[4];
+    
+    nodeSets[0].type = EX_NODE_SET;
+    nodeSets[0].id  = 1000;
+    nodeSets[0].num_entry = 3;
+    nodeSets[0].num_distribution_factor = 0;
+    nodeSets[0].entry_list = nset_nodes;
+    nodeSets[0].extra_list = NULL;
+    nodeSets[0].distribution_factor_list  = NULL;
+    
+    edgeSets[0].type = EX_EDGE_SET;
+    edgeSets[0].id  = 1200;
+    edgeSets[0].num_entry = 6;
+    edgeSets[0].num_distribution_factor = 6;
+    edgeSets[0].entry_list = eset_edges;
+    edgeSets[0].extra_list = eset_orient;
+    edgeSets[0].distribution_factor_list  = eset_df;
+    
+    faceSets[0].type = EX_FACE_SET;
+    faceSets[0].id  = 1400;
+    faceSets[0].num_entry = 2;
+    faceSets[0].num_distribution_factor = 0;
+    faceSets[0].entry_list = fset_faces;
+    faceSets[0].extra_list = fset_orient;
+    faceSets[0].distribution_factor_list  = NULL;
+    
+    sideSets[0].type = EX_SIDE_SET;
+    sideSets[0].id  = 1400;
+    sideSets[0].num_entry = 5;
+    sideSets[0].num_distribution_factor = 0;
+    sideSets[0].entry_list = sset_elems;
+    sideSets[0].extra_list = sset_sides;
+    sideSets[0].distribution_factor_list  = NULL;
+    
+    elemSets[0].type = EX_ELEM_SET;
+    elemSets[0].id  = 1800;
+    elemSets[0].num_entry = 1;
+    elemSets[0].num_distribution_factor = 0;
+    elemSets[0].entry_list = &elset_elems[0];
+    elemSets[0].extra_list = NULL;
+    elemSets[0].distribution_factor_list  = NULL;
+    
+    elemSets[1].type = EX_ELEM_SET;
+    elemSets[1].id  = 1900;
+    elemSets[1].num_entry = 1;
+    elemSets[1].num_distribution_factor = 0;
+    elemSets[1].entry_list = &elset_elems[1];
+    elemSets[1].extra_list = NULL;
+    elemSets[1].distribution_factor_list  = NULL;
+    
+    if ( concatSets ) {
+      EXCHECK( ex_put_sets(exoid, 1+2+1+1+1, allSets), "Unable to output concatenated sets.\n" );
+    } else {
+      EXCHECK( ex_put_sets( exoid, 1, nodeSets), "Unable to write node sets.\n" );
+      EXCHECK( ex_put_sets( exoid, 1, edgeSets), "Unable to write edge sets.\n" );
+      EXCHECK( ex_put_sets( exoid, 1, faceSets), "Unable to write face sets.\n" );
+      EXCHECK( ex_put_sets( exoid, 1, sideSets), "Unable to write side sets.\n" );
+      EXCHECK( ex_put_sets( exoid, 2, elemSets), "Unable to write element sets.\n" );
+    }
+  }
+
+  /*                  =============== Result variable params ========= */
+  /* *** NEW API *** */
+  if ( concatResult ) {
+    EXCHECK( ex_put_all_var_param_ext( exoid, &varParams ),
+	     "Unable to write result variable parameter information.\n" );
+  } else {
+    EXCHECK( ex_put_var_param( exoid, "G", 2 ),
+	     "Unable to write global result variable parameters.\n" );
+    EXCHECK( ex_put_var_param( exoid, "N", 1 ),
+	     "Unable to write nodal result variable parameters.\n" );
+    EXCHECK( ex_put_var_param( exoid, "E", 1 ),
+	     "Unable to write element result variable parameters.\n" );
+    EXCHECK( ex_put_var_param( exoid, "L", 2 ),
+	     "Unable to write edge result variable parameters.\n" );
+    EXCHECK( ex_put_var_param( exoid, "F", 1 ),
+	     "Unable to write face result variable parameters.\n" );
+    EXCHECK( ex_put_var_param( exoid, "A", 1 ),
+	     "Unable to write faceset result variable parameters.\n" );
+  }
+
+  /*                  =============== Result variable names ========== */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_var_name( exoid, "G", 1, "CALIBER" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "g", 2, "GUNPOWDER" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "N", 1, "RHO" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "l", 1, "GAMMA1" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "L", 2, "GAMMA2" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "f", 1, "PHI" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "E", 1, "EPSTRN" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_var_name( exoid, "A", 1, "PHI0" ), "Unable to write variable name.\n" );
+
+  /*                  =============== Result variable values ========= */
+  t = 1.;
+  /* *** NEW API *** */
+  EXCHECK( ex_put_time( exoid, 1, &t ), "Unable to write time value.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_GLOBAL, 1, 0/*N/A*/, 2,      vals_glo_var[0] ), "Unable to write global var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_EDGE_BLOCK, 1, 100, 20, vals_edge_var1eb1[0] ), "Unable to write edge block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_EDGE_BLOCK, 2, 100, 20, vals_edge_var2eb1[0] ), "Unable to write edge block 1 var 2.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_FACE_BLOCK, 1, 500,  2, vals_face_var1fb1[0] ), "Unable to write face block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_FACE_BLOCK, 1, 700,  8, vals_face_var1fb3[0] ), "Unable to write face block 3 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_ELEM_BLOCK, 1, 200,  2, vals_elem_var1eb1[0] ), "Unable to write elem block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_FACE_SET,  1, 1400,  2, vals_fset_var1fs1[0] ), "Unable to write face set 1 var 1.\n" );
+
+  t = 2.;
+  EXCHECK( ex_put_time( exoid, 2, &t ), "Unable to write time value.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_GLOBAL, 1, 0/*N/A*/, 2,      vals_glo_var[1] ), "Unable to write global var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_EDGE_BLOCK, 1, 100, 20, vals_edge_var1eb1[1] ), "Unable to write edge block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_EDGE_BLOCK, 2, 100, 20, vals_edge_var2eb1[1] ), "Unable to write edge block 1 var 2.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_FACE_BLOCK, 1, 500,  2, vals_face_var1fb1[1] ), "Unable to write face block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_FACE_BLOCK, 1, 700,  8, vals_face_var1fb3[1] ), "Unable to write face block 3 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_ELEM_BLOCK, 1, 200,  2, vals_elem_var1eb1[1] ), "Unable to write elem block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_FACE_SET,  1, 1400,  2, vals_fset_var1fs1[1] ), "Unable to write face set 1 var 1.\n" );
+
+  EXCHECK( ex_put_nodal_var( exoid, 1, 1, 12, vals_nod_var[0] ), "Unable to write nodal var 1.\n" );
+  EXCHECK( ex_put_nodal_var( exoid, 2, 1, 12, vals_nod_var[1] ), "Unable to write nodal var 1.\n" );
+
+  EXCHECK( ex_close( exoid ),
+	   "Unable to close database.\n" );
+
+  return 0;
+}
+
+#if !defined(USING_CMAKE)
+int main( int argc, char* argv[] )
+{
+  return cCreateEdgeFace(argc, argv);
+}
+#endif
diff --git a/exodus/cbind/test/Imakefile b/exodus/cbind/test/Imakefile
new file mode 100644
index 0000000..b750b4c
--- /dev/null
+++ b/exodus/cbind/test/Imakefile
@@ -0,0 +1,125 @@
+### Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+### DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+### retains certain rights in this software.
+### 
+### Redistribution and use in source and binary forms, with or without
+### modification, are permitted provided that the following conditions are
+### met:
+### 
+###     * Redistributions of source code must retain the above copyright
+###       notice, this list of conditions and the following disclaimer.
+### 
+###     * Redistributions in binary form must reproduce the above
+###       copyright notice, this list of conditions and the following
+###       disclaimer in the documentation and/or other materials provided
+###       with the distribution.  
+### 
+###     * Neither the name of Sandia Corporation nor the names of its
+###       contributors may be used to endorse or promote products derived
+###       from this software without specific prior written permission.
+### 
+### THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+### "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+### LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+### A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+### OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+### SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+### LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+### DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+### THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+### (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+### OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+### 
+
+### Imakefile --- 
+
+INCLUDES = -I../include
+
+EXOIITEST = -Wl,-R../src -L../src -lexodus
+LOCALEXO = ../src/libexodus.a
+LIBS = $(LOCALEXO) -L$(USRLIBDIR) $(NETCDF) $(EXTRANETCDFLIB)
+
+#if defined(ParallelAwareExodus)
+PARTEST = testrd_par
+#endif
+
+PROGS = testwt testwtd testrd testrd1 testrdd testwt1 testwt2 testwtm \
+	testwt_ss testwt_nossnsdf testrd_ss testrdwt testcp testcpd testcp_nl  \
+	testcp_ln testwt_clb testwt_nc testrd_nc testwt-zeroe testwt-zeron \
+	testwt-one-attrib create_mesh rd_wt_mesh \
+	testwt-partial testwt-nsided testrd-nsided testwt-nfaced \
+	testrd-nfaced testwt-long-name testrd-long-name \
+	testwt-groups testrd-groups \
+	oned twod MakeTestData test_nemesis $(PARTEST)
+#if 0
+	CreateEdgeFace ReadEdgeFace
+#endif
+
+all:: check
+
+#if defined(ParallelAwareExodus)
+LOCALPAREXO = ../parallel/libexodus_par.a
+PLIBS = $(LOCALPAREXO) $(LOCALEXO) -L$(USRLIBDIR) $(NETCDF) $(EXTRANETCDFLIB)
+
+NormalProgramTarget(testrd_par,    testrd_par.o,    $(LOCALEXO), /**/, $(PLIBS))
+#endif
+
+NormalProgramTarget(oned,      oned.o,      $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(twod,      twod.o,      $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(MakeTestData,MakeTestData.o, $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(testwt,    testwt.o,    $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt_clb,testwt_clb.o,$(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwtd,   testwtd.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd,    testrd.o,    $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd1,   testrd1.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrdd,   testrdd.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt1,   testwt1.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt2,   testwt2.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwtm,   testwtm.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt_ss, testwt_ss.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt_nossnsdf, testwt_nossnsdf.o, $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(testrd_ss, testrd_ss.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrdwt,  testrdwt.o,  $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testcp,    testcp.o,    $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testcpd,   testcpd.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testcp_nl ,testcp_nl.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testcp_ln ,testcp_ln.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt_nc, testwt_nc.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd_nc, testrd_nc.o, $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(testwt-long-name,testwt-long-name.o,$(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd-long-name,testrd-long-name.o,$(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt-zeroe, testwt-zeroe.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt-zeron, testwt-zeron.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt-one-attrib, testwt-one-attrib.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt-partial, testwt-partial.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt-nsided, testwt-nsided.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd-nsided, testrd-nsided.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testwt-nfaced, testwt-nfaced.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd-nfaced, testrd-nfaced.o, $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(testwt-groups, testwt-groups.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(testrd-groups, testrd-groups.o, $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(create_mesh, create_mesh.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(rd_wt_mesh,  rd_wt_mesh.o, $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(CreateEdgeFace, CreateEdgeFace.o, $(LOCALEXO), /**/, $(LIBS))
+NormalProgramTarget(ReadEdgeFace,   ReadEdgeFace.o,   $(LOCALEXO), /**/, $(LIBS))
+
+NormalProgramTarget(test_nemesis,   test_nemesis.o,   $(LOCALEXO), /**/, $(LIBS))
+
+testall: testall.in1 $(CONFIGDIR)/$(MACROFILE)
+	rm -f testall
+	$(ETCDIR)/MsubCmd +R"@<" -R">@" testall.in1 >testall
+
+test:  check
+check: $(PROGS) testall
+	csh -f ./testall
+
+ExtraStuffToClean(*.res)
+ExtraStuffToClean(*.exo)
+ExtraStuffToClean(test.output)
+ExtraStuffToClean(testall)
diff --git a/exodus/cbind/test/MakeTestData.c b/exodus/cbind/test/MakeTestData.c
new file mode 100644
index 0000000..3c0da59
--- /dev/null
+++ b/exodus/cbind/test/MakeTestData.c
@@ -0,0 +1,963 @@
+/*
+ * Copyright (c) 2014, Sandia Corporation.
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include "exodusII.h"
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if 0
+int mymode = EX_MAPS_INT64_DB|EX_MAPS_INT64_API|EX_BULK_INT64_DB|EX_BULK_INT64_API|EX_IDS_INT64_API|EX_IDS_INT64_DB;
+typedef int64_t INT;
+#else
+int mymode = 0;
+typedef int INT;
+#endif
+
+#define EX_TEST_FILENAME "ExodusTestData.e"
+
+/* ================ Coordinate Frames ================ */
+int cf_ids[2] = {20, 13};
+double pt_coords[9*2] = {1,0,0,  1,0,1,  2,0,0,
+			0,0,0,  1,0,0,  0,1,0};
+char tags[2]={'r', 'c'};
+
+/* ======== Coordinates and connectivity ========= */
+double coordsX[] = {
+   0.,  0.,  0.,  0., 
+   3.,  3.,  3.,  3.,
+  -3., -3., -3., -3.
+};
+
+double coordsY[] = {
+  -1.,  1.,  1., -1., 
+  -3.,  3.,  3., -3.,
+  -3.,  3.,  3., -3.
+};
+
+double coordsZ[] = {
+  -1., -1.,  1.,  1., 
+  -3., -3.,  3.,  3.,
+  -3., -3.,  3.,  3.
+};
+
+const char* coordsNames[] = { "X", "Y", "Z" };
+
+INT conn1[] = {
+   1,  2,  3,  4,  5,  6,  7,  8,
+   9, 10, 11, 12,  1,  2,  3,  4
+};
+
+INT conn2[] = { 1, 2, 3, 5 };
+
+INT conn3[] = { 12, 11, 10, 9 };
+
+INT conn4[] = {1, 3, 5, 7, 9, 11}; /* Sphere */
+
+INT conn5[] = {12, 8,   11, 7,    10, 6,    9, 5}; /* Beam */
+
+INT econn1[] = {
+   1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,
+  13, 14, 15, 16,  1,  2,  3,  4, 17, 18, 19, 20
+};
+
+INT fconn1[] = {
+   4,  5,  7,  6,  3,  2,
+   8,  9, 11, 10,  1,  3
+};
+
+INT ebconn1[] = {
+   1,  2,
+   2,  3,
+   3,  4,
+   4,  1,
+   5,  6,
+   6,  7,
+   7,  8,
+   8,  5,
+   1,  5,
+   2,  6,
+   4,  8,
+   3,  7,
+   9, 10,
+  10, 11,
+  11, 12,
+  12,  9,
+   9,  1,
+  10,  2,
+  12,  4,
+  11,  3
+};
+
+INT fbconn1[] = {
+  12, 11, 10,  9,
+   5,  6,  7,  8
+};
+
+INT fbconn2[] = {
+   1,  2,  3,  4
+};
+
+INT fbconn3[] = {
+   1,  5,  6,  2,
+   3,  7,  8,  4,
+   2,  6,  7,  3,
+   4,  8,  5,  1, 9,  1,  2, 10,
+  11,  3,  4, 12,
+  10,  2,  3, 11,
+  12,  4,  1,  9
+};
+
+INT nmap1[] = {
+  12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
+};
+
+INT nmap2[] = {
+  120, 110, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10
+};
+
+INT edmap1[] = {
+  1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20
+};
+
+
+INT famap1[] = {
+  2, 1, 4, 3, 6, 5, 7, 8, 9, 10, 11
+};
+
+INT emap1[] = {
+  10, 20, 30, 44, 91,92,93,94,95,96,  88, 87, 86, 85
+};
+
+const char* eblk_names[] = {
+  "Eli_WALLACH",
+  "Angelo_NOVI",
+  "A_Shell",
+  "Some_Sphere_Elements",
+  "Reinforcement"
+};
+
+const char* edblk_names[] = { "Aldo_GIUFFRE" };
+const char* fablk_names[] = { 
+  "Livio_LORENZON",
+  "Claudio_SCARCHILLI",
+  "John_BARTHA"
+};
+
+const char* nmap_names[] = { "Luigi_PISTILLI" };
+const char* edmap_names[] = { "Antonio_CASALE" };
+const char* famap_names[] = { "Sandro_SCARCHILLI" };
+const char* emap_names[] = { "Benito_STEFANELLI" };
+
+/* ======== Sets ========= */
+INT nset_nodes[] = {
+  5, 6, 9
+};
+
+INT eset_edges[] = {
+  1, 2, 4, 15, 19, 20
+};
+
+INT eset_orient[] = {
+  +1, +1, +1, +1, +1, -1
+};
+
+double eset_df[] = {
+  2., 2., 0.5, 0.5, 1., 1.
+};
+
+INT fset_faces[] = {
+  3, 9
+};
+
+INT fset_orient[] = {
+  +1, -1
+};
+
+INT sset_elems[] = {
+  1, 1, 1, 2, 2
+};
+
+INT sset_sides[] = {
+  1, 3, 5, 2, 4
+};
+
+INT sset1_elems[] = {
+  4, 4, 4
+};
+
+INT sset1_sides[] = {
+  1, 3, 5
+};
+
+INT elset_elems[] = {
+  1,
+  2
+};
+
+const char* elset_names[] = {
+  "Clint_EASTWOOD",
+  "Lee_VAN_CLEEF"
+};
+
+const char* nset_names[] = { "Ennio_MORRICONE" };
+const char* eset_names[] = { "Rada_RASSIMOV" };
+const char* fset_names[] = { "Enzo_PETITO" };
+const char* sset_names[] = { "Luciano_VINCENZONI", "A_Very_Long_Name_That_Tests_Capability_for_Long_Names" };
+
+/* ======== Attributes ========= */
+const char* node_attr_names[]  = {"Influence_Diameter"};
+const char* edge_attr_names1[] = {"Sergio_LEONE"};
+
+const char* face_attr_names1[] = {"GOOD"};
+const char* face_attr_names2[] = {"BAD"};
+const char* face_attr_names3[] = {"UGLY"};
+
+const char* elem_attr_names1[] = {
+  "SPAGHETTI",
+  "WESTERN"
+};
+
+const char* elem_attr_names3[] = {
+  "Thickness"
+};
+
+const char* elem_attr_names4[] = {
+  "Radius", "Volume"
+};
+
+const char* elem_attr_names5[] = {
+  "Area", "I_1", "I_2", "J", "V_x", "V_y", "V_z"
+};
+
+const char* elem_var_names[] = {"my_stress_xx_1",
+				"my_stress_yy_1",
+				"my_stress_zz_1",
+				"my_stress_xy_1",
+				"my_stress_yz_1",
+				"my_stress_zx_1",
+				"my_stress_xx_2",
+				"my_stress_yy_2",
+				"my_stress_zz_2",
+				"my_stress_xy_2",
+				"my_stress_yz_2",
+				"my_stress_zx_2",
+                                "von_mises_which_is_calculated_the_standard_way_from_stress",
+				"tension"
+};
+  
+const char* nset_var_names[] = {"var_name.xx",
+				"var_name.yy",
+				"var_name.zz",
+				"var_name.xy",
+				"var_name.yz",
+				"var_name.zx"};
+
+const char* sset_var_names[] = {"stressxx",
+				"stressyy",
+				"stresszz",
+				"stressxy",
+				"stressyz",
+				"stresszx"};
+
+double edge_attr_values1[] = {
+   1.,  2.,  3.,  5.,  7., 11., 13., 17., 19., 23.,
+  29., 31., 37., 41., 43., 47., 53., 59., 61., 67.
+};
+
+double node_attr_values[] = { 12., 11., 10., 9., 8., 7., 6., 5., 4., 3., 2., 1.};
+
+double face_attr_values1[] = {
+  71., 73.
+};
+
+double face_attr_values2[] = {
+  79.
+};
+
+double face_attr_values3[] = {
+  83., 89., 97., 101., 103., 107., 109., 113.
+};
+
+double elem_attr_values1[] = {
+  127., 101.,
+  137., 139.
+};
+
+double elem_attr_values4[] = {
+  .10, 0.0,
+  .11, 0.0,
+  .12, 0.0,
+  .13, 0.0,
+  .14, 0.0,
+  .15, 0.0
+};
+
+double elem_attr_values5[] = { /* 4 elements, 7 attributes/element */
+  1.0,   10.0, 11.0, 12.0,   0.0, 0.0, 1.0,
+  1.1,   10.1, 11.1, 12.1,   1.0, 0.0, 0.0,
+  1.2,   10.2, 11.2, 12.2,   0.0, 1.0, 0.0,
+  1.3,   10.3, 11.3, 12.3,   1.0, 1.0, 1.0
+};
+
+/* ======== Results variables ========= */
+/*           (2 time steps) */
+
+double vals_glo_var[2][3] = {
+  { 36., 37., 38.},
+  { 42., 43., 44.}
+};
+
+double vals_nod_var[2][12] = {
+  { 0.1, 0.8, 0.0, 0.4, 0.3, 0.9, 0.8, 0.5, 0.3, 0.7, 0.4, 0.6 },
+  { 0.7, 0.5, 0.3, 0.5, 0.2, 0.7, 0.9, 0.8, 0.0, 0.2, 0.3, 0.5 }
+} ;
+
+
+double vals_edge_var1eb1[2][20] = {
+  { 20., 19., 18., 17., 16., 15., 14., 13., 12., 11., 10., 9., 8., 7., 6., 5., 4., 3., 2., 1. },
+  { 21., 20., 19., 18., 17., 16., 15., 14., 13., 12., 11., 10., 9., 8., 7., 6., 5., 4., 3., 2. }
+};
+
+double vals_edge_var2eb1[2][20] = {
+  { 1., 1., 0., 0., 1., 1., 2., 0., 2., 0., 1., 1., 1., 1., 0., 0., 2., 2., 2., 2. },
+  { 1., 1., 0., 0., 1., 1., 2., 0., 2., 0., 1., 1., 1., 1., 0., 0., 2., 2., 2., 2. }
+};
+
+double vals_face_var1fb1[2][2] = {
+  { 0, 1 },
+  { 2, 0 }
+};
+
+double vals_face_var1fb3[2][8] = {
+  { 1, 0, 2, 0, 3, 0, 4, 0 },
+  { 0, 1, 0, 2, 0, 3, 0, 4 }
+};
+
+double vals_elem_var[2][2*6*2] = {
+  { 8.0,  8.0, 8.1, 8.1, 8.2, 8.2, 8.3, 8.3, 8.4, 8.4, 8.5, 8.5, 18.0,  18.0, 18.1, 18.1, 18.2, 18.2, 18.3, 18.3, 18.4, 18.4, 18.5, 18.5 },
+  { -7.0,  -7.0, -7.1, -7.1, -7.2, -7.2, -7.3, -7.3, -7.4, -7.4, -7.5, -7.5, -7.0,  -17.0, -17.1, -17.1, -17.2, -17.2, -17.3, -17.3, -17.4, -17.4, -17.5, -17.5 }
+};
+
+double vals_elem_var1[2][1] = {
+  { 88.8 },
+  { 99.9 }
+};
+
+double vals_tension[2][4] = {
+  { 1000., 2000., 3000., 4000. },
+  { 2000., 4000., 6000., 8000. }
+};
+
+/* 2 time planes, 6 elements, 3 variables */
+double vals_elem_var2[2][6*3] = {
+  { 1.01, 1.02, 1.03, 2.01, 2.02, 2.03, 3.01, 3.02, 3.03, 4.01, 4.02, 4.03, 5.01, 5.02, 5.03, 6.01, 6.02, 6.03 },
+  {11.01,11.02,11.03,12.01,12.02,12.03,13.01,13.02,13.03,14.01,14.02,14.03,15.01,15.02,15.03,16.01,16.02,16.03 }
+};
+
+double vals_nset_var[2][3*6] = {
+  { 8.0, 8.1, 8.2,
+    7.0, 7.1, 7.2,
+    6.0, 6.1, 6.2,
+    5.0, 5.1, 5.2,
+    4.0, 4.1, 4.2,
+    3.0, 3.1, 3.2},
+  { -8.0, -8.1, -8.2,
+    -7.0, -7.1, -7.2,
+    -6.0, -6.1, -6.2,
+    -5.0, -5.1, -5.2,
+    -4.0, -4.1, -4.2,
+    -3.0, -3.1, -3.2},
+};
+
+double vals_sset_var[2][5*6] = {
+  { 18.0, 18.1, 18.2, 18.3, 18.4,
+    17.0, 17.1, 17.2, 17.3, 17.4,
+    16.0, 16.1, 16.2, 16.3, 16.4,
+    15.0, 15.1, 15.2, 15.3, 15.4,
+    14.0, 14.1, 14.2, 14.3, 14.4,
+    13.0, 13.1, 13.2, 13.3, 13.4},
+  { -18.0, -18.1, -18.2, -18.3, -18.4,
+    -17.0, -17.1, -17.2, -17.3, -17.4,
+    -16.0, -16.1, -16.2, -16.3, -16.4,
+    -15.0, -15.1, -15.2, -15.3, -15.4,
+    -14.0, -14.1, -14.2, -14.3, -14.4,
+    -13.0, -13.1, -13.2, -13.3, -13.4},
+};
+
+double vals_fset_var1fs1[2][2] = {
+  { 1., 3. },
+  { 9., 27. }
+};
+
+#define EXCHECK(funcall,errmsg)\
+  if ( (funcall) < 0 ) \
+    { \
+      fprintf( stderr, errmsg ); \
+      return 1; \
+    }
+
+int ex_have_arg( int argc, char* argv[], const char* aname )
+{
+  int i;
+  for ( i = 0; i < argc; ++i )
+    if ( ! strcmp( argv[i], aname ) )
+      return 1;
+  return 0;
+}
+
+int cCreateEdgeFace( int argc, char* argv[] )
+{
+  int exoid;
+  int appWordSize = 8;
+  int diskWordSize = 8;
+  int concatBlocks = ex_have_arg( argc, argv, "-pcab" );
+  int concatSets   = ex_have_arg( argc, argv, "-pcset" );
+  int concatResult = ex_have_arg( argc, argv, "-pvpax" );
+  double t;
+  int i;
+
+  ex_opts(EX_VERBOSE);
+  
+  ex_init_params modelParams = {
+    "CreateEdgeFace Test", /* title */
+    3,  /* num_dim */
+    12, /* num_nodes */
+    20, /* num_edge */
+    1,  /* num_edge_blk */
+    11, /* num_face */
+    3,  /* num_face_blk */
+    14,  /* num_elem */
+    5,  /* num_elem_blk */
+    1,  /* num_node_sets */
+    1,  /* num_edge_sets */
+    1,  /* num_face_sets */
+    2,  /* num_side_sets */
+    2,  /* num_elem_sets */
+    1,  /* num_node_map */
+    1,  /* num_edge_map */
+    1,  /* num_face_map */
+    1,  /* num_elem_map */
+  };
+
+  ex_block_params blockParams;
+  ex_var_params varParams;
+
+  blockParams.edge_blk_id         = (int*)malloc(1 * sizeof(INT));
+  blockParams.num_edge_this_blk   = (int*)malloc(1 * sizeof(int));
+  blockParams.num_nodes_per_edge  = (int*)malloc(1 * sizeof(int));
+  blockParams.num_attr_edge       = (int*)malloc(1 * sizeof(int));
+  blockParams.face_blk_id         = (int*)malloc(3 * sizeof(INT));
+  blockParams.num_face_this_blk   = (int*)malloc(3 * sizeof(int));
+  blockParams.num_nodes_per_face  = (int*)malloc(3 * sizeof(int));
+  blockParams.num_attr_face       = (int*)malloc(3 * sizeof(int));
+  blockParams.elem_blk_id         = (int*)malloc(5 * sizeof(INT));
+  blockParams.num_elem_this_blk   = (int*)malloc(5 * sizeof(int));
+  blockParams.num_nodes_per_elem  = (int*)malloc(5 * sizeof(int));
+  blockParams.num_edges_per_elem  = (int*)malloc(5 * sizeof(int));
+  blockParams.num_faces_per_elem  = (int*)malloc(5 * sizeof(int));
+  blockParams.num_attr_elem       = (int*)malloc(5 * sizeof(int));
+  
+  blockParams.edge_type    = (char**)malloc(1 * sizeof(char*));
+  blockParams.edge_type[0] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.face_type    = (char**)malloc(3 * sizeof(char*));
+  blockParams.face_type[0] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.face_type[1] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.face_type[2] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.elem_type    = (char**)malloc(5 * sizeof(char*));
+  blockParams.elem_type[0] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.elem_type[1] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.elem_type[2] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.elem_type[3] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+  blockParams.elem_type[4] = (char*)malloc((MAX_STR_LENGTH+1) * sizeof(char));
+
+  ((INT*)blockParams.edge_blk_id)[0]         = 100;
+  blockParams.num_edge_this_blk[0]   = 20;
+  blockParams.num_nodes_per_edge[0]  = 2;
+  blockParams.num_attr_edge[0]       = 1;
+
+  ((INT*)blockParams.face_blk_id)[0]         = 500;
+  ((INT*)blockParams.face_blk_id)[1]         = 600;
+  ((INT*)blockParams.face_blk_id)[2]         = 700;
+  blockParams.num_face_this_blk[0]   = 2;
+  blockParams.num_face_this_blk[1]   = 1;
+  blockParams.num_face_this_blk[2]   = 8;
+  blockParams.num_nodes_per_face[0]  = 4;
+  blockParams.num_nodes_per_face[1]  = 4;
+  blockParams.num_nodes_per_face[2]  = 4;
+  blockParams.num_attr_face[0]       = 1;
+  blockParams.num_attr_face[1]       = 1;
+  blockParams.num_attr_face[2]       = 1;
+
+  ((INT*)blockParams.elem_blk_id)[0]         = 200;
+  ((INT*)blockParams.elem_blk_id)[1]         = 201;
+  ((INT*)blockParams.elem_blk_id)[2]         = 100;
+  ((INT*)blockParams.elem_blk_id)[3]         = 500;
+  ((INT*)blockParams.elem_blk_id)[4]         = 2147483647;
+
+  blockParams.num_elem_this_blk[0]   = 2;
+  blockParams.num_elem_this_blk[1]   = 1;
+  blockParams.num_elem_this_blk[2]   = 1;
+  blockParams.num_elem_this_blk[3]   = 6;
+  blockParams.num_elem_this_blk[4]   = 4;
+
+  blockParams.num_nodes_per_elem[0]  = 8;
+  blockParams.num_nodes_per_elem[1]  = 4;
+  blockParams.num_nodes_per_elem[2]  = 4;
+  blockParams.num_nodes_per_elem[3]  = 1;
+  blockParams.num_nodes_per_elem[4]  = 2;
+
+  blockParams.num_edges_per_elem[0]  = 12;
+  blockParams.num_edges_per_elem[1]  = 0;
+  blockParams.num_edges_per_elem[2]  = 0;
+  blockParams.num_edges_per_elem[3]  = 0;
+  blockParams.num_edges_per_elem[4]  = 0;
+
+  blockParams.num_faces_per_elem[0]  = 6;
+  blockParams.num_faces_per_elem[1]  = 0;
+  blockParams.num_faces_per_elem[2]  = 0;
+  blockParams.num_faces_per_elem[3]  = 0;
+  blockParams.num_faces_per_elem[4]  = 0;
+
+  blockParams.num_attr_elem[0]       = 2;
+  blockParams.num_attr_elem[1]       = 0;
+  blockParams.num_attr_elem[2]       = 1;
+  blockParams.num_attr_elem[3]       = 2;
+  blockParams.num_attr_elem[4]       = 7;
+
+  blockParams.define_maps = 0;
+
+  strcpy(blockParams.edge_type[0], "EDGE2");
+
+  strcpy(blockParams.face_type[0], "QUAD4");
+  strcpy(blockParams.face_type[1], "QUAD4");
+  strcpy(blockParams.face_type[2], "QUAD4");
+
+  strcpy(blockParams.elem_type[0], "HEX8");
+  strcpy(blockParams.elem_type[1], "TET4");
+  strcpy(blockParams.elem_type[2], "SHELL");
+  strcpy(blockParams.elem_type[3], "SPHERE");
+  strcpy(blockParams.elem_type[4], "beam");
+
+  varParams.edge_var_tab  = (int*)malloc(2 * sizeof(int));
+  varParams.face_var_tab  = (int*)malloc(3 * sizeof(int));
+  varParams.elem_var_tab  = (int*)0;
+  varParams.nset_var_tab  = (int*)0;
+  varParams.eset_var_tab  = (int*)0;
+  varParams.fset_var_tab  = (int*)malloc(1 * sizeof(int));
+  varParams.sset_var_tab  = (int*)0;
+  varParams.elset_var_tab = (int*)0;
+
+  varParams.num_glob        = 2;
+  varParams.num_node        = 1;
+  varParams.num_edge        = 2;
+  varParams.edge_var_tab[0] = 1;
+  varParams.edge_var_tab[1] = 1;
+  varParams.num_face        = 1;
+  varParams.face_var_tab[0] = 1;
+  varParams.face_var_tab[1] = 1;
+  varParams.face_var_tab[2] = 1;
+  varParams.num_elem        = 1;
+  varParams.num_nset        = 0;
+  varParams.num_eset        = 0;;
+  varParams.num_fset        = 1;
+  varParams.fset_var_tab[0] = 1;
+  varParams.num_sset        = 0;
+  varParams.num_elset       = 0;
+
+  exoid = ex_create( EX_TEST_FILENAME, EX_CLOBBER|mymode, &appWordSize, &diskWordSize );
+  if ( exoid <= 0 )
+    {
+      fprintf( stderr, "Unable to open \"%s\" for writing.\n", EX_TEST_FILENAME );
+      return 1;
+    }
+
+  ex_set_max_name_length(exoid, 80);
+  
+  EXCHECK( ex_put_init_ext( exoid, &modelParams ),
+	   "Unable to initialize database.\n" );
+
+  /* Add a coordinate frame just to give test coverage... */
+  EXCHECK( ex_put_coordinate_frames(exoid, 2, cf_ids, pt_coords, tags),
+	   "Unable to output coordinate frame.\n");
+
+  if ( concatBlocks ) {
+    EXCHECK( ex_put_concat_all_blocks( exoid, &blockParams ),
+	     "Unable to initialize block params.\n" );
+  } else {
+    int blk;
+    for ( blk = 0; blk < modelParams.num_edge_blk; ++blk ) {
+      EXCHECK( ex_put_block( exoid, EX_EDGE_BLOCK, ((INT*)blockParams.edge_blk_id)[blk], blockParams.edge_type[blk],
+			     blockParams.num_edge_this_blk[blk], blockParams.num_nodes_per_edge[blk], 0, 0,
+			     blockParams.num_attr_edge[blk] ), "Unable to write edge block" );
+    }
+    for ( blk = 0; blk < modelParams.num_face_blk; ++blk ) {
+      EXCHECK( ex_put_block( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[blk], blockParams.face_type[blk],
+			     blockParams.num_face_this_blk[blk], blockParams.num_nodes_per_face[blk], 0, 0,
+			     blockParams.num_attr_face[blk] ), "Unable to write face block" );
+    }
+    for ( blk = 0; blk < modelParams.num_elem_blk; ++blk ) {
+      EXCHECK( ex_put_block( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[blk], blockParams.elem_type[blk],
+			     blockParams.num_elem_this_blk[blk], blockParams.num_nodes_per_elem[blk],
+			     blockParams.num_edges_per_elem[blk], blockParams.num_faces_per_elem[blk],
+			     blockParams.num_attr_elem[blk] ), "Unable to write elem block" );
+    }
+  }
+
+  EXCHECK( ex_put_attr_param(exoid, EX_NODAL, 0, 1),
+	   "Unable to put nodal attributes.\n" );
+  
+  EXCHECK( ex_put_coord( exoid, (void*)coordsX, (void*)coordsY, (void*)coordsZ ),
+	   "Unable to write coordinates.\n" );
+
+  EXCHECK( ex_put_coord_names( exoid, (char**)coordsNames ),
+	   "Unable to write coordinate names.\n" );
+
+  /*                  =============== Connectivity  ================== */
+  EXCHECK( ex_put_conn( exoid, EX_EDGE_BLOCK, ((INT*)blockParams.edge_blk_id)[0], ebconn1, 0, 0 ),
+	   "Unable to write edge block connectivity.\n" );
+
+  EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[0], fbconn1, 0, 0 ),
+	   "Unable to write face block 1 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[1], fbconn2, 0, 0 ),
+	   "Unable to write face block 2 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[2], fbconn3, 0, 0 ),
+	   "Unable to write face block 3 connectivity.\n" );
+
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[0], conn1, econn1, fconn1 ),
+	   "Unable to write elem block 1 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[1], conn2, 0, 0 ),
+	   "Unable to write elem block 2 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[2], conn3, 0, 0 ),
+	   "Unable to write elem block 3 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[3], conn4, 0, 0 ),
+	   "Unable to write elem block 4 connectivity.\n" );
+  EXCHECK( ex_put_conn( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[4], conn5, 0, 0 ),
+	   "Unable to write elem block 5 connectivity.\n" );
+
+  EXCHECK( ex_put_names( exoid, EX_EDGE_BLOCK, (char**)edblk_names ), "Unable to write edge block names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_FACE_BLOCK, (char**)fablk_names ), "Unable to write face block names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_ELEM_BLOCK, (char**) eblk_names ), "Unable to write element block names.\n" );
+
+  /*                  =============== Number Maps   ================== */
+  EXCHECK( ex_put_num_map( exoid, EX_NODE_MAP, 300, nmap1 ),  "Unable to write node map.\n" );
+  EXCHECK( ex_put_num_map( exoid, EX_EDGE_MAP, 800, edmap1 ), "Unable to write edge map.\n" );
+  EXCHECK( ex_put_num_map( exoid, EX_FACE_MAP, 900, famap1 ), "Unable to write face map.\n" );
+  EXCHECK( ex_put_num_map( exoid, EX_ELEM_MAP, 400, emap1 ),  "Unable to write element map.\n" );
+
+  EXCHECK( ex_put_names( exoid, EX_NODE_MAP, (char**) nmap_names ), "Unable to write node map names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_EDGE_MAP, (char**)edmap_names ), "Unable to write edge map names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_FACE_MAP, (char**)famap_names ), "Unable to write face map names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_ELEM_MAP, (char**) emap_names ), "Unable to write element map names.\n" );
+
+  /*                  =============== Id Maps   ================== */
+  EXCHECK( ex_put_id_map( exoid, EX_NODE_MAP, nmap2 ),  "Unable to write node id map.\n" );
+  EXCHECK( ex_put_id_map( exoid, EX_EDGE_MAP, edmap1 ), "Unable to write edge id map.\n" );
+  EXCHECK( ex_put_id_map( exoid, EX_FACE_MAP, famap1 ), "Unable to write face id map.\n" );
+  EXCHECK( ex_put_id_map( exoid, EX_ELEM_MAP, emap1 ),  "Unable to write element id map.\n" );
+
+  /*                 =============== Attribute names ================ */
+  EXCHECK( ex_put_attr_names( exoid, EX_EDGE_BLOCK, ((INT*)blockParams.edge_blk_id)[0], (char**)edge_attr_names1 ),
+	   "Unable to write edge block 1 attribute names.\n" );
+
+  EXCHECK( ex_put_attr_names( exoid, EX_NODAL, 0, (char**)node_attr_names),
+	   "Unable to write nodal attribute names.\n" );
+
+  EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[0], (char**)face_attr_names1 ),
+	   "Unable to write face block 1 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[1], (char**)face_attr_names2 ),
+	   "Unable to write face block 1 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[2], (char**)face_attr_names3 ),
+	   "Unable to write face block 1 attribute names.\n" );
+
+  EXCHECK( ex_put_attr_names( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[0], (char**)elem_attr_names1 ),
+	   "Unable to write elem block 1 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[2], (char**)elem_attr_names3 ),
+	   "Unable to write elem block 3 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[3], (char**)elem_attr_names4 ),
+	   "Unable to write elem block 4 attribute names.\n" );
+  EXCHECK( ex_put_attr_names( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[4], (char**)elem_attr_names5 ),
+	   "Unable to write elem block 5 attribute names.\n" );
+
+  /*                  =============== Attribute values =============== */
+  EXCHECK( ex_put_attr( exoid, EX_EDGE_BLOCK, ((INT*)blockParams.edge_blk_id)[0], edge_attr_values1 ),
+	   "Unable to write edge block 1 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_NODAL, 0, node_attr_values ),
+	   "Unable to write node attribute values.\n" );
+
+  EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[0], face_attr_values1 ),
+	   "Unable to write face block 1 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[1], face_attr_values2 ),
+	   "Unable to write face block 1 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_FACE_BLOCK, ((INT*)blockParams.face_blk_id)[2], face_attr_values3 ),
+	   "Unable to write face block 1 attribute values.\n" );
+
+  EXCHECK( ex_put_attr( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[0], elem_attr_values1 ),
+	   "Unable to write elem block 1 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[2], elem_attr_values1 ),
+	   "Unable to write elem block 3 attribute values.\n" );
+
+  for (i=0; i < 6; i++) {
+    elem_attr_values4[2*i+1] = 4.0 / 3.0 * 3.14 * elem_attr_values4[2*i] * elem_attr_values4[2*i] * elem_attr_values4[2*i];
+  }
+  EXCHECK( ex_put_attr( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[3], elem_attr_values4 ),
+	   "Unable to write elem block 3 attribute values.\n" );
+  EXCHECK( ex_put_attr( exoid, EX_ELEM_BLOCK, ((INT*)blockParams.elem_blk_id)[4], elem_attr_values5 ),
+	   "Unable to write elem block 4 attribute values.\n" );
+
+  /*                  =============== Set parameters ================= */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_names( exoid, EX_NODE_SET,  (char**)nset_names ), "Unable to write node set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_EDGE_SET,  (char**)eset_names ), "Unable to write edge set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_FACE_SET,  (char**)fset_names ), "Unable to write face set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_SIDE_SET,  (char**)sset_names ), "Unable to write side set names.\n" );
+  EXCHECK( ex_put_names( exoid, EX_ELEM_SET, (char**)elset_names ), "Unable to write element set names.\n" );
+
+  if ( concatSets ) {
+    ex_set_specs setParams;
+
+    setParams.sets_ids            = (int*)malloc(2*sizeof(INT));
+    setParams.num_entries_per_set = (int*)malloc(2*sizeof(int));
+    setParams.num_dist_per_set    = (int*)malloc(2*sizeof(int));
+    setParams.sets_entry_index    = (int*)malloc(2*sizeof(int));
+    setParams.sets_dist_index     = (int*)malloc(2*sizeof(int));
+    setParams.sets_entry_list     = (INT*)malloc(6*sizeof(INT));
+    setParams.sets_extra_list     = (INT*)malloc(6*sizeof(INT));
+    setParams.sets_dist_fact      = (double*)malloc(6*sizeof(double));
+
+    ((INT*)setParams.sets_ids)[0]            = 1000;
+    ((INT*)setParams.num_entries_per_set)[0] = 3;
+    ((INT*)setParams.num_dist_per_set)[0]    = 0;
+    ((INT*)setParams.sets_entry_index)[0]    = 0;
+    ((INT*)setParams.sets_dist_index)[0]     = 0;
+
+    {
+      INT* entry_list = setParams.sets_entry_list;
+      entry_list[0] = nset_nodes[0];
+      entry_list[1] = nset_nodes[1];
+      entry_list[2] = nset_nodes[2];
+    }
+
+    EXCHECK( ex_put_concat_sets( exoid, EX_NODE_SET, &setParams ), "Unable to write node sets.\n" );
+
+    ((INT*)setParams.sets_ids)[0]            = 1200;
+    ((INT*)setParams.num_entries_per_set)[0] = 6;
+    ((INT*)setParams.num_dist_per_set)[0]    = 6;
+    ((INT*)setParams.sets_entry_index)[0]    = 0;
+    ((INT*)setParams.sets_dist_index)[0]     = 0;
+
+    {
+      INT* entry_list = setParams.sets_entry_list;
+      INT* extra_list = setParams.sets_extra_list;
+      
+      entry_list[0]     = eset_edges[0];
+      entry_list[1]     = eset_edges[1];
+      entry_list[2]     = eset_edges[2];
+      entry_list[3]     = eset_edges[3];
+      entry_list[4]     = eset_edges[4];
+      entry_list[5]     = eset_edges[5];
+
+      extra_list[0]     = eset_orient[0];
+      extra_list[1]     = eset_orient[1];
+      extra_list[2]     = eset_orient[2];
+      extra_list[3]     = eset_orient[3];
+      extra_list[4]     = eset_orient[4];
+      extra_list[5]     = eset_orient[5];
+    }
+
+    memcpy(setParams.sets_dist_fact, eset_df, sizeof(eset_df)/sizeof(eset_df[0]));
+
+    EXCHECK( ex_put_concat_sets( exoid, EX_EDGE_SET, &setParams ), "Unable to write edge sets.\n" );
+
+    ((INT*)setParams.sets_ids)[0]            = 1400;
+    ((INT*)setParams.num_entries_per_set)[0] = 2;
+    ((INT*)setParams.num_dist_per_set)[0]    = 0;
+    ((INT*)setParams.sets_entry_index)[0]    = 0;
+    ((INT*)setParams.sets_dist_index)[0]     = 0;
+    {
+      INT *entry_list = setParams.sets_entry_list;
+      INT *extra_list = setParams.sets_extra_list;
+      
+      entry_list[0]     = fset_faces[0];
+      entry_list[1]     = fset_faces[1];
+
+      extra_list[0]     = fset_orient[0];
+      extra_list[1]     = fset_orient[1];
+    }
+
+    EXCHECK( ex_put_concat_sets( exoid, EX_FACE_SET, &setParams ), "Unable to write face sets.\n" );
+
+    ((INT*)setParams.sets_ids)[0]            = 1400;
+    ((INT*)setParams.sets_ids)[1]            = 1441;
+    ((INT*)setParams.num_entries_per_set)[0] = 5;
+    ((INT*)setParams.num_entries_per_set)[1] = 3;
+    ((INT*)setParams.num_dist_per_set)[0]    = 0;
+    ((INT*)setParams.num_dist_per_set)[1]    = 0;
+    ((INT*)setParams.sets_entry_index)[0]    = 0;
+    ((INT*)setParams.sets_entry_index)[5]    = 0;
+    ((INT*)setParams.sets_dist_index)[0]     = 0;
+    memcpy(setParams.sets_entry_list, sset_elems, sizeof(sset_elems)/sizeof(sset_elems[0]));
+    memcpy(setParams.sets_extra_list, sset_sides, sizeof(sset_sides)/sizeof(sset_sides[0]));
+
+    EXCHECK( ex_put_concat_sets( exoid, EX_SIDE_SET, &setParams ), "Unable to write side sets.\n" );
+
+    ((INT*)setParams.sets_ids)[0]            = 1800;
+    ((INT*)setParams.sets_ids)[1]            = 1900;
+    ((INT*)setParams.num_entries_per_set)[0] = 1;
+    ((INT*)setParams.num_entries_per_set)[1] = 1;
+    ((INT*)setParams.num_dist_per_set)[0]    = 0;
+    ((INT*)setParams.num_dist_per_set)[1]    = 0;
+    ((INT*)setParams.sets_entry_index)[0]    = 0;
+    ((INT*)setParams.sets_entry_index)[1]    = 1;
+    ((INT*)setParams.sets_dist_index)[0]     = 0;
+    ((INT*)setParams.sets_dist_index)[1]     = 0;
+    memcpy(setParams.sets_entry_list, elset_elems, sizeof(elset_elems)/sizeof(elset_elems[0]));
+
+    EXCHECK( ex_put_concat_sets( exoid, EX_ELEM_SET, &setParams ), "Unable to write element sets.\n" );
+
+  } else {
+    EXCHECK( ex_put_set_param( exoid, EX_NODE_SET, 1000, 3, 0 ), "Unable to write node set params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_NODE_SET, 1000, nset_nodes, 0 ), "Unable to write node set.\n" );
+
+    EXCHECK( ex_put_set_param( exoid, EX_EDGE_SET, 1200, 6, 6 ), "Unable to write edge set params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_EDGE_SET, 1200, eset_edges, eset_orient ), "Unable to write edge set.\n" );
+    EXCHECK( ex_put_set_dist_fact( exoid, EX_EDGE_SET, 1200, eset_df ), "Unable to write edge set dist factors.\n" );
+
+    EXCHECK( ex_put_set_param( exoid, EX_FACE_SET, 1400, 2, 0 ), "Unable to write face set params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_FACE_SET, 1400, fset_faces, fset_orient ), "Unable to write face set.\n" );
+
+    EXCHECK( ex_put_set_param( exoid, EX_SIDE_SET, 1600, 5, 0 ), "Unable to write side set params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_SIDE_SET, 1600, sset_elems, sset_sides ), "Unable to write side set.\n" );
+
+    EXCHECK( ex_put_set_param( exoid, EX_SIDE_SET, 1661, 3, 0 ), "Unable to write side set params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_SIDE_SET, 1661, sset1_elems, sset1_sides ), "Unable to write side set.\n" );
+
+    EXCHECK( ex_put_set_param( exoid, EX_ELEM_SET, 1800, 1, 0 ), "Unable to write element set 1 params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_ELEM_SET, 1800, elset_elems + 0, 0 ), "Unable to write element set 1.\n" );
+    EXCHECK( ex_put_set_param( exoid, EX_ELEM_SET, 1900, 1, 0 ), "Unable to write element set 2 params.\n" );
+    EXCHECK( ex_put_set( exoid, EX_ELEM_SET, 1900, elset_elems + 1, 0 ), "Unable to write element set 2.\n" );
+  }
+
+  /*                  =============== Result variable params ========= */
+  if ( concatResult ) {
+    EXCHECK( ex_put_all_var_param_ext( exoid, &varParams ),
+	     "Unable to write result variable parameter information.\n" );
+  } else {
+    EXCHECK( ex_put_variable_param( exoid, EX_GLOBAL, 3 ),
+	     "Unable to write global result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_NODAL, 1 ),
+	     "Unable to write nodal result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_ELEM_BLOCK, 14 ),
+	     "Unable to write element result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_EDGE_BLOCK, 2 ),
+	     "Unable to write edge result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_FACE_BLOCK, 1 ),
+	     "Unable to write face result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_FACE_SET, 1 ),
+	     "Unable to write faceset result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_SIDE_SET, 6 ),
+	     "Unable to write sideset result variable parameters.\n" );
+    EXCHECK( ex_put_variable_param( exoid, EX_NODE_SET, 6 ),
+	     "Unable to write nodeset result variable parameters.\n" );
+  }
+
+  /*                  =============== Result variable names ========== */
+  /* *** NEW API *** */
+  EXCHECK( ex_put_variable_name( exoid, EX_GLOBAL,     1, "A_vector_X" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_GLOBAL,     2, "A_vector_Y" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_GLOBAL,     3, "A_vector_Z" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_NODAL,      1, "RHO" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_EDGE_BLOCK, 1, "GAMMA1" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_EDGE_BLOCK, 2, "GAMMA2" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_FACE_BLOCK, 1, "PHI" ), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_names( exoid, EX_ELEM_BLOCK, 14, (char**)elem_var_names), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_names( exoid, EX_SIDE_SET,   6, (char**)sset_var_names), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_names( exoid, EX_NODE_SET,   6, (char**)nset_var_names), "Unable to write variable name.\n" );
+  EXCHECK( ex_put_variable_name( exoid, EX_FACE_SET,   1, "PHI0" ), "Unable to write variable name.\n" );
+
+  /*                  =============== Result variable values ========= */
+  t = 1.;
+  /* *** NEW API *** */
+  EXCHECK( ex_put_time( exoid, 1, &t ), "Unable to write time value.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_GLOBAL, 1, 0/*N/A*/, 2,      vals_glo_var[0] ), "Unable to write global var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_EDGE_BLOCK, 1, 100, 20, vals_edge_var1eb1[0] ), "Unable to write edge block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_EDGE_BLOCK, 2, 100, 20, vals_edge_var2eb1[0] ), "Unable to write edge block 1 var 2.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_FACE_BLOCK, 1, 500,  2, vals_face_var1fb1[0] ), "Unable to write face block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_FACE_BLOCK, 1, 700,  8, vals_face_var1fb3[0] ), "Unable to write face block 3 var 1.\n" );
+
+  EXCHECK( ex_put_var( exoid, 1, EX_ELEM_BLOCK, 13,  201,  1, &vals_elem_var1[0] ), "Unable to write elem block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 1, EX_ELEM_BLOCK, 14,  2147483647,  4, &vals_tension[0] ), "Unable to write elem block 1 var 1.\n" );
+  for(i=0; i < 6; i++){
+    /* There are 2 elements in the block and 12 variables (a composite tensor x 2) */
+    EXCHECK( ex_put_var( exoid, 1, EX_ELEM_BLOCK, i+1,  200,  2, &vals_elem_var[0][2*i] ), "Unable to write elem block 1 var 1.\n" );
+    EXCHECK( ex_put_var( exoid, 1, EX_ELEM_BLOCK, i+7,  200,  2, &vals_elem_var[0][12+2*i] ), "Unable to write elem block 1 var 1.\n" );
+    EXCHECK( ex_put_var( exoid, 1, EX_NODE_SET,   i+1, 1000,  3, &vals_nset_var[0][3*i] ), "Unable to write elem block 1 var 1.\n" );
+    EXCHECK( ex_put_var( exoid, 1, EX_SIDE_SET,   i+1, 1600,  5, &vals_sset_var[0][5*i] ), "Unable to write elem block 1 var 1.\n" );
+  }
+  
+  EXCHECK( ex_put_var( exoid, 1, EX_FACE_SET,  1, 1400,  2, vals_fset_var1fs1[0] ), "Unable to write face set 1 var 1.\n" );
+
+  t = 2.;
+  EXCHECK( ex_put_time( exoid, 2, &t ), "Unable to write time value.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_GLOBAL, 1, 0/*N/A*/,  2,      vals_glo_var[1] ), "Unable to write global var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_EDGE_BLOCK, 1, 100,  20, vals_edge_var1eb1[1] ), "Unable to write edge block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_EDGE_BLOCK, 2, 100,  20, vals_edge_var2eb1[1] ), "Unable to write edge block 1 var 2.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_FACE_BLOCK, 1, 500,   2, vals_face_var1fb1[1] ), "Unable to write face block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_FACE_BLOCK, 1, 700,   8, vals_face_var1fb3[1] ), "Unable to write face block 3 var 1.\n" );
+
+  EXCHECK( ex_put_var( exoid, 2, EX_ELEM_BLOCK, 13,  201,  1, &vals_elem_var1[1] ), "Unable to write elem block 1 var 1.\n" );
+  EXCHECK( ex_put_var( exoid, 2, EX_ELEM_BLOCK, 14,  2147483647,  4, &vals_tension[1] ), "Unable to write elem block 1 var 1.\n" );
+  for(i=0; i < 6; i++){
+    EXCHECK( ex_put_var( exoid, 2, EX_ELEM_BLOCK, i+1,  200,  2, &vals_elem_var[1][2*i] ), "Unable to write elem block 1 var 1.\n" );
+    EXCHECK( ex_put_var( exoid, 2, EX_ELEM_BLOCK, i+7,  200,  2, &vals_elem_var[1][12+2*i] ), "Unable to write elem block 1 var 1.\n" );
+    EXCHECK( ex_put_var( exoid, 2, EX_NODE_SET,   i+1, 1000,  3, &vals_nset_var[1][3*i] ), "Unable to write elem block 1 var 1.\n" );
+    EXCHECK( ex_put_var( exoid, 2, EX_SIDE_SET,   i+1, 1600,  5, &vals_sset_var[1][5*i] ), "Unable to write elem block 1 var 1.\n" );
+  }
+  EXCHECK( ex_put_var( exoid, 2, EX_FACE_SET,  1, 1400,  2, vals_fset_var1fs1[1] ), "Unable to write face set 1 var 1.\n" );
+
+  EXCHECK( ex_put_nodal_var( exoid, 1, 1, 12, vals_nod_var[0] ), "Unable to write nodal var 1.\n" );
+  EXCHECK( ex_put_nodal_var( exoid, 2, 1, 12, vals_nod_var[1] ), "Unable to write nodal var 1.\n" );
+
+  EXCHECK( ex_close( exoid ),
+	   "Unable to close database.\n" );
+
+  return 0;
+}
+
+#if !defined(USING_CMAKE)
+int main( int argc, char* argv[] )
+{
+  return cCreateEdgeFace(argc, argv);
+}
+#endif
diff --git a/exodus/cbind/test/Makefile.standalone b/exodus/cbind/test/Makefile.standalone
new file mode 100644
index 0000000..ee256db
--- /dev/null
+++ b/exodus/cbind/test/Makefile.standalone
@@ -0,0 +1,184 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+EXOIITEST = -L../.. -lexodus
+LOCALEXO = ../../libexodus.a
+LIBS = $(LOCALEXO) $(NETCDF_LIB) -lm
+
+PROGS = testwt testwtd testrd testrd1 testrdd testwt1 testwt2 testwtm \
+	testwt_ss testwt_nossnsdf testrd_ss testrdwt testcp testcpd testcp_nl  \
+	testcp_ln testwt_clb testwt_nc testrd_nc testwt-zeroe testwt-zeron \
+	testwt-one-attrib create_mesh rd_wt_mesh \
+	testwt-partial testwt-nsided testrd-nsided testwt-nfaced \
+	testrd-nfaced testwt-long-name testrd-long-name \
+	oned twod MakeTestData test_nemesis 
+
+all:: check
+
+oned:       oned.o       $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)       oned.o   $(LIBS) $(LDFLAGS) 
+
+twod:       twod.o       $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)       twod.o   $(LIBS) $(LDFLAGS) 
+
+MakeTestData: MakeTestData.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS) MakeTestData.o   $(LIBS) $(LDFLAGS) 
+
+testwt:     testwt.o     $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)     testwt.o   $(LIBS) $(LDFLAGS) 
+
+testwt_clb: testwt_clb.o $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS) testwt_clb.o   $(LIBS) $(LDFLAGS) 
+
+testwtd:    testwtd.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testwtd.o   $(LIBS) $(LDFLAGS) 
+
+testrd:     testrd.o     $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)     testrd.o   $(LIBS) $(LDFLAGS) 
+
+testrd1:    testrd1.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testrd1.o   $(LIBS) $(LDFLAGS) 
+
+testrdd:    testrdd.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testrdd.o   $(LIBS) $(LDFLAGS) 
+
+testwt1:    testwt1.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testwt1.o   $(LIBS) $(LDFLAGS) 
+
+testwt2:    testwt2.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testwt2.o   $(LIBS) $(LDFLAGS) 
+
+testwtm:    testwtm.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testwtm.o   $(LIBS) $(LDFLAGS) 
+
+testwt_ss:  testwt_ss.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt_ss.o   $(LIBS) $(LDFLAGS) 
+
+testwt_nossnsdf:  testwt_nossnsdf.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt_nossnsdf.o   $(LIBS) $(LDFLAGS) 
+
+testrd_ss:  testrd_ss.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testrd_ss.o   $(LIBS) $(LDFLAGS) 
+
+testrdwt:   testrdwt.o   $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)   testrdwt.o   $(LIBS) $(LDFLAGS) 
+
+testcp:     testcp.o     $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)     testcp.o   $(LIBS) $(LDFLAGS) 
+
+testcpd:    testcpd.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    testcpd.o   $(LIBS) $(LDFLAGS) 
+
+testcp_nl : testcp_nl.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS) testcp_nl.o   $(LIBS) $(LDFLAGS) 
+
+testcp_ln : testcp_ln.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS) testcp_ln.o   $(LIBS) $(LDFLAGS) 
+
+testwt_nc:  testwt_nc.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt_nc.o   $(LIBS) $(LDFLAGS) 
+
+testrd_nc:  testrd_nc.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testrd_nc.o   $(LIBS) $(LDFLAGS) 
+
+testwt-long-name: testwt-long-name.o $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS) testwt-long-name.o   $(LIBS) $(LDFLAGS) 
+
+testrd-long-name: testrd-long-name.o $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS) testrd-long-name.o   $(LIBS) $(LDFLAGS) 
+
+testwt-zeroe:  testwt-zeroe.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt-zeroe.o   $(LIBS) $(LDFLAGS) 
+
+testwt-zeron:  testwt-zeron.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt-zeron.o   $(LIBS) $(LDFLAGS) 
+
+testwt-one-attrib:  testwt-one-attrib.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt-one-attrib.o   $(LIBS) $(LDFLAGS) 
+
+testwt-partial:  testwt-partial.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt-partial.o   $(LIBS) $(LDFLAGS) 
+
+testwt-nsided:  testwt-nsided.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt-nsided.o   $(LIBS) $(LDFLAGS) 
+
+testrd-nsided:  testrd-nsided.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testrd-nsided.o   $(LIBS) $(LDFLAGS) 
+
+testwt-nfaced:  testwt-nfaced.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testwt-nfaced.o   $(LIBS) $(LDFLAGS) 
+
+testrd-nfaced:  testrd-nfaced.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  testrd-nfaced.o   $(LIBS) $(LDFLAGS) 
+
+create_mesh:  create_mesh.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  create_mesh.o   $(LIBS) $(LDFLAGS) 
+
+rd_wt_mesh:   rd_wt_mesh.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)   rd_wt_mesh.o   $(LIBS) $(LDFLAGS) 
+
+CreateEdgeFace:  CreateEdgeFace.o  $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)  CreateEdgeFace.o   $(LIBS) $(LDFLAGS) 
+
+ReadEdgeFace:    ReadEdgeFace.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    ReadEdgeFace.o   $(LIBS) $(LDFLAGS) 
+
+test_nemesis:    test_nemesis.o    $(LOCALEXO)
+	$(CC) -o $@ $(CFLAGS)    test_nemesis.o   $(LIBS) $(LDFLAGS) 
+
+
+test:  check
+check: $(PROGS)
+	csh ./testall.standalone ${NCDUMP}
+
+clean::
+	rm -f  *.res $(PROGS)
+
+clean::
+	rm -f  *.exo
+
+clean::
+	rm -f  test.output
+
+clean::
+	rm -f  *.CKP *.ln *.BAK *.bak *.o *.M *.mod core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut   "#"*
+
+# ----------------------------------------------------------------------
+
+.SUFFIXES: .c
+.c.o:
+	$(CC) -c $(CFLAGS) $*.c
+
+# ----------------------------------------------------------------------
+# dependencies generated by makedepend or sfmakedepend
+
diff --git a/exodus/cbind/test/ReadEdgeFace.c b/exodus/cbind/test/ReadEdgeFace.c
new file mode 100644
index 0000000..39db8bf
--- /dev/null
+++ b/exodus/cbind/test/ReadEdgeFace.c
@@ -0,0 +1,464 @@
+/*
+ * Copyright (c) 2014, Sandia Corporation.
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#include "exodusII.h"
+#include <stdio.h>
+#include <stdlib.h> /* for malloc(), free() */
+#include <inttypes.h>
+
+#define EX_TEST_FILENAME "edgeFace.exo"
+
+#define EXCHECK(funcall,errmsg)\
+  if ( (funcall) < 0 ) \
+    { \
+      fprintf( stderr, errmsg ); \
+      return 1; \
+    }
+
+#define EXCHKPI(funcall,errmsg,sucmsg,ival)\
+  if ( (funcall) < 0 ) \
+    { \
+      fprintf( stderr, errmsg ); \
+      return 1; \
+    } else { \
+      fprintf( stdout, sucmsg, ival ); \
+    }
+
+ex_entity_type obj_types[] = {
+  EX_EDGE_BLOCK,
+  EX_FACE_BLOCK,
+  EX_ELEM_BLOCK,
+  EX_NODE_SET,
+  EX_EDGE_SET,
+  EX_FACE_SET,
+  EX_SIDE_SET,
+  EX_ELEM_SET,
+  EX_NODE_MAP,
+  EX_EDGE_MAP,
+  EX_FACE_MAP,
+  EX_ELEM_MAP
+};
+
+ex_inquiry obj_sizes[] = {
+  EX_INQ_EDGE_BLK,
+  EX_INQ_FACE_BLK,
+  EX_INQ_ELEM_BLK,
+  EX_INQ_NODE_SETS,
+  EX_INQ_EDGE_SETS,
+  EX_INQ_FACE_SETS,
+  EX_INQ_SIDE_SETS,
+  EX_INQ_ELEM_SETS,
+  EX_INQ_NODE_MAP,
+  EX_INQ_EDGE_MAP,
+  EX_INQ_FACE_MAP,
+  EX_INQ_ELEM_MAP,
+};
+
+const char* obj_typenames[] = {
+  "   Edge block",
+  "   Face block",
+  "Element block",
+  "    Node set",
+  "    Edge set",
+  "    Face set",
+  "    Side set",
+  " Element set",
+  "    Node map",
+  "    Edge map",
+  "    Face map",
+  " Element map"
+};
+
+const char* obj_typestr[] = {
+  "L",
+  "F",
+  "E",
+  "M",
+  "D",
+  "A",
+  "S",
+  "T",
+  0, /* maps have no result variables */
+  0,
+  0,
+  0,
+};
+
+int obj_sizeinq[] = {
+  EX_INQ_EDGE,
+  EX_INQ_FACE,
+  EX_INQ_ELEM,
+  EX_INQ_NS_NODE_LEN,
+  EX_INQ_ES_LEN,
+  EX_INQ_FS_LEN,
+  EX_INQ_SS_ELEM_LEN,
+  EX_INQ_ELS_LEN,
+  -1,
+  -1,
+  -1,
+  -1
+};
+
+#define OBJECT_IS_BLOCK(i) ((i>=0)&&(i<3))
+#define OBJECT_IS_SET(i) ((i>2)&&(i<8))
+
+int cReadEdgeFace( int argc, char* argv[] )
+{
+  int exoid;
+  int appWordSize = 8;
+  int diskWordSize = 8;
+  float exoVersion;
+  int itmp[5];
+  int* ids;
+  int nids;
+  int obj;
+  int i, j;
+  int num_timesteps;
+  int ti;
+  char** obj_names;
+  char** var_names;
+  int have_var_names;
+  int num_vars; /* number of variables per object */
+  int num_entries; /* number of values per variable per object */
+  double* entry_vals; /* variable values for each entry of an object */
+  ex_init_params modelParams;
+
+  exoid = ex_open( EX_TEST_FILENAME, EX_READ, &appWordSize, &diskWordSize, &exoVersion );
+  if ( exoid <= 0 )
+    {
+    fprintf( stderr, "Unable to open \"%s\" for reading.\n", EX_TEST_FILENAME );
+    return 1;
+    }
+
+  EXCHECK( ex_get_init_ext( exoid, &modelParams ),
+    "Unable to read database parameters.\n" );
+
+  fprintf( stdout,
+    "Title: <%s>\n"
+    "Dimension: %"PRId64"\n"
+    "Nodes: %"PRId64"\n"
+    "Edges: %"PRId64"\n"
+    "Faces: %"PRId64"\n"
+    "Elements: %"PRId64"\n"
+    "Edge Blocks: %"PRId64"\n"
+    "Face Blocks: %"PRId64"\n"
+    "Element Blocks: %"PRId64"\n"
+    "Node Sets: %"PRId64"\n"
+    "Edge Sets: %"PRId64"\n"
+    "Face Sets: %"PRId64"\n"
+    "Side Sets: %"PRId64"\n"
+    "Element Sets: %"PRId64"\n"
+    "Node Maps: %"PRId64"\n"
+    "Edge Maps: %"PRId64"\n"
+    "Face Maps: %"PRId64"\n"
+    "Element Maps: %"PRId64"\n",
+    modelParams.title, modelParams.num_dim,
+    modelParams.num_nodes, modelParams.num_edge, modelParams.num_face, modelParams.num_elem,
+    modelParams.num_edge_blk, modelParams.num_face_blk, modelParams.num_elem_blk,
+    modelParams.num_node_sets, modelParams.num_edge_sets, modelParams.num_face_sets,
+    modelParams.num_side_sets, modelParams.num_elem_sets,
+    modelParams.num_node_maps, modelParams.num_edge_maps, modelParams.num_face_maps,
+    modelParams.num_elem_maps );
+
+  num_timesteps = ex_inquire_int( exoid, EX_INQ_TIME );
+
+  /* *** NEW API *** */
+  for ( i = 0; i < sizeof(obj_types)/sizeof(obj_types[0]); ++i ) {
+    int* truth_tab = 0;
+    have_var_names = 0;
+
+    EXCHECK( ex_inquire( exoid, obj_sizes[i], &nids, 0, 0 ), "Object ID list size could not be determined.\n" );
+
+    if ( ! nids ) {
+      fprintf( stdout, "=== %ss: none\n\n", obj_typenames[i] );
+      continue;
+    } else {
+      fprintf( stdout, "=== %ss: %d\n", obj_typenames[i], nids );
+    }
+
+    ids = (int*) malloc( nids * sizeof(int) );
+    obj_names = (char**) malloc( nids * sizeof(char*) );
+    for ( obj = 0; obj < nids; ++obj )
+      obj_names[obj] = (char*) malloc( (MAX_STR_LENGTH + 1) * sizeof(char) );
+
+    EXCHECK( ex_get_ids( exoid, obj_types[i], ids ), "Could not read object ids.\n" );
+    EXCHECK( ex_get_names( exoid, obj_types[i], obj_names ), "Could not read object ids.\n" );
+
+    if ( (OBJECT_IS_BLOCK(i)) || (OBJECT_IS_SET(i)) ) {
+      int* tp;
+      EXCHECK( ex_get_var_param( exoid, obj_typestr[i], &num_vars ), "Could not read number of variables.\n" );
+
+      if ( num_vars && num_timesteps > 0 ) {
+        truth_tab = (int*) malloc( num_vars * nids * sizeof(int) );
+        EXCHECK( ex_get_var_tab( exoid, obj_typestr[i], nids, num_vars, truth_tab ), "Could not read truth table.\n" );
+        tp = truth_tab;
+        fprintf( stdout, "Truth:" );
+        for ( obj = 0; obj < nids; ++obj ) {
+          for ( j = 0; j < num_vars; ++j, ++tp ) {
+            fprintf( stdout, " %d", *tp );
+          }
+          fprintf( stdout, "\n      " );
+        }
+        fprintf( stdout, "\n" );
+
+        var_names = (char**) malloc( num_vars * sizeof(char*) );
+        for ( j = 0; j < num_vars; ++j )
+          var_names[j] = (char*) malloc( (MAX_STR_LENGTH + 1) * sizeof(char) );
+
+        EXCHECK( ex_get_var_names( exoid, obj_typestr[i], num_vars, var_names ), "Could not read variable names.\n" );
+        have_var_names = 1;
+      }
+    }
+
+    if ( ! have_var_names )
+      var_names = 0;
+
+    for ( obj = 0; obj < nids; ++obj ) {
+      if ( obj_names[obj] )
+        fprintf( stdout, "%s %3d (%s): ", obj_typenames[i], ids[obj], obj_names[obj] );
+      else
+        fprintf( stdout, "%s %3d: ", obj_typenames[i], ids[obj] );
+
+      if ( OBJECT_IS_BLOCK(i) ) {
+        int* nconn;
+        int* econn;
+        int* fconn;
+        int ele;
+        int ctr;
+        int num_attrs;
+        if ( obj_types[i] == EX_ELEM_BLOCK ) {
+          EXCHECK( ex_get_block( exoid, obj_types[i], ids[obj], 0, itmp, itmp+1, itmp+2, itmp+3, &num_attrs ),
+            "Could not read block params.\n" );
+          fprintf( stdout, "Entries: %3d Nodes/entry: %d Edges/entry: %d Faces/entry: %d Attributes: %d",
+            itmp[0], itmp[1], itmp[2], itmp[3], num_attrs );
+        } else {
+          EXCHECK( ex_get_block( exoid, obj_types[i], ids[obj], 0, itmp, itmp+1, 0, 0, &num_attrs ),
+            "Could not read block params.\n" );
+          fprintf( stdout, "Entries: %3d Nodes/entry: %d Attributes: %d", itmp[0], itmp[1], num_attrs );
+          itmp[2] = itmp[3] = 0;
+        }
+        fprintf( stdout, "\n   " );
+        num_entries = itmp[0];
+        nconn = itmp[1] ? (int*) malloc( itmp[1] * num_entries * sizeof(int) ) : 0;
+        econn = itmp[2] ? (int*) malloc( itmp[2] * num_entries * sizeof(int) ) : 0;
+        fconn = itmp[3] ? (int*) malloc( itmp[3] * num_entries * sizeof(int) ) : 0;
+        EXCHECK( ex_get_conn( exoid, obj_types[i], ids[obj], nconn, econn, fconn ), "Could not read connectivity.\n" );
+        for ( ele = 0; ele < num_entries; ++ele ) {
+          for ( ctr = 0; ctr < itmp[1]; ++ctr ) {
+            fprintf( stdout, " %2d", nconn[ele*itmp[1] + ctr] );
+          }
+          if ( itmp[2] ) {
+            fprintf( stdout, "  ++" );
+            for ( ctr = 0; ctr < itmp[2]; ++ctr ) {
+              fprintf( stdout, " %2d", econn[ele*itmp[2] + ctr] );
+            }
+          }
+          if ( itmp[3] ) {
+            fprintf( stdout, "  ++" );
+            for ( ctr = 0; ctr < itmp[3]; ++ctr ) {
+              fprintf( stdout, " %2d", fconn[ele*itmp[3] + ctr] );
+            }
+          }
+          fprintf( stdout, "\n   " );
+        }
+        if ( nconn ) free( nconn );
+        if ( econn ) free( econn );
+        if ( fconn ) free( fconn );
+
+        if ( num_attrs ) {
+          char** attr_names;
+          double* attr;
+          attr = (double*) malloc( num_entries * num_attrs * sizeof(double) );
+          attr_names = (char**) malloc( num_attrs * sizeof(char*) );
+          for ( j = 0; j < num_attrs; ++j )
+            attr_names[j] = (char*) malloc( (MAX_STR_LENGTH + 1) * sizeof(char) );
+
+          EXCHECK( ex_get_attr_names( exoid, obj_types[i], ids[obj], attr_names ), "Could not read attributes names.\n" );
+          EXCHECK( ex_get_attr( exoid, obj_types[i], ids[obj], attr ), "Could not read attribute values.\n" );
+
+          fprintf( stdout, "\n      Attributes:\n      ID " );
+          for ( j = 0; j < num_attrs; ++j )
+            fprintf( stdout, " %s", attr_names[j] );
+          fprintf( stdout, "\n" );
+          for ( j = 0; j < num_entries; ++j ) {
+            int k;
+            fprintf( stdout, "      %2d ", j + 1 );
+            for ( k = 0; k < num_attrs; ++k ) {
+              fprintf( stdout, " %4.1f", attr[ j * num_attrs + k ] );
+            }
+            fprintf( stdout, "\n" );
+          }
+
+          for ( j = 0; j < num_attrs; ++j )
+            free( attr_names[j] );
+          free( attr_names );
+          free( attr );
+        }
+
+      } else if ( OBJECT_IS_SET(i) ) {
+        int num_df;
+        int* set_entry;
+        int* set_extra;
+        double* set_df;
+        EXCHECK( ex_get_set_param( exoid, obj_types[i], ids[obj], &num_entries, &num_df ), "Could not read set parameters.\n" );
+
+        set_entry = (int*) malloc( num_entries * sizeof(int) );
+        set_extra = ( obj_types[i] != EX_NODE_SET && obj_types[i] != EX_ELEM_SET ) ?  (int*) malloc( num_entries * sizeof(int) ) : 0;
+        EXCHECK( ex_get_set( exoid, obj_types[i], ids[obj], set_entry, set_extra ), "Could not read set.\n" );
+        fprintf( stdout, "Entries: %3d Distribution factors: %3d\n", num_entries, num_df );
+        if ( set_extra ) {
+          for ( j = 0; j < num_entries; ++j )
+            fprintf( stdout, "      %2d %2d\n", set_entry[j], set_extra[j] );
+        } else {
+          for ( j = 0; j < num_entries; ++j )
+            fprintf( stdout, "      %2d\n", set_entry[j] );
+        }
+        free( set_entry );
+        if ( set_extra )
+          free( set_extra );
+
+        set_df = num_df ? (double*) malloc( num_df * sizeof(double) ) : 0;
+        if ( set_df ) {
+          EXCHECK( ex_get_set_dist_fact( exoid, obj_types[i], ids[obj], set_df ), "Could not read set distribution factors.\n" );
+          fprintf( stdout, "\n    Distribution factors:\n" );
+          for ( j = 0; j < num_df; ++j )
+            fprintf( stdout, "      %4.1f\n", set_df[j] );
+          free( set_df );
+        }
+
+
+      } else { /* object is map */
+        int* map;
+        switch (obj_types[i]) {
+        case EX_NODE_MAP:
+          num_entries = modelParams.num_nodes;
+          break;
+        case EX_EDGE_MAP:
+          num_entries = modelParams.num_edge;
+          break;
+        case EX_FACE_MAP:
+          num_entries = modelParams.num_face;
+          break;
+        case EX_ELEM_MAP:
+          num_entries = modelParams.num_elem;
+          break;
+	default:
+          num_entries = 0;
+        }
+        if ( num_entries ) {
+          fprintf( stdout, "Entries: %3d\n                :", num_entries );
+          map = (int*) malloc( num_entries * sizeof(int) );
+          EXCHECK( ex_get_num_map( exoid, obj_types[i], ids[obj], map ), "Could not read map.\n" );
+          for ( j = 0; j < num_entries; ++j ) {
+            fprintf( stdout, " %d", map[j] );
+          }
+        } else {
+          fprintf( stdout, "Entries: none" );
+        }
+      }
+      fprintf( stdout, "\n" );
+
+      /* Read results variables */
+      if ( ((OBJECT_IS_BLOCK(i)) || (OBJECT_IS_SET(i))) && num_vars && num_timesteps > 0 ) {
+        /* Print out all the time values to exercise get_var */
+        entry_vals = (double*) malloc( num_entries * sizeof(double) );
+        for ( j = 0; j < num_vars; ++j ) {
+          int k;
+          if ( ! truth_tab[num_vars * obj + j] )
+            continue;
+
+          fprintf( stdout, "      Variable: %s", var_names[j] );
+          for ( ti = 1; ti <= num_timesteps; ++ti ) {
+            EXCHECK( ex_get_var( exoid, ti, obj_types[i], 1 + j, ids[obj], num_entries, entry_vals ),
+              "Could not read variable values.\n" );
+
+            fprintf( stdout, "\n       @t%d ", ti );
+            for ( k = 0; k < num_entries; ++k ) {
+              fprintf( stdout, " %4.1f", entry_vals[k] );
+            }
+          }
+          fprintf( stdout, "\n" );
+        }
+        fprintf( stdout, "\n" );
+        free( entry_vals );
+      }
+    }
+
+    if ( ((OBJECT_IS_BLOCK(i)) || (OBJECT_IS_SET(i))) && num_vars && num_timesteps > 0 ) {
+      /* Print out one element's time values to exercise get_var_time */
+      entry_vals = (double*) malloc( num_timesteps * sizeof( double ) );
+      EXCHECK( ex_inquire( exoid, obj_sizeinq[i], itmp, 0, 0 ), "Inquire failed.\n" );
+      itmp[1] = 11;
+      while ( itmp[1] > itmp[0] ) itmp[1] /= 2;
+      for ( j = 0; j < num_vars; ++j ) {
+        /* FIXME: This works for the dataset created by CreateEdgeFace, but not for any dataset in general since
+         * NULL truth table entries may mean the referenced elements don't have variable values.
+         */
+        EXCHECK( ex_get_var_time( exoid, obj_types[i], j + 1, itmp[1], 1, num_timesteps, entry_vals ), "Could not read variable over time.\n" );
+        fprintf( stdout, "    Variable over time: %s  Entry: %3d ", var_names[j], itmp[1] );
+        for ( ti = 1; ti <= num_timesteps; ++ti )
+          fprintf( stdout, " @t%d: %4.1f", ti, entry_vals[ti-1] );
+        fprintf( stdout, "\n" );
+      }
+      free( entry_vals );
+    }
+
+    if ( var_names ) {
+      for ( j = 0; j < num_vars; ++j )
+        free( var_names[j] );
+      free( var_names );
+    }
+    if ( truth_tab )
+      free( truth_tab );
+    free( ids );
+
+    for ( obj = 0; obj < nids; ++obj )
+      free( obj_names[obj] );
+    free( obj_names );
+
+    fprintf( stdout, "\n" );
+  }
+
+  EXCHECK( ex_close( exoid ),
+    "Unable to close database.\n" );
+
+  return 0;
+}
+
+#if !defined(USING_CMAKE)
+int main( int argc, char* argv[] )
+{
+  return cReadEdgeFace(argc, argv);
+}
+#endif
diff --git a/exodus/cbind/test/create_mesh.c b/exodus/cbind/test/create_mesh.c
new file mode 100644
index 0000000..c93ed6a
--- /dev/null
+++ b/exodus/cbind/test/create_mesh.c
@@ -0,0 +1,1032 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <inttypes.h>
+
+#include "exodusII.h"
+
+#define DEFAULT_FILE_NAME       "mesh"
+#define DEFAULT_MAP_ORIGIN      1
+#define DEFAULT_NUM_DOMAINS     1
+#define DEFAULT_NUM_ELEMENTS    1000000
+#define DEFAULT_NUM_FIELDS      0
+#define DEFAULT_NUM_TIMESTEPS   1
+
+#define MAX_STRING_LEN          128
+#define NUM_BYTES_PER_INT       4
+#define NUM_NODES_PER_ELEM      8
+
+#define EBLK_ID 100000
+#define EXODUSII_FILE_TYPE      ".e"
+
+typedef double realtyp;
+
+typedef int64_t INT;
+
+INT
+StringToCount(char * size_str)
+{
+    INT size = 0;
+    char range;
+    int rc;
+
+    rc = sscanf(size_str, "%"PRId64"%c", &size, &range);
+    if (rc == 2) {
+        switch ((int)range) {
+        case 'k': case 'K': size *=       1000; break;
+        case 'm': case 'M': size *=    1000000; break;
+        case 'g': case 'G': size *= 1000000000; break;
+        }
+    } else if (rc == 0) {
+        size = -1;
+    }
+    return(size);
+} /* StringToCount() */
+
+void get_file_name(const char* base, const char* ext, int rank, int nprocs,
+                   const char* other,char *output);
+
+/* We need to do a cube-root to find the number of elements on each
+ * side of the cube, but don't want to link in -lm just for
+ * this. Use this routine which is better than
+ * a brute force approach. Found at
+ * http://www.hackersdelight.org/HDcode/icbrt.c
+ */
+INT icbrt(unsigned x) {
+   INT s;
+   unsigned y, b;
+
+   s = 30;
+   y = 0;
+   while(s >= 0) {              /* Do 11 times. */
+      y = 2*y;
+      b = (3*y*(y + 1) + 1) << s;
+      s = s - 3;
+      if (x >= b) {
+         x = x - b;
+         y = y + 1;
+      }
+   }
+   return y;
+}
+
+/* Prototypes */
+void create_rr_elem_map(
+        INT loc_num_elements,
+        INT *elem_map,
+        INT map_origin,
+        INT num_domains,
+        INT current_domain
+);
+
+void create_elem_map (
+        INT loc_num_elems, 
+        INT start, 
+        INT *elem_map,
+        INT map_origin
+);
+
+void create_local_connect(
+        INT *node_map,
+        INT len_node_map, 
+        INT len_connect,
+        INT *domain_connect, 
+        INT *loc_connect,
+        INT map_origin
+);
+
+void extract_connect(
+        INT element_offset,
+        INT num_elem,
+        INT *elem_map,
+        INT *connect, 
+        INT *domain_connect,
+        INT map_origin
+);
+
+void make_mesh(
+        realtyp   *x,
+        realtyp   *y,
+        realtyp   *z,
+        INT     *connect,
+        INT     map_origin,
+        INT     num_elements
+);
+
+void parse_input(
+        int     argc,
+        char    *argv[],
+        int     *debug,
+        INT     *map_origin,
+        INT     *num_elements, 
+        INT     *num_domains,
+        INT     *num_nodal_fields, 
+        INT     *num_global_fields, 
+        INT     *num_element_fields, 
+        INT     *num_timesteps, 
+        char    *device_name,
+        char    *file_name,
+        int     *exodus,
+	int     *compression_level,
+	int     *shuffle,
+	int     *int64bit
+);
+
+void write_exo_mesh(
+        int     debug,
+        char    *file_name,
+        INT     map_origin,
+        INT     num_nodes,
+        INT     num_elements,
+        INT     num_domains,
+        INT     num_nodal_fields,
+        INT     num_global_fields,
+        INT     num_element_fields,
+        INT     num_timesteps,
+        realtyp   *x,
+        realtyp   *y, 
+        realtyp   *z, 
+        INT     *connect,
+	int     compression_level,
+	int     shuffle,
+	int     int64bit
+);
+
+void create_node_map (INT len_map, INT len_connect, INT *domain_connect, INT *node_map,
+                      INT *loc_num_nodes, INT map_origin);
+
+INT bin_search2 (INT value, INT num, INT List[]);
+
+/***********************************************************************
+ *
+ *  Main function
+ * 
+ ***********************************************************************/
+
+int
+main( int argc, char *argv[] ) {
+  INT   *connect;
+  int   debug =         EX_FALSE;                  /* EX_TRUE, display debug information; EX_FALSE       */
+  /* otherwise.                                 */
+  static char device_name[MAX_STRING_LEN];
+  static char file_name[MAX_STRING_LEN] =       DEFAULT_FILE_NAME;
+  int   exodus =                EX_TRUE;
+  INT   map_origin =            DEFAULT_MAP_ORIGIN;     
+  INT   num_domains =           DEFAULT_NUM_DOMAINS;
+  INT   num_elements_1d;
+  INT   num_elements =          DEFAULT_NUM_ELEMENTS;
+  INT   num_nodal_fields =      DEFAULT_NUM_FIELDS;
+  INT   num_global_fields =     DEFAULT_NUM_FIELDS;
+  INT   num_element_fields =    DEFAULT_NUM_FIELDS;
+  INT   num_timesteps =         DEFAULT_NUM_TIMESTEPS;
+  INT   num_nodes;
+  int   compression_level = 0;
+  int   shuffle = 0;
+  int   int64bit = 0;
+  size_t size;
+  
+  realtyp *x;
+  realtyp *y;     
+  realtyp *z;     
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+  /* Parse Input */
+  parse_input(argc, argv, &debug, &map_origin,
+              &num_elements, &num_domains, &num_nodal_fields,
+              &num_global_fields, &num_element_fields, &num_timesteps, 
+              device_name,file_name, &exodus, &compression_level, &shuffle, &int64bit);
+        
+  /* Create Coordinates and Connectivity Array */
+  num_elements_1d = icbrt(num_elements);
+  num_nodes =   (num_elements_1d + 1) * (num_elements_1d + 1) * (num_elements_1d + 1);
+  x =           malloc( num_nodes * sizeof( realtyp ) );
+  y =           malloc( num_nodes * sizeof( realtyp ) );
+  z =           malloc( num_nodes * sizeof( realtyp ) );
+  assert(x != NULL && y != NULL && z != NULL);
+  
+  num_elements = num_elements_1d * num_elements_1d * num_elements_1d;
+  size = (size_t)NUM_NODES_PER_ELEM * num_elements * sizeof( INT );
+  assert(size > 0);
+  connect = malloc(size);
+  assert(connect != NULL);
+  
+  fprintf(stderr, "Creating a 3D mesh of %"PRId64" hex elements and %"PRId64" nodes.\n", num_elements, num_nodes);
+
+  make_mesh(x, y, z, connect, map_origin, num_elements_1d);
+  fprintf(stderr, "\t...Mesh topology created.\n");
+
+  /*
+   *    Write Out Mesh
+   */
+
+  if (exodus) {
+    write_exo_mesh(
+                   debug,
+                   file_name,
+                   map_origin,
+                   num_nodes,
+                   num_elements,
+                   num_domains,
+                   num_nodal_fields,
+                   num_global_fields,
+                   num_element_fields,
+                   num_timesteps,
+                   x,
+                   y,
+                   z,
+                   connect,
+		   compression_level,
+		   shuffle,
+		   int64bit
+                   );
+  }
+
+  free(x);
+  free(y);
+  free(z);
+  free(connect);
+  return 0;
+} /* end of main() */
+
+
+/***********************************************************************
+ ***********************************************************************/
+void parse_input(
+                 int  argc,
+                 char *argv[],
+                 int  *debug,
+                 INT  *map_origin,
+                 INT  *num_elements_1d, 
+                 INT  *num_domains,
+                 INT  *num_nodal_fields, 
+                 INT  *num_global_fields, 
+                 INT  *num_element_fields, 
+                 INT  *num_timesteps, 
+                 char *device_name,
+                 char *file_name,
+                 int  *exodus,
+		 int  *compression_level,
+		 int  *shuffle,
+		 int  *int64bit
+                 ) {
+  int arg = 0;  /* Argument index.      */
+
+  while ( ++arg < argc ) {
+    if ( strcmp( "-c", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_nodal_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-compress", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *compression_level = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-shuffle", argv[arg] ) == 0 ) {
+      *shuffle = 1;
+    }
+    else if ( strcmp( "-64", argv[arg] ) == 0 ) {
+      *int64bit = 1;
+    }
+    else if ( strcmp( "-nv", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_nodal_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-gv", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_global_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-ev", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_element_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-t", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_timesteps = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-d", argv[arg] ) == 0 ) {
+      *debug = EX_TRUE;
+    }
+    else if ( strcmp( "-f", argv[arg] ) == 0 ) { 
+      if ( ++arg < argc ) strcpy( file_name, argv[arg] );
+    }
+    else if ( strcmp( "-m", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *map_origin = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-n", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_elements_1d = StringToCount( argv[arg] );
+    }
+    else if ( strcmp( "-p", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_domains = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-x", argv[arg] ) == 0 ) {
+      *exodus = EX_TRUE;
+    }
+    else if ( (strcmp( "-h", argv[arg] ) == 0) || (strcmp( "-u", argv[arg] ) == 0) ) {
+      printf( "                                                                \n" );
+      printf( "NAME                                                            \n" );
+      printf( "                                                                \n" );
+      printf( "create_mesh - creates a mesh file for performance benchmarking. \n" );
+      printf( "                                                                \n" );
+      printf( "SYNOPSIS                                                        \n" );
+      printf( "                                                                \n" );
+      printf( "create_mesh [-c fields] [-t timesteps] [-d] [-f file_name] \n" );
+      printf( "            [-m map_origin] [-n elements] [-p domains]          \n" );
+      printf( "            [-nv number] [-ev number] [-gv number] ");
+      printf( "            [-r] [-u] [-h] ");
+      printf( "[-x]" );
+      printf( "                 \n" );
+      printf( "                                                                \n" );
+      printf( "DESCRIPTION                                                     \n" );
+      printf( "                                                                \n" );
+      printf( "This program creates a 3-D mesh for performance benchmarking.   \n" );
+      printf( "The EXODUSII II database file(s) created by this       \n" );
+      printf( "prrogram is/are read by the rd_wt_mesh program to perform the   \n" );
+      printf( "actual benchmark.                                               \n" );
+      printf( "                                                                \n" );
+      printf( "OPTIONS                                                         \n" );
+      printf( "                                                                \n" );
+      printf( "-c  fields     number of nodal   fields. Default: %d            \n", DEFAULT_NUM_FIELDS   );
+      printf( "-nv fields     number of nodal   fields. Default: %d            \n", DEFAULT_NUM_FIELDS   );
+      printf( "-ev fields     number of element fields. Default: %d           \n", DEFAULT_NUM_FIELDS   );
+      printf( "-gv fields     number of global  fields. Default: %d            \n", DEFAULT_NUM_FIELDS   );
+      printf( "-t timesteps   number of timesteps. Default: %d                 \n", DEFAULT_NUM_TIMESTEPS);
+      printf( "-d             display debug information.                         \n" );
+      printf( "-f file_name   file name prefix for all created files:          \n" );
+      printf( "                                                                \n" );
+      printf( "                  'file_name'_n%s [EXODUSII II file]              \n", EXODUSII_FILE_TYPE );
+      printf( "                                                                \n" );
+      printf( "               where n varies from 0 to number of domains-1.  \n" );
+      printf( "               Default: %s                                      \n", DEFAULT_FILE_NAME       );
+      printf( "-h             display help/usage information.                  \n" );
+      printf( "-m map_origin  element map origin. Default: %d                  \n", DEFAULT_MAP_ORIGIN    );
+      printf( "-n elements    number of elements in mesh   \n" );
+      printf( "               Can suffix with 'k', 'm', 'g' for thousand, million, billion\n");
+      printf( "               elements/file = elements/number_of_domains.      \n" );
+      printf( "               Default: %d                                      \n", DEFAULT_NUM_ELEMENTS);
+      printf( "-p domains     number of domains. Default: %d                   \n", DEFAULT_NUM_DOMAINS   );
+      printf( "-compress val  set compression to level 'val' [0..9]            \n" );
+      printf( "-shuffle       enable hdf5-shuffle                              \n" );
+      printf( "-64            enable 64-bit integers                           \n" );
+      printf( "-u             display help/usage information.                  \n" );
+
+      exit( 0 );
+    }   
+    else {
+      fprintf(stderr,  "Unknown option: %s\n", argv[arg]                                    );
+      fprintf(stderr,  "Enter create_mesh -h for description of valid options.\n"           );
+                        
+      exit( 0 );
+    }
+  }
+
+  return;
+}
+
+/***********************************************************************
+ *
+ *  Create the coordinates and connectivity array for the mesh
+ * 
+ ***********************************************************************/
+
+void make_mesh(
+        realtyp   *x,
+        realtyp   *y,
+        realtyp   *z,
+        INT     *connect,
+        INT     map_origin,
+        INT     num_elements_1d
+) {
+  size_t i, j, k, m, base, cnt;
+  size_t elp1sq = (num_elements_1d+1) * (num_elements_1d+1);
+
+  /* create global coordinates */
+
+  for (m=0, k=0; m < (num_elements_1d+1); m++) {
+    for (i=0; i < (num_elements_1d+1); i++) {
+      for (j=0; j < (num_elements_1d+1); j++, k++) {
+	x[k] = (realtyp)j;
+	y[k] = (realtyp)i;
+	z[k] = (realtyp)m;
+      }
+    }
+  }
+
+  /* build connectivity array (node list) for mesh */
+
+  for (m=0, k=0, cnt=0; m < num_elements_1d; m++) {
+    for (i=0, k=0; i < num_elements_1d; i++) {
+      for (j=0; j < num_elements_1d; j++, k++) {
+	base = (m*elp1sq) + k + i + map_origin;
+	connect[cnt++] = base;
+	connect[cnt++] = base+1;
+	connect[cnt++] = base+num_elements_1d+2;
+	connect[cnt++] = base+num_elements_1d+1;
+	
+	connect[cnt++] = elp1sq + base;
+	connect[cnt++] = elp1sq + base+1;
+	connect[cnt++] = elp1sq + base+num_elements_1d+2;
+	connect[cnt++] = elp1sq + base+num_elements_1d+1;
+      }
+    }
+  }
+} /* end of make_mesh() */
+
+/***********************************************************************
+ ***********************************************************************/
+void write_exo_mesh(
+                    int debug,
+                    char        *file_name,
+                    INT map_origin,
+                    INT num_nodes,
+                    INT num_elements,
+                    INT num_domains,
+                    INT num_nodal_fields,
+                    INT num_global_fields,
+                    INT num_element_fields,
+                    INT num_timesteps,
+                    realtyp *x,
+                    realtyp *y,
+		    realtyp *z,    
+                    INT *connect,
+		    int compression_level,
+		    int shuffle,
+		    int int64bit
+                    ) {
+  int CPU_word_size=sizeof(realtyp);
+  int IO_word_size=sizeof(realtyp);
+  int exoid, err, num_dim, num_elem_blk, num_node_sets, num_side_sets;
+  INT i, j, t, index, loc_num_elements, loc_num_nodes, len_connect;
+  INT *elem_map = NULL, *node_map = NULL, *domain_connect = NULL, *loc_connect = NULL;
+  int *elem_var_tab;
+  INT accum_num_elements = 0;
+  INT loc_node_size = -1;
+  
+  realtyp *loc_xcoords = NULL;
+  realtyp *loc_ycoords = NULL;
+  realtyp *loc_zcoords = NULL;
+  realtyp *globals = NULL;
+
+  char temporary_name[MAX_STRING_LEN];
+  char **var_name;
+
+  accum_num_elements = 0;
+  for (i=0; i<num_domains; i++) {
+    int mymode = EX_MAPS_INT64_API|EX_BULK_INT64_API|EX_IDS_INT64_API;
+    if (int64bit) {
+      mymode |= EX_MAPS_INT64_DB|EX_BULK_INT64_DB|EX_IDS_INT64_DB;
+    }
+
+    /* create the EXODUSII file */
+    get_file_name(file_name, "e", i, num_domains, NULL, temporary_name);
+
+    exoid = ex_create (temporary_name, EX_CLOBBER|mymode, &CPU_word_size, &IO_word_size);
+
+    if (exoid < 0) {
+      fprintf(stderr, "after ex_create, error = %d\n", exoid);
+      exit(-1);
+    }
+
+    ex_set_option(exoid, EX_OPT_COMPRESSION_LEVEL, compression_level);
+    ex_set_option(exoid, EX_OPT_COMPRESSION_SHUFFLE, shuffle);
+    
+    if (num_domains > 1) {
+      /* Determine local number of elements */
+      if (num_elements < num_domains) 
+	{
+	  fprintf(stderr, "number of elements is less than number of domains.\n");
+	  if (i < num_elements) loc_num_elements = 1;
+	  else loc_num_elements = 0;
+	} else {
+	  loc_num_elements = num_elements / num_domains;
+	  if (i < (num_elements % num_domains)) loc_num_elements++;
+	}
+
+      len_connect = NUM_NODES_PER_ELEM * loc_num_elements;
+
+      /* malloc things we need */
+
+      if (i == 0) {  /* first time through; max size arrays occur on
+			first iteration */
+	elem_map =       malloc(loc_num_elements * sizeof(INT));
+	domain_connect = malloc(len_connect * sizeof(INT));
+	loc_connect =    malloc(len_connect * sizeof(INT));
+	node_map =       malloc(num_nodes * sizeof(INT));
+      }
+
+      /* Create element local/global map */
+      create_elem_map(
+		      loc_num_elements,
+		      accum_num_elements,
+		      elem_map,
+		      map_origin
+		      );
+    
+      /* Extract current domain's connectivity, referencing global node ids */
+      extract_connect(accum_num_elements,
+		      loc_num_elements,
+		      elem_map,
+		      connect,
+		      domain_connect,
+		      map_origin);
+
+      accum_num_elements += loc_num_elements;
+
+      /* The local/global node map is just the current domain's connectivity,
+	 sorted with duplicate entries removed */
+      create_node_map (num_nodes, len_connect, domain_connect, node_map, &loc_num_nodes, map_origin);
+
+      /* Using local/global node map, convert the domain connectivity 
+	 (referencing global node ids) to local connectivity (referencing 
+	 local node ids) */
+
+      create_local_connect(
+			   node_map,
+			   loc_num_nodes, 
+			   len_connect,
+			   domain_connect,
+			   loc_connect,
+			   map_origin
+			   );
+    } else {
+      loc_num_elements = num_elements;
+      loc_num_nodes    = num_nodes;
+    }
+
+    if ( debug ) {
+      fprintf(stderr, "\n\n\n");
+
+      fprintf(stderr, "\n domain: %"PRId64"\n", i);
+      fprintf(stderr, "\n loc_num_elements: %"PRId64"\n", loc_num_elements);
+      fprintf(stderr, "\n loc_num_nodes: %"PRId64"\n", loc_num_nodes);
+    }
+
+    num_dim = 3;
+    num_elem_blk = 1;
+    num_node_sets = 0;
+    num_side_sets = 0;
+
+    err = ex_put_init (exoid, "This is an EXODUSII performance test.", num_dim, 
+                       loc_num_nodes, loc_num_elements, num_elem_blk, 
+                       num_node_sets, num_side_sets);
+
+    if (err) {
+      fprintf(stderr, "after ex_put_init, error = %d\n", err);
+      ex_close (exoid);
+      exit(-1);
+    }
+
+    /* Extract the local x and y coordinates */
+    if (num_domains > 1) {
+      if (loc_num_nodes > loc_node_size) {  
+	loc_xcoords = realloc(loc_xcoords, loc_num_nodes * sizeof(realtyp));
+	loc_ycoords = realloc(loc_ycoords, loc_num_nodes * sizeof(realtyp));
+	loc_zcoords = realloc(loc_zcoords, loc_num_nodes * sizeof(realtyp));
+	loc_node_size = loc_num_nodes;
+      }
+      
+      for (j=0; j<loc_num_nodes; j++) {
+	index = node_map[j] - map_origin;
+	loc_xcoords[j] = x[index];
+	loc_ycoords[j] = y[index];
+	loc_zcoords[j] = z[index];
+      }
+      
+      err = ex_put_coord (exoid, loc_xcoords, loc_ycoords, loc_zcoords);
+    } else {
+      err = ex_put_coord (exoid, x, y, z);
+    }
+    if (err) {
+      fprintf(stderr, "after ex_put_coord, error = %d\n", err);
+      ex_close (exoid);
+      exit(-1);
+    }
+    if ( debug ) {
+      fprintf(stderr, "\tCoordinates output.\n");
+    }
+#if 1
+    {
+      INT ids[1] = {EBLK_ID};
+      INT num_elem_per_block[1];
+      char *names[1] = {"hex"};
+      INT num_node_per_elem[1];
+      INT num_attr_per_block[1];
+      int write_map = num_domains > 1 ? EX_TRUE : EX_FALSE;
+      num_elem_per_block[0] = loc_num_elements;
+      num_node_per_elem[0]  = NUM_NODES_PER_ELEM;
+      num_attr_per_block[0] = 0;
+      err = ex_put_concat_elem_block (exoid, ids, names, num_elem_per_block,
+				      num_node_per_elem, num_attr_per_block, write_map);
+    }
+#else
+    err = ex_put_elem_block 
+      (exoid, 10000000000, "hex", loc_num_elements, NUM_NODES_PER_ELEM, 0);
+#endif
+      
+    if (err) {
+      fprintf(stderr, "after ex_put_elem_block, error = %d\n", err);
+      ex_close (exoid);
+      exit(-1);
+    }
+
+    if (num_domains > 1) {
+      err = ex_put_elem_conn (exoid, EBLK_ID, loc_connect);
+    } else {
+      err = ex_put_elem_conn (exoid, EBLK_ID, connect);
+    }
+
+    if (err) {
+      fprintf(stderr, "after ex_put_elem_conn, error = %d\n", err);
+      ex_close (exoid);
+      exit(-1);
+    }
+
+    if ( debug ) {
+      fprintf(stderr, "\tConnectivity output.\n");
+    }
+    /* write out element and node maps */
+
+    if (num_domains > 1) {
+      err = ex_put_id_map (exoid, EX_NODE_MAP, node_map);
+      
+      if (err) {
+	fprintf(stderr, "after ex_put_id_map, error = %d\n", err);
+	ex_close (exoid);
+	exit(-1);
+      }
+      
+      err = ex_put_id_map (exoid, EX_ELEM_MAP, elem_map);
+      
+      if (err) {
+	fprintf(stderr, "after ex_put_id_map, error = %d\n", err);
+	ex_close (exoid);
+	exit(-1);
+      }
+      
+      if ( debug ) {
+	fprintf(stderr, "\tMaps output.\n");
+      }
+    }
+
+    /* write out simulated results fields;
+       we'll just write out the x coordinate field 'num_nodal_fields' times */
+    if (loc_num_nodes < loc_num_elements) {
+      fprintf(stderr, "INTERNAL ERROR: Programmer assumed number of nodes > number of elements, but that is not true.\n");
+      ex_close (exoid);
+      exit(-1);
+    }
+
+    if (num_element_fields > 0) {
+      elem_var_tab = malloc(num_element_fields * sizeof(int));
+      for (j = 0; j < num_element_fields; j++)
+        elem_var_tab[j] = 1;
+    } else {
+      elem_var_tab = 0;
+    }
+    err = ex_put_all_var_param(exoid,
+                               num_global_fields,
+                               num_nodal_fields,
+                               num_element_fields,
+                               elem_var_tab,
+                               0, 0, 0, 0);
+    if (err) {
+      fprintf(stderr, "after ex_put_all_var_param, error = %d\n", err);
+      ex_close (exoid);
+      exit(-1);
+    }
+
+    if (num_nodal_fields > 0) {
+
+      var_name = malloc (num_nodal_fields * sizeof(char *));
+      for (j=0; j<num_nodal_fields; j++) {
+        var_name[j] = malloc ((MAX_STRING_LEN+1) * sizeof (char));
+        sprintf (var_name[j], "node_field_%"PRId64, j+1);
+      }
+      err = ex_put_variable_names (exoid, EX_NODAL, num_nodal_fields, var_name);
+      for (j=0; j<num_nodal_fields; j++) {
+        free(var_name[j]);
+      }
+      free(var_name);
+    }
+
+    if (num_global_fields > 0) {
+      globals = malloc(num_global_fields * sizeof(realtyp));
+      var_name = malloc (num_global_fields * sizeof(char *));
+      for (j=0; j<num_global_fields; j++) {
+        var_name[j] = malloc ((MAX_STRING_LEN+1) * sizeof (char));
+        sprintf (var_name[j], "global_field_%"PRId64, j+1);
+        globals[j] = j;
+      }
+      err = ex_put_variable_names (exoid, EX_GLOBAL, num_global_fields, var_name);
+      for (j=0; j<num_global_fields; j++) {
+        free(var_name[j]);
+      }
+      free(var_name);
+    }
+
+    if (num_element_fields > 0) {
+      free(elem_var_tab);
+      var_name = malloc (num_element_fields * sizeof(char *));
+      for (j=0; j<num_element_fields; j++) {
+        var_name[j] = malloc ((MAX_STRING_LEN+1) * sizeof (char));
+        sprintf (var_name[j], "element_field_%"PRId64, j+1);
+      }
+      err = ex_put_variable_names (exoid, EX_ELEM_BLOCK, num_element_fields, var_name);
+      for (j=0; j<num_element_fields; j++) {
+        free(var_name[j]);
+      }
+      free(var_name);
+    }
+
+    if (num_nodal_fields+num_global_fields+num_element_fields > 0) {
+      fprintf(stderr, "Domain %"PRId64"/%"PRId64", Writing Timestep: ", i+1, num_domains);
+      for (t=0; t<num_timesteps; t++) {
+        realtyp time = t;
+        ex_put_time(exoid, t+1, &time);
+        fprintf(stderr, "%"PRId64", ", t+1);
+        if (num_global_fields > 0) {
+          err = ex_put_var(exoid, t+1, EX_GLOBAL, 1, 0, num_global_fields, globals);
+          if (err) {
+            fprintf(stderr, "after ex_put_global_var, error = %d\n", err);
+            ex_close (exoid);
+            exit(-1);
+          }
+        }
+        for (j=0; j<num_nodal_fields; j++) {
+          err = ex_put_var (exoid, t+1, EX_NODAL, j+1, 0, loc_num_nodes, x);
+          if (err) {
+            fprintf(stderr, "after ex_put_nodal_var, error = %d\n", err);
+            ex_close (exoid);
+            exit(-1);
+          }
+        }
+        for (j=0; j<num_element_fields; j++) {
+          err = ex_put_var (exoid, t+1, EX_ELEM_BLOCK, j+1, EBLK_ID, loc_num_elements, x);
+          if (err) {
+            fprintf(stderr, "after ex_put_element_var, error = %d\n", err);
+            ex_close (exoid);
+            exit(-1);
+          }
+        }
+      }
+      fprintf(stderr, "\n");
+    }
+
+    err = ex_close (exoid);
+
+    if (err) {
+      fprintf(stderr, "after ex_close, error = %d\n", err);
+      exit(-1);
+    }
+    if ( debug ) {
+      fprintf(stderr, "\tFile written.\n");
+    }
+  }
+
+  /*
+   * Free Memory
+   */
+
+  if (num_domains > 1) {
+    free( domain_connect );
+    free( elem_map       );
+    free( loc_connect    );
+    free( loc_xcoords    );
+    free( loc_ycoords    );
+    free( loc_zcoords    );
+    free( node_map       );
+  }
+  if (num_global_fields > 0)
+    free(globals);
+}
+
+/***********************************************************************
+ *
+ * Create element local/global map
+ *
+ * This puts contiguous groups of elements in each domain.  This is
+ * a somewhat reasonable map for a realistic application.
+ *
+ ***********************************************************************/
+void create_elem_map (
+        INT loc_num_elems, 
+        INT elem_num, 
+        INT *elem_map,
+        INT map_origin)
+{
+  INT i;
+
+  for (i=0; i<loc_num_elems; i++) {
+    elem_map[i] = map_origin + elem_num++;
+  }
+
+}
+
+/***********************************************************************
+ *
+ * Extract current domain's connectivity, referencing global node ids
+ *
+ * This extracts the "domain connectivity," that is, the connectivity 
+ * of the elements in the current domain.  The node ids in the domain 
+ * connectivity reference global node ids.
+ *
+ ***********************************************************************/
+
+void extract_connect(
+                     INT element_offset,
+                     INT num_elem,
+                     INT *elem_map,
+                     INT *connect, 
+                     INT *domain_connect,
+                     INT map_origin
+                     ) {
+  INT i, j, k, m, offset;
+
+  for (i=element_offset, j=0, m=0; j<num_elem; j++) {
+    if (elem_map[j] == i+map_origin) {  /* extract this element */
+      offset = (i * NUM_NODES_PER_ELEM);
+      for (k=offset; k < offset+NUM_NODES_PER_ELEM; k++) {
+        domain_connect[m++] = connect[k];
+      }
+      i++;
+    }
+  }
+}
+
+/***********************************************************************
+ *
+ * The local/global node map is just the current domain's connectivity,
+ * sorted, with duplicate entries removed.  This isn't obvious, but
+ * trust me.
+ *
+ ***********************************************************************/
+void create_node_map (INT len_map, INT len_connect, INT *domain_connect, INT *node_map,
+                      INT *loc_num_nodes, INT map_origin)
+{
+  INT cnt, i;
+
+  *loc_num_nodes = len_connect;
+
+  for (i = 0; i < len_map; i++) {
+    node_map[i] = 0;
+  }
+
+  for (i = 0; i < len_connect; i++) {
+    node_map[domain_connect[i]-map_origin] = 1;
+  }
+
+  cnt = 0;
+  for (i = 0; i < len_map; i++) {
+    if (node_map[i] > 0) {
+      node_map[cnt++] = i+map_origin;
+    }
+  }
+  *loc_num_nodes = cnt;
+}
+
+/***********************************************************************
+ *
+ * Using local/global node map, convert the domain connectivity 
+ * (referencing global node ids) to local connectivity (referencing 
+ * local node ids).
+ *
+ * This requires inverting the local/global map, a relatively expensive
+ * operation.  The procedure is:
+ *
+ *   for every entry in the domain connectivity
+ *     search the node map until found
+ *     set the value of the entry in the local connectivity to 
+ *       the index of the located value in the node map
+ *
+ ***********************************************************************/
+void create_local_connect(INT *node_map,
+                          INT len_node_map, 
+                          INT len_connect,
+                          INT *domain_connect, 
+                          INT *loc_connect,
+                          INT map_origin)
+{
+  INT i, index;
+
+  for (i=0; i<len_connect; i++) {
+    index = bin_search2 (domain_connect[i], len_node_map, node_map);
+    if (index != -1) {  /* found */
+      loc_connect[i] = index+map_origin;
+    } else {
+      fprintf (stderr, "error creating local connectivity; i = %"PRId64"\n", i);
+      exit (-1);
+    }
+  }
+}
+
+/*****************************************************************************
+ *
+ * Searches a monotonic list of values for the value, 'value'.
+ * It returns the index (0-based) of the first position found, which 
+ *   matches 'value'.
+ * The list is assumed to be monotonic, and consist of elements 
+ *   list[0], ..., list[n-1].
+ * If no position in list matches value, it returns the value -1.
+ *
+ *****************************************************************************/
+
+INT bin_search2 (INT value, INT num, INT List[])
+{
+  INT top, bottom = 0, middle, g_mid;
+
+  top = num - 1;
+  while (bottom <= top) {
+    middle = (bottom + top) >> 1;
+    g_mid = List[middle];
+    if (value < g_mid)
+      top = middle - 1;
+    else if (value > g_mid)
+      bottom = middle + 1;
+    else
+      return middle;     /* found */
+  }
+  return -1;
+} /* bin_search2 */
+
+/*****************************************************************************/
+void get_file_name(const char* base, const char* ext, int rank, int nprocs,
+                   const char* other,char *output)
+{
+  INT i1, iTemp1;
+  INT iMaxDigit=0, iMyDigit=0;
+  char cTemp[128];
+
+  output[0] = '\0';
+  strcpy(output, base);
+  strcat(output, ".");
+  strcat(output, ext);
+  if (other != NULL) {
+    strcat(output, ".");
+    strcat(output, other);
+  }
+  if (nprocs > 1) {
+    /*
+     * Find out the number of digits needed to specify the processor ID.
+     * This allows numbers like 01-99, i.e., prepending zeros to the
+     * name to preserve proper alphabetic sorting of the files.
+     */
+
+    iTemp1 = nprocs;
+    do {
+      iTemp1 /= 10;
+      iMaxDigit++;
+    }
+    while(iTemp1 >= 1);
+  
+    iTemp1 = rank;
+    do {
+      iTemp1 /= 10;
+      iMyDigit++;
+    }
+    while(iTemp1 >= 1);
+
+    strcat(output, ".");
+    sprintf(cTemp, "%d", nprocs);
+    strcat(output, cTemp);
+    strcat(output, ".");
+
+    /*
+     * Append the proper number of zeros to the filename.
+     */
+    for(i1=0; i1 < iMaxDigit-iMyDigit; i1++)
+      strcat(output, "0");
+
+    sprintf(cTemp, "%d", rank);
+    strcat(output, cTemp);
+  }
+}
diff --git a/exodus/cbind/test/exodus_unit_tests.gold b/exodus/cbind/test/exodus_unit_tests.gold
new file mode 100644
index 0000000..5ad773f
--- /dev/null
+++ b/exodus/cbind/test/exodus_unit_tests.gold
@@ -0,0 +1,41 @@
+************************************************************************
+************************************************************************
+testwt - single precision write test...
+testrd - single precision read test...
+testcp_ss - single-to-single precision copy test...
+testcp_sd - single-to-double precision copy test...
+testcp_ln - large model to normal model single precision copy test...
+testcp_nl - normal_model to large_model single precision copy test...
+testwt_clb - single precision write test using concatenated puts...
+testwtd - double precision write test...
+testrdd - double precision read test...
+testcp_dd - double-to-double precision copy test...
+testcp_ds - double-to-single precision copy test...
+testwt1 - single precision write files with several side sets...
+testwt1 ... [Expect WEDGE6 warning from this test]
+testrd1 - single precision read test of a file with several side sets...
+testrd1 ... [Expect file create failure error, NOCLOBBER]
+testrd1 ... [Expect failure locating elem var 1 for elem block 12]
+testwt_ss - write files to test side sets...
+testwt_ss ... [Expect WEDGE6 warning from this test]
+testrd_ss - read test of a file with several side sets...
+testrd_ss ... [Expect warning for NULL sidesets 30 and 31]
+testwt2 - single precision write 2 files (simultaneously open) test...
+testrdwt - read from one and write to another (simutaneously open) file...
+testwt_nc - write x y z components of coordinates separately...
+testrd_nc - read x y z components of coordinates separately...
+testwt-zeron - write file with zero nodes and elements...
+testrd - read test of file with zero nodes and elements...
+testwt-zeroe - write file with zero elements...
+testrd - read test of file with zero elements...
+testwt-one-attrib - read/write test of element attributes - read one at a time...
+testwt-nsided - write file with nsided elements...
+testrd-nsided - read file with nsided elements...
+testwt-nfaced - write file with nfaced elements...
+testrd-nfaced - read file with nfaced elements...
+testwt-long-name - write file with long (64-character) names...
+testrd - read long name file truncating to 32 characters on read...
+testrd-long-name - read long name file...
+test_nemesis - read long name file...
+************************************************************************
+************************************************************************
diff --git a/exodus/cbind/test/makedmp b/exodus/cbind/test/makedmp
new file mode 100644
index 0000000..4ef0372
--- /dev/null
+++ b/exodus/cbind/test/makedmp
@@ -0,0 +1,122 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to save dump files.
+#
+# testwt - single precision write test
+echo "testwt ..."
+echo "begin testwt" > test.output
+testwt >> test.output
+echo "end testwt" >> test.output
+ncdump -d5,5 test.exo > test.dmp 
+
+# testrd - single precision read test
+echo "testrd ..."
+testrd > testrd.dmp 
+
+# testcp_ss - single-to-single precision copy test
+echo "testcp_ss ..."
+echo "begin testcp_ss" >> test.output
+testcp >> test.output
+echo "end testcp_ss" >> test.output
+ncdump -d5,5 testcp.exo > testcp_ss.dmp 
+
+# testcp_sd - single-to-double precision copy test
+echo "testcp_sd ..."
+echo "begin testcp_sd" >> test.output
+testcpd >> test.output
+echo "end testcp_sd" >> test.output
+ncdump -d5,5 testcpd.exo > testcp_sd.dmp 
+
+# testwtd - double precision write test
+echo "testwtd ..."
+echo "begin testwtd" >> test.output
+testwtd >> test.output
+echo "end testwtd" >> test.output
+ncdump -d5,5 test.exo > testd.dmp 
+
+# testrdd - double precision read test
+echo "testrdd ..."
+testrdd > testrdd.dmp 
+
+# testcp_dd - double-to-double precision copy test
+echo "testcp_dd ..."
+echo "begin testcp_dd" >> test.output
+testcpd >> test.output
+echo "end testcp_dd" >> test.output
+ncdump -d5,5 testcpd.exo > testcp_dd.dmp 
+
+# testcp_ds - double-to-single precision copy test
+echo "testcp_ds ..."
+echo "begin testcp_ds" >> test.output
+testcp >> test.output
+echo "end testcp_ds" >> test.output
+ncdump -d5,5 testcp.exo > testcp_ds.dmp 
+
+# testwt1 - single precision write files with several side sets
+echo "testwt1 ..."
+echo "begin testwt1" >> test.output
+testwt1 >> test.output
+echo "end testwt1" >> test.output
+ncdump -d5,5 test.exo > test1.dmp 
+
+# testrd1 - single precision read test of a file with several side sets
+echo "testrd1 ..."
+testrd1 > testrd1.dmp 
+
+# testwt_ss - write file to test side sets
+echo "testwt_ss ..."
+echo "begin testwt_ss" >> test.output
+testwt_ss >> test.output
+echo "end testwt_ss" >> test.output
+ncdump -d5,5 test.exo > testwt_ss.dmp 
+
+# testrd_ss - read test of a file with several side sets
+echo "testrd_ss ..."
+testrd_ss > testrd_ss.dmp 
+
+# testwt2 - single precision write 2 files (simultaneously open) test
+echo "testwt2 ..."
+echo "begin testwt2" >> test.output
+testwt2 >> test.output
+echo "end testwt2" >> test.output
+ncdump -d5,5 test.exo > test2-1.dmp 
+ncdump -d5,5 test2.exo > test2-2.dmp 
+
+# testrdwt - read from one and write to another (simutaneously open) file
+echo "testrdwt ..."
+echo "begin testrdwt" >> test.output
+testrdwt >> test.output
+echo "end testrdwt" >> test.output
+ncdump -d5,5 test2.exo > test2.dmp 
+
diff --git a/exodus/cbind/test/oned.c b/exodus/cbind/test/oned.c
new file mode 100644
index 0000000..a5083e2
--- /dev/null
+++ b/exodus/cbind/test/oned.c
@@ -0,0 +1,426 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "exodusII.h"
+
+#define EXCHECK(FUNC) \
+  do { if ( (FUNC) < 0 ) {\
+           fprintf(stderr, "Error code %d returned after calling " #FUNC "\n"); \
+	   exit(1); \
+       } else {\
+	   fprintf(stderr, "Called " #FUNC " successfully\n"); \
+       }\
+     } while (0)
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100];
+   int ebids[10], nsids[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *nset_var_vals;
+   float time_value;
+   float x[100];
+   float attrib[10], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *block_names[10], *nset_names[10];
+   char *prop_names[2], *attrib_names[2];
+   char *title = "This is a test";
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("oned.e",         /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for oned.e, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   EXCHECK(ex_set_max_name_length(exoid, 40));
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 1;
+   num_nodes = 10;
+   num_elem = 10; /* 9 lines plus a point */
+   num_elem_blk = 3;
+   num_node_sets = 2;
+   num_side_sets = 0;
+
+   
+   EXCHECK(ex_put_init (exoid, title, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets, num_side_sets));
+
+   for (i=0; i < num_nodes; i++) {
+     x[i] = exp((float)i/10.0);
+   }
+   
+   EXCHECK(ex_put_coord (exoid, x, NULL, NULL));
+   
+   coord_names[0] = "xcoor";
+   EXCHECK(ex_put_coord_names (exoid, coord_names));
+   
+   /* Add nodal attributes */
+   EXCHECK(ex_put_attr_param(exoid, EX_NODAL, 0, 1));
+   
+   EXCHECK(ex_put_one_attr(exoid, EX_NODAL, 0, 1, x));
+   
+   attrib_names[0] = "Node_attr_1";
+   EXCHECK(ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names));
+
+   /* write element order map */
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++) {
+     elem_map[i-1] = 10*i;
+   }
+
+   EXCHECK(ex_put_map (exoid, elem_map));
+   free (elem_map);
+
+   /* write element block parameters */
+   block_names[0] = "left_side";
+   block_names[1] = "right_side";
+   block_names[2] = "center";
+
+   num_elem_in_block[0] = 4;
+   num_elem_in_block[1] = 5;
+   num_elem_in_block[2] = 1;
+
+   num_nodes_per_elem[0] = 2;
+   num_nodes_per_elem[1] = 2;
+   num_nodes_per_elem[2] = 1;
+
+   ebids[0] = 10;
+   ebids[1] = 20;
+   ebids[2] = 30;
+
+   EXCHECK(ex_put_elem_block (exoid, ebids[0], "line",  num_elem_in_block[0], num_nodes_per_elem[0], 1));
+   EXCHECK(ex_put_elem_block (exoid, ebids[1], "line",  num_elem_in_block[1], num_nodes_per_elem[1], 1));
+   EXCHECK(ex_put_elem_block (exoid, ebids[2], "point", num_elem_in_block[2], num_nodes_per_elem[2], 0));
+
+   /* Write element block names */
+   EXCHECK(ex_put_names(exoid, EX_ELEM_BLOCK, block_names));
+   
+   /* write element block properties */
+   prop_names[0] = "DENSITY";
+   EXCHECK(ex_put_prop_names(exoid,EX_ELEM_BLOCK,1,prop_names));
+   EXCHECK(ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], prop_names[0], 1.345));
+   EXCHECK(ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], prop_names[0], 10.995));
+   EXCHECK(ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], prop_names[0], 0.001));
+
+
+   /* write element connectivity */
+   connect = (int *) calloc(18, sizeof(int));
+   for (i=0; i < num_elem*2; i+=2) {
+     connect[i]   = i/2+1;
+     connect[i+1] = i/2+2;
+   }
+
+   EXCHECK(ex_put_conn (exoid, EX_ELEM_BLOCK, ebids[0], connect, NULL, NULL));
+   EXCHECK(ex_put_conn (exoid, EX_ELEM_BLOCK, ebids[1], connect+8, NULL, NULL));
+
+   /* Circle */
+   connect[0] = 5;
+   EXCHECK(ex_put_conn (exoid, EX_ELEM_BLOCK, ebids[2], connect, NULL, NULL));
+
+   /* write element block attributes */
+   for (i=0; i < num_elem; i++) {
+     attrib[i] = 3.14159 * i;
+   }
+   EXCHECK(ex_put_attr (exoid, EX_ELEM_BLOCK, ebids[0], attrib));
+   EXCHECK(ex_put_attr (exoid, EX_ELEM_BLOCK, ebids[1], attrib+num_elem_in_block[0]));
+
+   attrib_names[0] = "THICKNESS";
+   EXCHECK(ex_put_attr_names (exoid, EX_ELEM_BLOCK, ebids[0], attrib_names));
+   attrib_names[0] = "WIDTH";
+   EXCHECK(ex_put_attr_names (exoid, EX_ELEM_BLOCK, ebids[1], attrib_names));
+
+   /* write individual node sets */
+   num_nodes_in_nset[0] = 5;
+   num_nodes_in_nset[1] = 3;
+
+   nsids[0] = 20;
+   nsids[1] = 21;
+
+   EXCHECK(ex_put_node_set_param (exoid, nsids[0], 5, 5));
+
+   node_list[0] = 1;
+   node_list[1] = 3;
+   node_list[2] = 5;
+   node_list[3] = 7;
+   node_list[4] = 9;
+
+   dist_fact[0] = 1.0;
+   dist_fact[1] = 2.0;
+   dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0;
+   dist_fact[4] = 5.0;
+
+   EXCHECK(ex_put_node_set (exoid, nsids[0], node_list));
+   EXCHECK(ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact));
+
+   EXCHECK(ex_put_node_set_param (exoid, nsids[1], 3, 3));
+
+   node_list[0] = 2;
+   node_list[1] = 4;
+   node_list[2] = 6;
+
+   dist_fact[0] = 1.0;
+   dist_fact[1] = 2.0;
+   dist_fact[2] = 3.0;
+
+   EXCHECK(ex_put_node_set (exoid, nsids[1], node_list));
+   EXCHECK(ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact));
+
+   /* Write node set names */
+   nset_names[0] = "all_odd_nodes";
+   nset_names[1] = "some_even_nodes";
+
+   EXCHECK(ex_put_names(exoid, EX_NODE_SET, nset_names));
+   EXCHECK(ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4));
+
+   EXCHECK(ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5));
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   EXCHECK(ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array));
+   /* Add nodeset attributes */
+   EXCHECK(ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1));
+   
+   EXCHECK(ex_put_attr(exoid, EX_NODE_SET, nsids[0], x));
+   
+   attrib_names[0] = "Nodeset_attribute";
+   EXCHECK(ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names));
+
+   /* write QA records; test empty and just blank-filled records */
+   num_qa_rec = 2;
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   EXCHECK(ex_put_qa (exoid, num_qa_rec, qa_record));
+
+   /* write information records; test empty and just blank-filled records */
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   EXCHECK(ex_put_info (exoid, num_info, info));
+
+
+   /* write results variables parameters and names */
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   EXCHECK(ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars));
+   EXCHECK(ex_put_variable_names (exoid, EX_GLOBAL, num_glo_vars, var_names));
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "nod_var1";
+
+   EXCHECK(ex_put_variable_param (exoid, EX_NODAL, num_nod_vars));
+   EXCHECK(ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, var_names));
+
+   num_ele_vars = 3;
+   /*              0        1         2         3   */
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "this_variable_name_is_short";
+   var_names[1] = "this_variable_name_is_just_right";
+   var_names[2] = "this_variable_name_is_tooooo_long";
+
+   EXCHECK(ex_put_variable_param (exoid, EX_ELEM_BLOCK, num_ele_vars));
+   EXCHECK(ex_put_variable_names (exoid, EX_ELEM_BLOCK, num_ele_vars, var_names));
+
+   num_nset_vars = 3;
+     
+   var_names[0] = "ns_var0";
+   var_names[1] = "ns_var1";
+   var_names[2] = "ns_var2";
+     
+   EXCHECK(ex_put_variable_param (exoid, EX_NODE_SET, num_nset_vars));
+   EXCHECK(ex_put_variable_names (exoid, EX_NODE_SET, num_nset_vars, var_names));
+   
+
+   /* write element variable truth table */
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   EXCHECK(ex_put_truth_table(exoid, EX_ELEM_BLOCK, num_elem_blk, num_ele_vars, truth_tab));
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (num_elem, CPU_word_size);
+   nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+     /* write time value */
+     EXCHECK(ex_put_time (exoid, whole_time_step, &time_value));
+
+     /* write global variables */
+     for (j=0; j<num_glo_vars; j++) {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     EXCHECK(ex_put_var (exoid, whole_time_step, EX_GLOBAL, 0, 0, num_glo_vars, glob_var_vals));
+
+     /* write nodal variables */
+     for (k=1; k<=num_nod_vars; k++) {
+       for (j=0; j<num_nodes; j++) {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+       EXCHECK(ex_put_var (exoid, whole_time_step, EX_NODAL, k, 1, num_nodes, nodal_var_vals));
+     }
+
+     /* write element variables */
+     for (k=1; k<=num_ele_vars; k++) {
+       for (j=0; j<num_elem_blk; j++) {
+         for (m=0; m<num_elem_in_block[j]; m++) {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+         }
+         EXCHECK(ex_put_var (exoid, whole_time_step, EX_ELEM_BLOCK, k, ebids[j], num_elem_in_block[j], elem_var_vals));
+       }
+     }
+
+     /* write nodeset variables */
+     for (k=1; k<=num_nset_vars; k++) {
+       for (j=0; j<num_node_sets; j++) {
+         for (m=0; m<num_nodes_in_nset[j]; m++) {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+                              ((float)(m+1)*time_value);
+         }
+         EXCHECK(ex_put_var (exoid, whole_time_step, EX_NODE_SET, k, nsids[j],  num_nodes_in_nset[j], nset_var_vals));
+       }
+     }
+
+     whole_time_step++;
+
+     /* update the data file; this should be done at the end of every time step
+      * to ensure that no data is lost if the analysis dies
+      */
+     EXCHECK(ex_update (exoid));
+   }
+
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   free(nset_var_vals);
+
+
+/* close the EXODUS files */
+   EXCHECK(ex_close (exoid));
+   return 0;
+}
diff --git a/exodus/cbind/test/rd_wt_mesh.c b/exodus/cbind/test/rd_wt_mesh.c
new file mode 100644
index 0000000..9779704
--- /dev/null
+++ b/exodus/cbind/test/rd_wt_mesh.c
@@ -0,0 +1,1280 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+
+#define _FILE_OFFSET_BITS 64
+#define _LARGEFILE_SOURCE
+#define _LARGE_FILES 1
+
+#if defined(__LIBCATAMOUNT__)
+#include <catamount/dclock.h>
+#endif
+
+#ifdef HAVE_PARALLEL
+#include <mpi.h>
+#else
+#include <string.h>
+#include <time.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <float.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <assert.h>
+
+#include "exodusII.h"
+
+#define DEFAULT_NUM_FIELDS     0
+#define DEFAULT_FILE_NAME      "mesh"
+#define DEFAULT_NUM_ITERATIONS 1
+#define EXODUS_FILE_TYPE       "e"
+#define MBYTES                 (1024*1024)
+#define MAX_STRING_LEN         128
+#define NUM_NODES_PER_ELEM     8
+#define QUIT                   EX_FALSE
+#define WRITE_FILE_TYPE        "new"
+#define EBLK_ID 100000
+
+/*
+ *	Prototypes
+ */
+
+typedef double realtyp;
+
+void get_file_name(const char* base, const char* ext, int rank, int nprocs,
+		   const char* other,char *output);
+
+int parse_input(
+	int	argc,
+        char	*argv[],
+	int	*exodus,
+	int	*close_files,
+	char	*file_name,
+        int	*num_nodal_fields,
+	int     *num_global_fields,
+	int     *num_element_fields,
+	int     *files_per_domain,
+        int	*num_iterations,
+	int     *sleep_time
+);
+
+int read_exo_mesh ( char *file_name, int rank, int *ndim, int num_domains, int *num_nodal_fields,
+		    int *num_global_fields, int *num_element_fields,
+		    int *num_timesteps, 
+		    int sleep_time, int num_iterations, 
+                    int *num_nodes, int **node_map, 
+                    int *num_elems, int **elem_map,
+                    realtyp **x_coords, realtyp **y_coords, realtyp **z_coords, int **loc_connect );
+
+int write_exo_mesh ( char *file_name, int rank, int ndim, int num_domains, 
+		     int num_nodal_fields, int num_global_fields, int num_element_fields,
+		     int num_timesteps, int files_per_domain,
+		     int sleep_time, int num_iterations,
+                     int loc_num_nodes, int *node_map, 
+                     int loc_num_elems, int *elem_map,
+                     realtyp *x_coords, realtyp *y_coords, realtyp *z_coords, int *loc_connect, int close_files);
+
+double my_timer()
+{
+  double t1 = 0.0;
+
+#if !defined(__LIBCATAMOUNT__)
+#ifdef HAVE_PARALLEL
+  t1 = MPI_Wtime();
+#else
+  clock_t ctime = clock();
+  t1 = ctime / (double)CLOCKS_PER_SEC;
+#endif
+#else
+  return dclock();
+#endif
+  return t1;
+}
+
+/***********************************************************************
+ *
+ *  Main function
+ * 
+ ***********************************************************************/
+
+int main( int argc, char **argv )
+{
+  int rank, num_domains;
+  int quit=EX_FALSE;
+  int loc_num_nodes, loc_num_elems;
+  int *loc_connect = NULL;
+
+#ifdef HAVE_PARALLEL
+  MPI_Info     mpi_info_object = MPI_INFO_NULL;				/* Copy of MPI Info object.		*/
+#endif
+  int         *elem_map                   = NULL;
+  int          exodus =                     EX_TRUE;			/* EX_TRUE, perform EXODUS benchmark; EX_FALSE don't */
+  int          close_files = EX_FALSE;
+  char         file_name[MAX_STRING_LEN] =  DEFAULT_FILE_NAME;		/* Input file name.				*/
+  /* object, EX_FALSE otherwise. Should always be	*/
+  /* EX_TRUE in the current implementation.		*/
+  int          num_nodal_fields =           DEFAULT_NUM_FIELDS;
+  int          num_global_fields =          DEFAULT_NUM_FIELDS;
+  int          num_element_fields =         DEFAULT_NUM_FIELDS;
+  int          num_timesteps = 0;
+  int          sleep_time = 0;           
+  int          files_per_domain = 1;
+  int          num_iterations =             DEFAULT_NUM_ITERATIONS;
+#ifdef HAVE_PARALLEL
+  static const char *hints[] = {					/* List of MPI Info hints that if defined in	*/
+    "cb_buffer_size",							/* the environment process 0, will be used to	*/
+    "cb_nodes",								/* set key/value pairs in the MPI	*/
+    "ind_rd_buffer_size",						/* Info object.					*/
+    "ind_wr_buffer_size",
+    "cb_config_list",
+    "romio_cb_read",
+    "romio_cb_write",
+    "romio_ds_read",
+    "romio_ds_write",
+    "romio_no_indep_rw"
+  };
+  char         key_name[MAX_STRING_LEN];				/* MPI Info object key name.			*/
+  int          key;							/* MPI Info object key index.			*/
+  int          key_exists;						/* EX_TRUE, if the key exists in the MPI Info	*/
+  const int    nhints =                     10;                     	/* Number of items in hints list.		*/
+  int          nkeys;							/* Number of keys in a MPI Info object.		*/
+  char         value[MAX_STRING_LEN];					/* Value of a key/value pair in a MPI Info	*/
+#endif
+  /* object.					*/
+  realtyp       *x_coords = NULL;
+  realtyp       *y_coords = NULL;
+  realtyp       *z_coords = NULL;
+  int         ndim;
+#ifdef HAVE_PARALLEL
+  MPI_Info    new_mpi_info_object;	
+#endif
+  
+  /*
+   *	Initialize Stuff
+   */
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+#if defined(__LIBCATAMOUNT__)
+  setlinebuf(stderr);
+#endif
+
+#ifdef HAVE_PARALLEL
+  MPI_Init     ( &argc, &argv                 );
+  MPI_Comm_rank( MPI_COMM_WORLD, &rank        );
+  MPI_Comm_size( MPI_COMM_WORLD, &num_domains );
+#else
+  rank = 0;
+  num_domains = 1;
+#endif	
+  /*
+   *	Processor 0: parse the command line arguments.
+   */
+
+  if ( rank == 0 ) {
+    quit = (1 == parse_input(argc, argv,
+			    &exodus,	       &close_files,	       file_name,
+			    &num_nodal_fields, &num_global_fields, &num_element_fields,
+			     &files_per_domain, &num_iterations,    &sleep_time));
+  }
+
+
+  /*
+   *	Broadcast Input
+   */
+         
+#ifdef HAVE_PARALLEL
+  MPI_Bcast ( &quit,         	1,              MPI_INT,  0, MPI_COMM_WORLD );
+#endif
+  
+  if (quit) {
+#ifdef HAVE_PARALLEL
+    MPI_Finalize();
+#endif
+    exit(0);
+  }
+
+#ifdef HAVE_PARALLEL
+  MPI_Bcast( &exodus,		 1,              MPI_INT,  0, MPI_COMM_WORLD );
+  MPI_Bcast( &close_files,	 1,              MPI_INT,  0, MPI_COMM_WORLD );
+  MPI_Bcast( file_name,		 MAX_STRING_LEN, MPI_CHAR, 0, MPI_COMM_WORLD );
+  MPI_Bcast( &num_nodal_fields,	 1,              MPI_INT,  0, MPI_COMM_WORLD );
+  MPI_Bcast( &num_global_fields, 1,              MPI_INT,  0, MPI_COMM_WORLD );
+  MPI_Bcast( &num_element_fields,1,              MPI_INT,  0, MPI_COMM_WORLD );
+  MPI_Bcast( &num_iterations,	 1,              MPI_INT,  0, MPI_COMM_WORLD );
+  MPI_Bcast( &files_per_domain,	 1,              MPI_INT,  0, MPI_COMM_WORLD );
+
+  /* env_mpi_hints( nhints, hints ); */
+  {
+    char            *env;                           /* Contents of environmental variable.  */
+    int              hint;                          /* ROMIO hint index.                    */
+    char             hint_value[MAX_STRING_LEN];    /* ROMIO hint value.                    */
+    int              rank;                          /* MPI process rank.                    */
+
+    MPI_Comm_rank( MPI_COMM_WORLD, &rank );
+    /*      The "value" of the hint is obtained from the environment of
+     *      processor 0 only. The value is broadcast to the other
+     *      processors.
+     */
+    for ( hint = 0; hint < nhints; hint++ ) {
+      if ( rank == 0 ) {
+	env = getenv( hints[hint] );
+	if ( env != NULL )
+	  strcpy( hint_value, env );
+	else
+	  hint_value[0] = 0;
+      }
+      MPI_Bcast( hint_value, MAX_STRING_LEN, MPI_CHAR, 0, MPI_COMM_WORLD );
+      if ( hint_value[0] ) {
+	if ( mpi_info_object == MPI_INFO_NULL )
+	  MPI_Info_create( &mpi_info_object );
+	MPI_Info_set( mpi_info_object, hints[hint], hint_value );
+      }
+    }
+  }
+#endif
+
+  if (rank == 0) {
+    fprintf(stderr, "\nEXODUSII 3D Benchmark\n\n"              );
+    fprintf(stderr, "   Number of Domains\t\t%8d\n",      num_domains );
+    fprintf(stderr, "   Number of Files/Domain\t%8d\n",   files_per_domain );
+    fprintf(stderr, "   Number of Iterations\t\t%8d\n",   num_iterations );
+                 
+#ifdef HAVE_PARALLEL
+    if ( mpi_info_object != MPI_INFO_NULL ) {
+      fprintf(stderr, "   MPI Hint Status\n" );
+
+      MPI_Info_get_nkeys( mpi_info_object, &nkeys );
+
+      for ( key = 0; key < nkeys; key++ ) {
+	MPI_Info_get_nthkey( mpi_info_object, key, key_name                                );
+	MPI_Info_get       ( mpi_info_object, key_name, MAX_STRING_LEN, value, &key_exists );
+
+	fprintf(stderr, "      %s\t\t\t%s\n", key_name, value );
+      }
+
+      MPI_Info_free( &mpi_info_object );
+    }
+    else
+      fprintf(stderr, "   MPI Hint Status\tMPI_INFO_NULL\n" );     		          
+#endif
+  }
+
+  if ( exodus ) {
+    int *node_map = NULL;
+    if (0 == read_exo_mesh(file_name, rank, &ndim, num_domains, 
+			   &num_nodal_fields, &num_global_fields, &num_element_fields,
+			   &num_timesteps, sleep_time, num_iterations,
+			   &loc_num_nodes, &node_map, &loc_num_elems, &elem_map,
+			   &x_coords, &y_coords, &z_coords, &loc_connect)
+	) {
+      write_exo_mesh(file_name, rank, ndim, num_domains, 
+		     num_nodal_fields, num_global_fields, num_element_fields,
+		     num_timesteps, files_per_domain, sleep_time, num_iterations,
+		     loc_num_nodes, node_map,  loc_num_elems, elem_map, 
+		     x_coords, y_coords, z_coords, loc_connect, close_files);
+			
+      free( elem_map    );
+      free( loc_connect );
+      free( node_map    );
+      free( x_coords    );
+      free( y_coords    );
+      free( z_coords    );
+    }
+}
+#ifdef HAVE_PARALLEL
+  MPI_Finalize();
+#endif
+  return(0);
+}
+
+/***********************************************************************
+ *
+ *  Parse Input
+ * 
+ ***********************************************************************/
+
+int parse_input (int	argc,
+		 char	*argv[],
+		 int	*exodus,
+		 int    *close_files,
+		 char	*file_name,
+		 int	*num_nodal_fields,
+		 int	*num_global_fields,
+		 int	*num_element_fields,
+		 int    *files_per_domain,
+		 int	*num_iterations,
+		 int    *sleep_time) {
+  int arg = 0;	/* Argument index.	*/
+        
+  while ( ++arg < argc ) {
+    if ( strcmp( "-c", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_nodal_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-nv", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_nodal_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-gv", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_global_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-ev", argv[arg] ) == 0 ) {
+      if ( ++arg < argc ) *num_element_fields = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-f", argv[arg] ) == 0 ) { 
+      if ( ++arg < argc ) strcpy( file_name, argv[arg] );
+    }
+    else if ( strcmp( "-M", argv[arg] ) == 0 ) { 
+      if ( ++arg < argc ) *files_per_domain = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-i", argv[arg] ) == 0 ) { 
+      if ( ++arg < argc ) *num_iterations = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-w", argv[arg] ) == 0 ) { 
+      if ( ++arg < argc ) *sleep_time = atoi( argv[arg] );
+    }
+    else if ( strcmp( "-x", argv[arg] ) == 0 ) {
+      *exodus = EX_TRUE;
+    }
+    else if ( strcmp( "-C", argv[arg] ) == 0 ) {
+      *close_files = EX_TRUE;
+    }
+    else if ( (strcmp( "-h", argv[arg] ) == 0) || (strcmp( "-u", argv[arg] ) == 0) ) {
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "NAME                                                            \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "rd_wt_mesh - reads and writes a mesh in parallel for performance\n" );
+      fprintf(stderr, "             benchmarking.                                      \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "SYNOPSIS                                                        \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "rd_wt_mesh [-S] [-c fields] [-f file_name] [-h] [-i iterations] \n" );
+      fprintf(stderr, "           [-s] [-u] [-x] [-w]                                  \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "DESCRIPTION                                                     \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "This program reads and writes a mesh in parallel for performance\n" );
+      fprintf(stderr, "benchmarking. The first Exodus database file read by \n" );
+      fprintf(stderr, "this program is created by create_mesh. Performance summaries   \n" );
+      fprintf(stderr, "are written to stdout.                                          \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "OPTIONS                                                         \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "-c fields      number of fields. Default: %d                    \n", DEFAULT_NUM_FIELDS     );
+      fprintf(stderr, "-f file_name   file name prefix for all read files:             \n" );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "               'file_name'%s.nproc.rank [EXODUS II file]        \n", EXODUS_FILE_TYPE       );
+      fprintf(stderr, "                                                                \n" );
+      fprintf(stderr, "               Default: %s                                      \n", DEFAULT_FILE_NAME      );
+      fprintf(stderr, "-M files       number of files/domain. Default: 1               \n" );
+      fprintf(stderr, "-h             display help/usage information                   \n" );
+      fprintf(stderr, "-i iterations  number of iterations. Default: %d                \n", DEFAULT_NUM_ITERATIONS );
+      fprintf(stderr, "-C             minimize open files.                             \n" );
+      fprintf(stderr, "-u             display help/usage information                   \n" );
+      fprintf(stderr, "-w time        wait (sleep) specified time between timesteps.\n" );
+      return(1);
+    }
+    else {
+      fprintf(stderr, "Unknown option: %s\n", argv[arg]                         );
+      fprintf(stderr, "Enter rd_wt_mesh -h for description of valid options.\n" );
+                        
+      return(1);
+    }
+  }
+  return(0);
+}
+
+/***********************************************************************
+ ***********************************************************************/
+int read_exo_mesh (char *file_name, int rank, int *num_dim, int num_domains,
+		   int *num_nodal_fields, int *num_global_fields, int *num_element_fields,
+		   int *num_timesteps, 
+		   int sleep_time, int num_iterations,
+		   int *num_nodes, int **node_map,
+		   int *num_elems, int **elem_map,
+		   realtyp **x_coords, realtyp **y_coords, realtyp **z_coords, int **connect )
+
+{
+  int CPU_word_size=sizeof(realtyp);
+  int IO_word_size=0;
+  int exoid, err, num_elem_blk, num_node_sets, num_side_sets;
+  int num_nodes_per_elem, num_attrs, num_vars, i, iter;
+  size_t len_connect;
+  size_t file_size;
+  
+  struct stat  file_status;  
+  size_t glob_file_size;
+  size_t glob_raw_data_vol;
+  size_t raw_data_vol = 0;
+
+  float version;
+  realtyp *globals = NULL;
+  
+  double tstart, tend, t_tmp1, t_tmp2;
+  double raw_read_time, max_raw_read_time=0.0, min_raw_read_time=DBL_MAX;
+  double cum_raw_read_time=0.0;
+  double total_time, max_total_time=0.0, min_total_time=DBL_MAX;
+  double raw_sleep_time = 0.0;
+  double cum_total_time=0.0;
+
+  char tmp_name[MAX_STRING_LEN], title[MAX_STRING_LEN+1]; 
+  char type[MAX_STRING_LEN+1];
+
+  for (iter=0; iter<num_iterations; iter++) {
+    /* open the EXODUS file */
+    get_file_name(file_name, EXODUS_FILE_TYPE, rank, num_domains, NULL, tmp_name);
+    exoid = ex_open (tmp_name, EX_READ, &CPU_word_size, &IO_word_size, &version);
+      
+    if (exoid < 0) {
+      printf ("after ex_open\n");
+      return(1);
+    }
+
+    raw_read_time = 0.0;
+    raw_data_vol = 0;
+
+    tstart = my_timer();
+    
+
+    err = ex_get_init (exoid, title, num_dim, 
+		       num_nodes, num_elems, &num_elem_blk, 
+		       &num_node_sets, &num_side_sets);
+  
+    if (err) {
+      printf ("after ex_get_init, error = %d\n", err);
+      ex_close (exoid);
+      return(1);
+    }
+  
+    len_connect = (size_t)NUM_NODES_PER_ELEM * (*num_elems);
+  
+    /* malloc things we need */
+    if( iter == 0) {
+      *elem_map = malloc(sizeof(int) * (*num_elems));
+      assert(elem_map);
+      *connect =  malloc(sizeof(int) * len_connect );
+      assert(connect);
+      *node_map = malloc(sizeof(int) * (*num_nodes));
+      assert(node_map);
+      
+      *x_coords = malloc(sizeof(realtyp) * (*num_nodes));
+      assert(x_coords);
+      *y_coords = malloc(sizeof(realtyp) * (*num_nodes));
+      assert(y_coords);
+      *z_coords = malloc(sizeof(realtyp) * (*num_nodes));
+      assert(z_coords);
+    }
+  
+    t_tmp1 = my_timer();
+  
+    err = ex_get_coord (exoid, *x_coords, *y_coords, *z_coords);
+  
+    t_tmp2 = my_timer();
+  
+    raw_read_time += t_tmp2-t_tmp1;
+    raw_data_vol += sizeof(realtyp) * 3 * (*num_nodes);
+  
+    if (err) {
+      printf ("after ex_get_coord, error = %d\n", err);
+      ex_close (exoid);
+      return (1 );
+    }
+  
+    err = ex_get_block 
+      (exoid, EX_ELEM_BLOCK, EBLK_ID, type, num_elems, &num_nodes_per_elem, 0, 0, &num_attrs);
+  
+    if (err) {
+      printf ("after ex_get_elem_block, error = %d\n", err);
+      ex_close (exoid);
+      return( 1 );
+    }
+  
+    t_tmp1 = my_timer();
+  
+    err = ex_get_conn (exoid, EX_ELEM_BLOCK, EBLK_ID, *connect, 0, 0);
+  
+    t_tmp2 = my_timer();
+  
+    raw_read_time += t_tmp2-t_tmp1;
+    raw_data_vol += sizeof(int) * len_connect;
+  
+    if (err) {
+      printf ("after ex_get_elem_conn, error = %d\n", err);
+      ex_close (exoid);
+      return( 1 );
+    }
+  
+    /* read element and node maps */
+    t_tmp1 = my_timer();
+  
+    err = ex_get_id_map (exoid, EX_NODE_MAP, *node_map);
+    t_tmp2 = my_timer();
+    raw_data_vol += sizeof(int) * (*num_nodes);
+    raw_read_time += t_tmp2-t_tmp1;
+  
+    t_tmp1 = my_timer();
+    err = ex_get_id_map (exoid, EX_ELEM_MAP, *elem_map);
+    t_tmp2 = my_timer();
+    raw_data_vol += sizeof(int)*(*num_elems);
+    raw_read_time += t_tmp2-t_tmp1;
+  
+  
+    /* read results variables */
+    err = ex_get_variable_param (exoid, EX_NODAL, &num_vars);
+    
+    if (err) {
+      printf ("after ex_get_var_param, error = %d\n", err);
+      ex_close (exoid);
+      return( 1 );
+    }
+    *num_nodal_fields = num_vars;
+    
+    err = ex_get_variable_param (exoid, EX_GLOBAL, &num_vars);
+    
+    if (err) {
+      printf ("after ex_get_var_param, error = %d\n", err);
+      ex_close (exoid);
+      return( 1 );
+    }
+    *num_global_fields = num_vars;
+    if (*num_global_fields > 0) {
+      globals = malloc(*num_global_fields * sizeof(realtyp));
+      assert(globals);
+    }
+    
+    err = ex_get_variable_param (exoid, EX_ELEM_BLOCK, &num_vars);
+    
+    if (err) {
+      printf ("after ex_get_var_param, error = %d\n", err);
+      ex_close (exoid);
+      return( 1 );
+    }
+    *num_element_fields = num_vars;
+    
+    /* read number of timesteps */
+    *num_timesteps = ex_inquire_int (exoid, EX_INQ_TIME);
+    if (rank == 0) {
+      fprintf(stderr, "   Number of Elements\t\t%8d (per domain)\n",   *num_elems );
+      fprintf(stderr, "   Number of Nodes\t\t%8d (per domain)\n",      *num_nodes );
+      fprintf(stderr, "   Number of Global  Fields\t%8d\n", *num_global_fields);
+      fprintf(stderr, "   Number of Nodal   Fields\t%8d\n", *num_nodal_fields);
+      fprintf(stderr, "   Number of Element Fields\t%8d\n", *num_element_fields);
+      fprintf(stderr, "   Number of Timesteps\t\t%8d\n", *num_timesteps);
+      if (sleep_time > 0) {
+	fprintf(stderr, "   Timestep Sleep time\t%8d\n", sleep_time);
+      }
+    }		
+    
+    if (*num_nodal_fields+ *num_global_fields+ *num_element_fields > 0) {
+      int t;
+  
+      if (rank == 0) {
+	fprintf (stderr, "\nReading Timestep: ");
+      }
+      for (t = 0; t < *num_timesteps; t++) {
+	if (sleep_time > 0) {
+	  t_tmp1 = my_timer();
+	  sleep(sleep_time);
+	  t_tmp2 = my_timer();
+	  raw_sleep_time += t_tmp2-t_tmp1;
+	}
+	if (rank == 0) {
+	  fprintf(stderr," %d,", t+1);
+	}
+
+	for (i=1; i <= *num_nodal_fields; i++) {
+	  t_tmp1 = my_timer();
+	  err = ex_get_var (exoid, t+1, EX_NODAL, i, 0, *num_nodes, *x_coords);
+	  t_tmp2 = my_timer();
+  
+	  raw_read_time += t_tmp2-t_tmp1;
+	  raw_data_vol += sizeof(realtyp)*(*num_nodes);
+  
+	  if (err) {
+	    printf ("after ex_get_nodal_var, error = %d\n", err);
+	    ex_close (exoid);
+	    return( 1 );
+	  }
+	}
+
+	t_tmp1 = my_timer();
+	err = ex_get_var (exoid, t+1, EX_GLOBAL, 0, 0, *num_global_fields, globals);
+	t_tmp2 = my_timer();
+  
+	raw_read_time += t_tmp2-t_tmp1;
+	raw_data_vol += sizeof(realtyp) * *num_global_fields;
+  
+	if (err) {
+	  printf ("after ex_get_glob_vars, error = %d\n", err);
+	  ex_close (exoid);
+	  return( 1 );
+	}
+
+	for (i=1; i <= *num_element_fields; i++) {
+	  t_tmp1 = my_timer();
+	  err = ex_get_var (exoid, t+1, EX_ELEM_BLOCK, i, EBLK_ID, *num_elems, *x_coords);
+	  t_tmp2 = my_timer();
+  
+	  raw_read_time += t_tmp2-t_tmp1;
+	  raw_data_vol += sizeof(realtyp) * (*num_elems);
+  
+	  if (err) {
+	    printf ("after ex_get_elem_var, error = %d\n", err);
+	    ex_close (exoid);
+	    return( 1 );
+	  }
+	}
+      }
+	
+      if (rank == 0) {
+	fprintf(stderr,"\n");
+      }
+    }
+  
+    err = ex_close (exoid);
+    if (err) {
+      printf ("after ex_close, error = %d\n", err);
+      return ( 1 );
+    }
+    tend = my_timer();
+  
+    total_time = tend - tstart - raw_sleep_time;
+    if (total_time > max_total_time) max_total_time = total_time;
+    if (total_time < min_total_time) min_total_time = total_time;
+    cum_total_time += total_time;
+
+    if (raw_read_time > max_raw_read_time) max_raw_read_time = raw_read_time;
+    if (raw_read_time < min_raw_read_time) min_raw_read_time = raw_read_time;
+    cum_raw_read_time += raw_read_time;
+  }  /* end of for (iter...) */
+
+#ifdef HAVE_PARALLEL
+  MPI_Allreduce (&raw_data_vol, &glob_raw_data_vol, 1, MPI_LONG, MPI_SUM,
+		 MPI_COMM_WORLD);
+#else
+  glob_raw_data_vol = raw_data_vol;
+#endif
+  /*
+   *	Get File Sizes
+   *
+   *	Note: On ASCI Red, a specialized "stat", named "estat", was added to
+   *	accommodate file sizes upto 16GB.                          3/27/2002
+   */
+
+  if (stat( tmp_name, &file_status)) {
+    if ( rank == 0 ) 
+      fprintf ( stderr, "Exodus Read: cannot get %s file size.\n", tmp_name );
+    return( 1 );
+  }
+  else
+    file_size = file_status.st_size;
+
+#ifdef HAVE_PARALLEL
+  MPI_Allreduce(&file_size,
+		&glob_file_size,
+		1,
+		MPI_LONG,
+		MPI_SUM,
+                MPI_COMM_WORLD);
+#else
+  glob_file_size = file_size;
+#endif
+  
+  if ( rank == 0 ) {
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "   Exodus Read Results                                          \n" );
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "      Sizes (bytes)                                             \n" );
+    fprintf(stderr, "         File         %14ld                                   \n", (long)glob_file_size);
+    fprintf(stderr, "         Raw Data     %14ld                                   \n", (long)glob_raw_data_vol);
+    fprintf(stderr, "         Difference   %14ld (%5.2f%%)                         \n",
+	    (long)(glob_file_size - glob_raw_data_vol),
+	    (1.0*glob_file_size-1.0*glob_raw_data_vol)/(0.01*glob_file_size) );
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "      Times (sec)                 \t Minimum\t Maximum\t Average\n" );
+    fprintf(stderr, "         Raw Data Read (sec)     \t%8.4g\t%8.4g\t%8.4g         \n",
+	    min_raw_read_time, max_raw_read_time, cum_raw_read_time / num_iterations );
+    fprintf(stderr, "         All Other Read (sec)    \t        \t        \t%8.4g   \n",
+	    (cum_total_time - cum_raw_read_time) / num_iterations );
+    fprintf(stderr, "         Total Read (sec)        \t        \t        \t%8.4g   \n",
+	    cum_total_time / num_iterations );
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "      Input Bandwidths (MiB/sec)   \t Minimum\t Maximum\t Average\n" );
+    fprintf(stderr, "         Raw Data Read (MiB/sec)   \t%8.4g\t%8.4g\t%8.4g         \n",
+	    (double)glob_raw_data_vol / max_raw_read_time / MBYTES,
+	    (double)glob_raw_data_vol / min_raw_read_time / MBYTES,
+	    (double)glob_raw_data_vol / cum_raw_read_time / MBYTES * num_iterations);
+    fprintf(stderr, "         Raw + Meta Data Read (MiB/sec)\t        \t        \t%8.4g   \n",
+	    (double)glob_file_size / cum_total_time / MBYTES * num_iterations );
+  }
+  if (*num_global_fields > 0) 
+    free(globals);
+  return(0);
+}
+
+/***********************************************************************
+ ***********************************************************************/
+int write_exo_mesh (char *file_name, int rank, int num_dim, int num_domains, int num_nodal_fields,
+		    int num_global_fields, int num_element_fields, int num_timesteps,
+		    int files_per_domain, int sleep_time, int num_iterations,
+		    int num_nodes, int *node_map,
+		    int num_elems, int *elem_map,
+		    realtyp *x_coords, realtyp *y_coords, realtyp *z_coords, int *connect, int close_files )
+
+{
+  int CPU_word_size = sizeof(realtyp);
+  int IO_word_size  = sizeof(realtyp);
+  int j, t, npd, err, num_elem_blk, num_node_sets, num_side_sets;
+  int iter;
+  int *elem_var_tab = NULL;
+  size_t file_size;
+
+  struct stat  file_status; 
+  size_t glob_file_size;
+  size_t glob_raw_data_vol;
+  size_t raw_data_vol = 0;
+
+  realtyp *globals = NULL;
+
+  double raw_open_close_time = 0.0;
+  double cum_open_close_time = 0.0;
+  double min_raw_open_close_time = DBL_MAX;
+  double max_raw_open_close_time = 0.0;
+  double tstart, tend, t_tmp1, t_tmp2;
+  double raw_write_time, max_raw_write_time=0.0, min_raw_write_time=DBL_MAX;
+  double cum_raw_write_time=0.0;
+  double total_time, max_total_time=0.0, min_total_time=DBL_MAX;
+  double cum_total_time=0.0;
+  double raw_sleep_time=0.0;
+  double put_time_time=0.0;
+  
+  char tmp_name[MAX_STRING_LEN];
+  char base_name[MAX_STRING_LEN];
+  char **gvar_name = NULL;
+  char **nvar_name = NULL;
+  char **evar_name = NULL;
+
+  int *exoid = NULL;
+  exoid = malloc(files_per_domain * sizeof(int));
+
+  raw_open_close_time = 0.0;
+  for (iter=0; iter<num_iterations; iter++) {
+    if (!close_files) {
+      t_tmp1 = my_timer();
+      for (npd = 0; npd < files_per_domain; npd++) {
+	/* create the EXODUS file */
+	
+	sprintf(base_name, "%s_%d", file_name, npd);
+	get_file_name(base_name, EXODUS_FILE_TYPE, rank, num_domains, WRITE_FILE_TYPE, tmp_name);
+	exoid[npd] = ex_create (tmp_name, EX_CLOBBER, &CPU_word_size, &IO_word_size);
+	
+	if (exoid[npd] < 0) {
+	  printf ("after ex_create\n");
+	  free(exoid);
+	  return( 1 );
+	}
+      }
+      t_tmp2 = my_timer();
+      raw_open_close_time += (t_tmp2 - t_tmp1);
+    }
+    raw_write_time = 0.0;
+    raw_data_vol = 0;
+
+    tstart = my_timer();
+  
+    num_elem_blk = 1;
+    num_node_sets = 0;
+    num_side_sets = 0;
+  
+    for (npd = 0; npd < files_per_domain; npd++) {
+
+      if (close_files) {
+	/* create the EXODUS file */
+	sprintf(base_name, "%s_%d", file_name, npd);
+	get_file_name(base_name, EXODUS_FILE_TYPE, rank, num_domains, WRITE_FILE_TYPE, tmp_name);
+	exoid[npd] = ex_create (tmp_name, EX_CLOBBER, &CPU_word_size, &IO_word_size);
+	
+	if (exoid[npd] < 0) {
+	  printf ("after ex_create\n");
+	  free(exoid);
+	  return( 1 );
+	}
+      }
+      err = ex_put_init (exoid[npd], "This is an EXODUSII performance test.", num_dim, 
+			 num_nodes, num_elems, num_elem_blk, 
+			 num_node_sets, num_side_sets);
+  
+      if (err) {
+	printf ("after ex_put_init, error = %d\n", err);
+	ex_close (exoid[npd]);
+	free(exoid);
+
+	return( 1);
+      }
+  
+    
+#if 0
+      {
+	int ids[1] = {EBLK_ID};
+	int num_elem_per_block[1];
+	char *names[1] = {"hex"};
+	int num_node_per_elem[1];
+	int num_attr_per_block[1];
+	int write_map = num_domains > 1 ? EX_TRUE : EX_FALSE;
+	num_elem_per_block[0] = num_elems;
+	num_node_per_elem[0]  = NUM_NODES_PER_ELEM;
+	num_attr_per_block[0] = 0;
+	err = ex_put_concat_elem_block (exoid[npd], ids, names, num_elem_per_block,
+					num_node_per_elem, num_attr_per_block, write_map);
+      }
+#else
+      err = ex_put_block 
+	(exoid[npd], EX_ELEM_BLOCK, EBLK_ID, "hex", num_elems, NUM_NODES_PER_ELEM, 0, 0, 0);
+#endif
+      if (err) {
+	printf ("after ex_put_elem_block, error = %d\n", err);
+	ex_close (exoid[npd]);
+	free(exoid);
+	return( 1 );
+      }
+  
+      t_tmp1 = my_timer();
+      err = ex_put_coord (exoid[npd], x_coords, y_coords, z_coords);
+      t_tmp2 = my_timer();
+  
+      raw_write_time += t_tmp2-t_tmp1;
+      raw_data_vol += sizeof(realtyp)*num_dim * num_nodes;
+  
+      if (err) {
+	printf ("after ex_put_coord, error = %d\n", err);
+	ex_close (exoid[npd]);
+	free(exoid);
+
+	return( 1 );
+      }
+  
+      t_tmp1 = my_timer();
+      err = ex_put_elem_conn (exoid[npd], EBLK_ID, connect);
+      t_tmp2 = my_timer();
+  
+      raw_write_time += t_tmp2-t_tmp1;
+      raw_data_vol += sizeof(int) * num_elems * NUM_NODES_PER_ELEM;
+  
+      if (err) {
+	printf ("after ex_put_elem_conn, error = %d\n", err);
+	ex_close (exoid[npd]);
+	free(exoid);
+
+	return( 1);
+      }
+  
+      /* write out element and node maps */
+      t_tmp1 = my_timer();
+      err = ex_put_id_map (exoid[npd], EX_NODE_MAP, node_map);
+      t_tmp2 = my_timer();
+  
+      raw_write_time += t_tmp2-t_tmp1;
+      raw_data_vol += sizeof(int)*num_nodes;
+  
+      if (err) {
+	printf ("after ex_put_id_map, error = %d\n", err);
+	ex_close (exoid[npd]);
+	free(exoid);
+
+	return( 1 );
+      }
+  
+      t_tmp1 = my_timer();
+  
+      err = ex_put_id_map (exoid[npd], EX_ELEM_MAP, elem_map);
+  
+      t_tmp2 = my_timer();
+  
+      raw_write_time += t_tmp2-t_tmp1;
+      raw_data_vol += sizeof(int)*num_elems;
+  
+      if (err) {
+	printf ("after ex_put_id_map, error = %d\n", err);
+	ex_close (exoid[npd]);
+	free(exoid);
+
+	return( 1 );
+      }
+
+      /* write out simulated results fields;
+	 we'll just write out the x coordinate field 'num_element_fields' times */
+      if (num_element_fields > 0) {
+	if (npd == 0) {
+	  elem_var_tab = malloc(num_element_fields * sizeof(int));
+	  assert(elem_var_tab);
+	  for (j = 0; j < num_element_fields; j++)
+	    elem_var_tab[j] = 1;
+	}
+      } else {
+	elem_var_tab = 0;
+      }
+      err = ex_put_all_var_param(exoid[npd],
+				 num_global_fields,
+				 num_nodal_fields,
+				 num_element_fields,
+				 elem_var_tab,
+				 0, 0, 0, 0);
+      if (err) {
+	fprintf(stderr, "after ex_put_all_var_param, error = %d\n", err);
+	ex_close (exoid[npd]);
+	exit(1);
+      }
+
+      if (num_nodal_fields > 0) {
+
+	if (npd == 0) {
+	  nvar_name = malloc (num_nodal_fields * sizeof(char *));
+	  assert(nvar_name);
+	  for (j=0; j<num_nodal_fields; j++) {
+	    nvar_name[j] = malloc ((MAX_STRING_LEN+1) * sizeof (char));
+	    sprintf (nvar_name[j], "node_field_%d", j+1);
+	  }
+	}
+	err = ex_put_variable_names (exoid[npd], EX_NODAL, num_nodal_fields, nvar_name);
+	if (npd == files_per_domain-1) {
+	  for (j=0; j<num_nodal_fields; j++) {
+	    free(nvar_name[j]);
+	  }
+	  free(nvar_name);
+	}
+      }
+
+      if (num_global_fields > 0) {
+	if (npd == 0) {
+	  globals = malloc(num_global_fields * sizeof(realtyp));
+	  gvar_name = malloc (num_global_fields * sizeof(char *));
+	  for (j=0; j<num_global_fields; j++) {
+	    gvar_name[j] = malloc ((MAX_STRING_LEN+1) * sizeof (char));
+	    sprintf (gvar_name[j], "global_field_%d", j+1);
+	    globals[j] = j;
+	  }
+	}
+
+	err = ex_put_variable_names (exoid[npd], EX_GLOBAL, num_global_fields, gvar_name);
+	
+	if (npd == files_per_domain-1) {
+	  for (j=0; j<num_global_fields; j++) {
+	    free(gvar_name[j]);
+	  }
+	  free(gvar_name);
+	}
+      }
+
+      if (num_element_fields > 0) {
+	if (npd == 0) {
+	  evar_name = malloc (num_element_fields * sizeof(char *));
+	  for (j=0; j<num_element_fields; j++) {
+	    evar_name[j] = malloc ((MAX_STRING_LEN+1) * sizeof (char));
+	    sprintf (evar_name[j], "element_field_%d", j+1);
+	  }
+	}
+
+	err = ex_put_variable_names (exoid[npd], EX_ELEM_BLOCK, num_element_fields, evar_name);
+
+	if (npd == files_per_domain-1) {
+	  free(elem_var_tab);
+	  for (j=0; j<num_element_fields; j++) {
+	    free(evar_name[j]);
+	  }
+	  free(evar_name);
+	}
+      }
+      if (close_files) {
+	t_tmp1 = my_timer();
+	ex_close(exoid[npd]);
+	t_tmp2 = my_timer();
+	raw_open_close_time += (t_tmp2 - t_tmp1);
+      }
+    }
+    
+    if (num_nodal_fields+num_global_fields+num_element_fields > 0) {
+      if ( rank == 0 ) {
+	fprintf (stderr, "\nWriting Timestep: ");
+      }
+      for (t=0; t<num_timesteps; t++) {
+	for (npd = 0; npd < files_per_domain; npd++) {
+	  realtyp time = t;
+
+	  if (close_files) {
+	    float version;
+	    sprintf(base_name, "%s_%d", file_name, npd);
+	    t_tmp1 = my_timer();
+	    get_file_name(base_name, EXODUS_FILE_TYPE, rank, num_domains, WRITE_FILE_TYPE, tmp_name);
+	    exoid[npd] = ex_open(tmp_name, EX_WRITE, &CPU_word_size, &IO_word_size, &version);
+	    t_tmp2 = my_timer();
+	    raw_open_close_time += (t_tmp2 - t_tmp1);
+	  }
+
+	  if (sleep_time > 0) {
+	    t_tmp1 = my_timer();
+	    sleep(sleep_time);
+	    t_tmp2 = my_timer();
+	    raw_sleep_time += t_tmp2-t_tmp1;
+	  }
+	  t_tmp1 = my_timer();
+	  ex_put_time(exoid[npd], t+1, &time);
+	  t_tmp2 = my_timer();
+	  put_time_time  += t_tmp2-t_tmp1;
+	  if ( rank == 0) {
+	    if (npd == 0) {
+	      fprintf(stderr, " %d", t+1);
+	    } else {
+	      fprintf(stderr, ".");
+	    }
+	  }
+	  if (num_global_fields > 0) {
+	    t_tmp1 = my_timer();
+	    err = ex_put_var (exoid[npd], t+1, EX_GLOBAL, 1, 0, num_global_fields, globals);
+	    t_tmp2 = my_timer();
+	    raw_write_time += t_tmp2-t_tmp1;
+	    if (err) {
+	      fprintf(stderr, "after ex_put_global_var, error = %d\n", err);
+	      ex_close (exoid[npd]);
+	      exit(1);
+	    }
+	  }
+	  for (j=0; j<num_nodal_fields; j++) {
+	    t_tmp1 = my_timer();
+	    err = ex_put_var (exoid[npd], t+1, EX_NODAL, j+1, 0, num_nodes, x_coords);
+	    t_tmp2 = my_timer();
+	    raw_write_time += t_tmp2-t_tmp1;
+	    if (err) {
+	      fprintf(stderr, "after ex_put_nodal_var, error = %d\n", err);
+	      ex_close (exoid[npd]);
+	      exit(1);
+	    }
+	  }
+	  for (j=0; j<num_element_fields; j++) {
+	    t_tmp1 = my_timer();
+	    err = ex_put_var (exoid[npd], t+1, EX_ELEM_BLOCK, j+1, EBLK_ID, num_elems, x_coords);
+	    t_tmp2 = my_timer();
+	    raw_write_time += t_tmp2-t_tmp1;
+	    if (err) {
+	      fprintf(stderr, "after ex_put_element_var, error = %d\n", err);
+	      ex_close (exoid[npd]);
+	      exit(1);
+	    }
+	  }
+	  if (close_files) {
+	    t_tmp1 = my_timer();
+	    ex_close(exoid[npd]);
+	    t_tmp2 = my_timer();
+	    raw_open_close_time += (t_tmp2 - t_tmp1);
+	  }
+	}
+      }
+      
+      if ( rank == 0 ) {
+	fprintf(stderr, "\n");
+      }
+    }
+    t_tmp1 = my_timer();
+    if (!close_files) {
+      if ( rank == 0 ) {fprintf(stderr, "Closing database...");}
+      for (npd = 0; npd < files_per_domain; npd++) {
+	err = ex_close (exoid[npd]);
+	if (err) {
+	  printf ("after ex_close, error = %d\n", err);
+	  free(exoid);
+	  return( 1);
+	}
+      }
+      if ( rank == 0 ) {fprintf(stderr, "\n");}
+    }
+    t_tmp2 = my_timer();
+    raw_open_close_time += (t_tmp2 - t_tmp1);
+  
+    if ( rank == 0 ) {
+      fprintf(stderr, "ex_put_time = %5.2f seconds\n",put_time_time);
+    }
+    tend = my_timer();
+  
+    total_time = tend - tstart - raw_sleep_time;
+		
+    if (total_time > max_total_time) max_total_time = total_time;
+    if (total_time < min_total_time) min_total_time = total_time;
+
+    cum_total_time += total_time;
+
+    if (raw_write_time > max_raw_write_time) max_raw_write_time = raw_write_time;
+    if (raw_write_time < min_raw_write_time) min_raw_write_time = raw_write_time;
+
+    cum_raw_write_time += raw_write_time;
+
+    if (raw_open_close_time > max_raw_open_close_time) max_raw_open_close_time = raw_open_close_time;
+    if (raw_open_close_time < min_raw_open_close_time) min_raw_open_close_time = raw_open_close_time;
+
+    cum_open_close_time += raw_open_close_time;
+
+    
+    raw_data_vol += sizeof(realtyp)*(((size_t)num_nodes*num_nodal_fields) +
+		     (num_elems * num_element_fields) +
+		     (num_global_fields)) * num_timesteps*files_per_domain;
+  
+  }  /* end of for (iter...) */
+
+#ifdef HAVE_PARALLEL
+  MPI_Allreduce(
+		&raw_data_vol,
+		&glob_raw_data_vol,
+		1,
+		MPI_LONG,
+		MPI_SUM,
+               	MPI_COMM_WORLD
+		);
+#else
+  glob_raw_data_vol = raw_data_vol;
+#endif
+  /*
+   *	Get File Sizes
+   *
+   *	Note: On ASCI Red, a specialized "stat", named "estat", was added to
+   *	accommodate file sizes upto 16GB.                          3/27/2002
+   */
+
+  if (  stat( tmp_name, &file_status ) ) {
+    if ( rank == 0 ) 
+      fprintf ( stderr, "Exodus Write: cannot get %s file size.\n", tmp_name );
+  
+    free(exoid);
+    return( 1 );
+  }
+  else
+    file_size = file_status.st_size * files_per_domain;
+
+#ifdef HAVE_PARALLEL
+  MPI_Allreduce (&file_size, &glob_file_size, 1, MPI_LONG, MPI_SUM,
+                 MPI_COMM_WORLD);
+#else
+  glob_file_size = file_size;
+#endif
+  
+  if ( rank == 0 ) {
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "   Exodus Write Results                                         \n" );
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "      Sizes (bytes)                                             \n" );
+    fprintf(stderr, "         File         %14ld                                   \n", (long)glob_file_size);
+    fprintf(stderr, "         Raw Data     %14ld                                   \n", (long)glob_raw_data_vol);
+    fprintf(stderr, "         Difference   %14ld (%5.2f%%)                         \n",
+	    (long)(glob_file_size - glob_raw_data_vol),
+	    (1.0*glob_file_size-1.0*glob_raw_data_vol)/(0.01*glob_file_size) );
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "      Times                       \t Minimum\t Maximum\t Average\n" );
+    fprintf(stderr, "         Raw Data Write (sec)      \t%8.4g\t%8.4g\t%8.4g         \n",
+	    min_raw_write_time, max_raw_write_time, cum_raw_write_time / num_iterations );
+    fprintf(stderr, "         All Other Write (sec)     \t        \t        \t%8.4g   \n",
+	    (cum_total_time - cum_raw_write_time) / num_iterations );
+    fprintf(stderr, "         Open/Close Time (sec)     \t        \t        \t%8.4g   \n",
+	    cum_open_close_time / num_iterations );
+    fprintf(stderr, "         Total Write (sec)         \t        \t        \t%8.4g   \n",
+	    cum_total_time / num_iterations );
+    fprintf(stderr, "                                                                \n" );
+    fprintf(stderr, "      Output Bandwidths            \t Minimum\t Maximum\t Average\n" );
+    fprintf(stderr, "         Raw Data Write (MiB/sec)  \t%8.4g\t%8.4g\t%8.4g         \n",
+	    (double)glob_raw_data_vol / max_raw_write_time / MBYTES,
+	    (double)glob_raw_data_vol / min_raw_write_time / MBYTES,
+	    (double)glob_raw_data_vol / cum_raw_write_time / MBYTES * num_iterations);
+    fprintf(stderr, "         Raw + Meta Data Write (MiB/sec)        \t        \t%8.4g\n",
+	    (double)glob_file_size / cum_total_time / MBYTES * num_iterations );
+  }
+  free(exoid);
+  if (num_global_fields > 0) 
+    free(globals);
+  return(0);
+}
+
+/*****************************************************************************/
+void get_file_name(const char* base, const char* ext, int rank, int nprocs,
+		   const char* other,char *output)
+{
+  int i1, iTemp1;
+  int iMaxDigit=0, iMyDigit=0;
+  char cTemp[128];
+
+  output[0] = '\0';
+  strcpy(output, base);
+  strcat(output, ".");
+  strcat(output, ext);
+  if (other != NULL) {
+    strcat(output, ".");
+    strcat(output, other);
+  }
+
+  if (nprocs > 1) {
+    /*
+     * Find out the number of digits needed to specify the processor ID.
+     * This allows numbers like 01-99, i.e., prepending zeros to the
+     * name to preserve proper alphabetic sorting of the files.
+     */
+
+    iTemp1 = nprocs;
+    do {
+      iTemp1 /= 10;
+      iMaxDigit++;
+    }
+    while(iTemp1 >= 1);
+  
+    iTemp1 = rank;
+    do {
+      iTemp1 /= 10;
+      iMyDigit++;
+    }
+    while(iTemp1 >= 1);
+
+    strcat(output, ".");
+    sprintf(cTemp, "%d", nprocs);
+    strcat(output, cTemp);
+    strcat(output, ".");
+
+    /*
+     * Append the proper number of zeros to the filename.
+     */
+    for(i1=0; i1 < iMaxDigit-iMyDigit; i1++)
+      strcat(output, "0");
+
+    sprintf(cTemp, "%d", rank);
+    strcat(output, cTemp);
+  }
+}
diff --git a/exodus/cbind/test/test.dmp b/exodus/cbind/test/test.dmp
new file mode 100644
index 0000000..1f3d999
--- /dev/null
+++ b/exodus/cbind/test/test.dmp
@@ -0,0 +1,1025 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+	num_nset_var = 3 ;
+	num_sset_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATERIAL_PROPERTY_LONG_NAME_32CH" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	float nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	char name_nset_var(num_nset_var, len_name) ;
+	char name_sset_var(num_sset_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var1eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var2eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var3eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var1eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var2eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var3eb7(time_step, num_el_in_blk7) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+	float vals_sset_var1ss1(time_step, num_side_ss1) ;
+	float vals_sset_var1ss2(time_step, num_side_ss2) ;
+	float vals_sset_var1ss3(time_step, num_side_ss3) ;
+	float vals_sset_var1ss4(time_step, num_side_ss4) ;
+	float vals_sset_var1ss5(time_step, num_side_ss5) ;
+	float vals_sset_var2ss1(time_step, num_side_ss1) ;
+	float vals_sset_var2ss2(time_step, num_side_ss2) ;
+	float vals_sset_var2ss3(time_step, num_side_ss3) ;
+	float vals_sset_var2ss4(time_step, num_side_ss4) ;
+	float vals_sset_var2ss5(time_step, num_side_ss5) ;
+	float vals_sset_var3ss1(time_step, num_side_ss1) ;
+	float vals_sset_var3ss2(time_step, num_side_ss2) ;
+	float vals_sset_var3ss3(time_step, num_side_ss3) ;
+	float vals_sset_var3ss4(time_step, num_side_ss4) ;
+	float vals_sset_var3ss5(time_step, num_side_ss5) ;
+	float vals_nset_var1ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var1ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var2ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var2ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var3ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var3ns2(time_step, num_nod_ns2) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "block_1",
+  "block_2",
+  "block_3",
+  "block_4",
+  "block_5",
+  "block_6",
+  "block_7" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  6.1416 ;
+
+ attrib_name6 =
+  "THICKNESS" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  6.1416 ;
+
+ attrib_name7 =
+  "THICKNESS" ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56, 1.58, 1.6, 1.62, 1.64, 1.66,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84, 1.87, 1.9, 1.93, 1.96, 1.99,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68, 2.74, 2.8, 2.86, 2.92, 2.98,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96, 3.03, 3.1, 3.17, 3.24, 3.31,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24, 3.32, 3.4, 3.48, 3.56, 3.64,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52, 3.61, 3.7, 3.79, 3.88, 3.97,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
+    4.1, 4.2, 4.3 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56, 2.58, 2.6, 2.62, 2.64, 2.66,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12, 3.16, 3.2, 3.24, 3.28, 3.32,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68, 3.74, 3.8, 3.86, 3.92, 3.98,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96, 4.03, 4.1, 4.17, 4.24, 4.31,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24, 4.32, 4.4, 4.48, 4.56, 4.64,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52, 4.61, 4.7, 4.79, 4.88, 4.97,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 
+    5.1, 5.2, 5.3 ;
+
+ name_nod_var =
+  "node_variable_a_very_long_name_0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "this_variable_name_is_short",
+  "this_variable_name_is_just_right",
+  "this_variable_name_is_tooooo_lon" ;
+
+ name_nset_var =
+  "ns_var0",
+  "ns_var1",
+  "ns_var2" ;
+
+ name_sset_var =
+  "ss_var0",
+  "ss_var1",
+  "ss_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var1eb6 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var2eb6 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var3eb6 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var1eb7 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb7 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb7 =
+  12.01,
+  12.02,
+  12.03,
+  12.04,
+  12.05,
+  12.06,
+  12.07,
+  12.08,
+  12.09,
+  12.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+
+ vals_sset_var1ss1 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_sset_var1ss2 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_sset_var1ss3 =
+  8.01, 8.02, 8.03, 8.04, 8.05, 8.06, 8.07,
+  8.02, 8.04, 8.06, 8.08, 8.1, 8.12, 8.14,
+  8.03, 8.06, 8.09, 8.12, 8.15, 8.18, 8.21,
+  8.04, 8.08, 8.12, 8.16, 8.2, 8.24, 8.28,
+  8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35,
+  8.06, 8.12, 8.18, 8.24, 8.3, 8.36, 8.42,
+  8.07, 8.14, 8.21, 8.28, 8.35, 8.42, 8.49,
+  8.08, 8.16, 8.24, 8.32, 8.4, 8.48, 8.56,
+  8.09, 8.18, 8.27, 8.36, 8.45, 8.54, 8.63,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7 ;
+
+ vals_sset_var1ss4 =
+  9.01, 9.02, 9.03, 9.04, 9.05, 9.06, 9.07, 9.08,
+  9.02, 9.04, 9.06, 9.08, 9.1, 9.12, 9.14, 9.16,
+  9.03, 9.06, 9.09, 9.12, 9.15, 9.18, 9.21, 9.24,
+  9.04, 9.08, 9.12, 9.16, 9.2, 9.24, 9.28, 9.32,
+  9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35, 9.4,
+  9.06, 9.12, 9.18, 9.24, 9.3, 9.36, 9.42, 9.48,
+  9.07, 9.14, 9.21, 9.28, 9.35, 9.42, 9.49, 9.56,
+  9.08, 9.16, 9.24, 9.32, 9.4, 9.48, 9.56, 9.64,
+  9.09, 9.18, 9.27, 9.36, 9.45, 9.54, 9.63, 9.72,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8 ;
+
+ vals_sset_var1ss5 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08, 10.09, 10.1,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16, 10.18, 10.2,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24, 10.27, 10.3,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32, 10.36, 10.4,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48, 10.54, 10.6,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56, 10.63, 10.7,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72, 10.81, 10.9,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11 ;
+
+ vals_sset_var2ss1 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_sset_var2ss2 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var2ss3 =
+  9.01, 9.02, 9.03, 9.04, 9.05, 9.06, 9.07,
+  9.02, 9.04, 9.06, 9.08, 9.1, 9.12, 9.14,
+  9.03, 9.06, 9.09, 9.12, 9.15, 9.18, 9.21,
+  9.04, 9.08, 9.12, 9.16, 9.2, 9.24, 9.28,
+  9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35,
+  9.06, 9.12, 9.18, 9.24, 9.3, 9.36, 9.42,
+  9.07, 9.14, 9.21, 9.28, 9.35, 9.42, 9.49,
+  9.08, 9.16, 9.24, 9.32, 9.4, 9.48, 9.56,
+  9.09, 9.18, 9.27, 9.36, 9.45, 9.54, 9.63,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7 ;
+
+ vals_sset_var2ss4 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8 ;
+
+ vals_sset_var2ss5 =
+  11.01, 11.02, 11.03, 11.04, 11.05, 11.06, 11.07, 11.08, 11.09, 11.1,
+  11.02, 11.04, 11.06, 11.08, 11.1, 11.12, 11.14, 11.16, 11.18, 11.2,
+  11.03, 11.06, 11.09, 11.12, 11.15, 11.18, 11.21, 11.24, 11.27, 11.3,
+  11.04, 11.08, 11.12, 11.16, 11.2, 11.24, 11.28, 11.32, 11.36, 11.4,
+  11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4, 11.45, 11.5,
+  11.06, 11.12, 11.18, 11.24, 11.3, 11.36, 11.42, 11.48, 11.54, 11.6,
+  11.07, 11.14, 11.21, 11.28, 11.35, 11.42, 11.49, 11.56, 11.63, 11.7,
+  11.08, 11.16, 11.24, 11.32, 11.4, 11.48, 11.56, 11.64, 11.72, 11.8,
+  11.09, 11.18, 11.27, 11.36, 11.45, 11.54, 11.63, 11.72, 11.81, 11.9,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12 ;
+
+ vals_sset_var3ss1 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var3ss2 =
+  9.01, 9.02,
+  9.02, 9.04,
+  9.03, 9.06,
+  9.04, 9.08,
+  9.05, 9.1,
+  9.06, 9.12,
+  9.07, 9.14,
+  9.08, 9.16,
+  9.09, 9.18,
+  9.1, 9.2 ;
+
+ vals_sset_var3ss3 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7 ;
+
+ vals_sset_var3ss4 =
+  11.01, 11.02, 11.03, 11.04, 11.05, 11.06, 11.07, 11.08,
+  11.02, 11.04, 11.06, 11.08, 11.1, 11.12, 11.14, 11.16,
+  11.03, 11.06, 11.09, 11.12, 11.15, 11.18, 11.21, 11.24,
+  11.04, 11.08, 11.12, 11.16, 11.2, 11.24, 11.28, 11.32,
+  11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4,
+  11.06, 11.12, 11.18, 11.24, 11.3, 11.36, 11.42, 11.48,
+  11.07, 11.14, 11.21, 11.28, 11.35, 11.42, 11.49, 11.56,
+  11.08, 11.16, 11.24, 11.32, 11.4, 11.48, 11.56, 11.64,
+  11.09, 11.18, 11.27, 11.36, 11.45, 11.54, 11.63, 11.72,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8 ;
+
+ vals_sset_var3ss5 =
+  12.01, 12.02, 12.03, 12.04, 12.05, 12.06, 12.07, 12.08, 12.09, 12.1,
+  12.02, 12.04, 12.06, 12.08, 12.1, 12.12, 12.14, 12.16, 12.18, 12.2,
+  12.03, 12.06, 12.09, 12.12, 12.15, 12.18, 12.21, 12.24, 12.27, 12.3,
+  12.04, 12.08, 12.12, 12.16, 12.2, 12.24, 12.28, 12.32, 12.36, 12.4,
+  12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5,
+  12.06, 12.12, 12.18, 12.24, 12.3, 12.36, 12.42, 12.48, 12.54, 12.6,
+  12.07, 12.14, 12.21, 12.28, 12.35, 12.42, 12.49, 12.56, 12.63, 12.7,
+  12.08, 12.16, 12.24, 12.32, 12.4, 12.48, 12.56, 12.64, 12.72, 12.8,
+  12.09, 12.18, 12.27, 12.36, 12.45, 12.54, 12.63, 12.72, 12.81, 12.9,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13 ;
+
+ vals_nset_var1ns1 =
+  8.01, 8.02, 8.03, 8.04, 8.05,
+  8.02, 8.04, 8.06, 8.08, 8.1,
+  8.03, 8.06, 8.09, 8.12, 8.15,
+  8.04, 8.08, 8.12, 8.16, 8.2,
+  8.05, 8.1, 8.15, 8.2, 8.25,
+  8.06, 8.12, 8.18, 8.24, 8.3,
+  8.07, 8.14, 8.21, 8.28, 8.35,
+  8.08, 8.16, 8.24, 8.32, 8.4,
+  8.09, 8.18, 8.27, 8.36, 8.45,
+  8.1, 8.2, 8.3, 8.4, 8.5 ;
+
+ vals_nset_var1ns2 =
+  9.01, 9.02, 9.03,
+  9.02, 9.04, 9.06,
+  9.03, 9.06, 9.09,
+  9.04, 9.08, 9.12,
+  9.05, 9.1, 9.15,
+  9.06, 9.12, 9.18,
+  9.07, 9.14, 9.21,
+  9.08, 9.16, 9.24,
+  9.09, 9.18, 9.27,
+  9.1, 9.2, 9.3 ;
+
+ vals_nset_var2ns1 =
+  9.01, 9.02, 9.03, 9.04, 9.05,
+  9.02, 9.04, 9.06, 9.08, 9.1,
+  9.03, 9.06, 9.09, 9.12, 9.15,
+  9.04, 9.08, 9.12, 9.16, 9.2,
+  9.05, 9.1, 9.15, 9.2, 9.25,
+  9.06, 9.12, 9.18, 9.24, 9.3,
+  9.07, 9.14, 9.21, 9.28, 9.35,
+  9.08, 9.16, 9.24, 9.32, 9.4,
+  9.09, 9.18, 9.27, 9.36, 9.45,
+  9.1, 9.2, 9.3, 9.4, 9.5 ;
+
+ vals_nset_var2ns2 =
+  10.01, 10.02, 10.03,
+  10.02, 10.04, 10.06,
+  10.03, 10.06, 10.09,
+  10.04, 10.08, 10.12,
+  10.05, 10.1, 10.15,
+  10.06, 10.12, 10.18,
+  10.07, 10.14, 10.21,
+  10.08, 10.16, 10.24,
+  10.09, 10.18, 10.27,
+  10.1, 10.2, 10.3 ;
+
+ vals_nset_var3ns1 =
+  10.01, 10.02, 10.03, 10.04, 10.05,
+  10.02, 10.04, 10.06, 10.08, 10.1,
+  10.03, 10.06, 10.09, 10.12, 10.15,
+  10.04, 10.08, 10.12, 10.16, 10.2,
+  10.05, 10.1, 10.15, 10.2, 10.25,
+  10.06, 10.12, 10.18, 10.24, 10.3,
+  10.07, 10.14, 10.21, 10.28, 10.35,
+  10.08, 10.16, 10.24, 10.32, 10.4,
+  10.09, 10.18, 10.27, 10.36, 10.45,
+  10.1, 10.2, 10.3, 10.4, 10.5 ;
+
+ vals_nset_var3ns2 =
+  11.01, 11.02, 11.03,
+  11.02, 11.04, 11.06,
+  11.03, 11.06, 11.09,
+  11.04, 11.08, 11.12,
+  11.05, 11.1, 11.15,
+  11.06, 11.12, 11.18,
+  11.07, 11.14, 11.21,
+  11.08, 11.16, 11.24,
+  11.09, 11.18, 11.27,
+  11.1, 11.2, 11.3 ;
+}
diff --git a/exodus/cbind/test/test.exo_c b/exodus/cbind/test/test.exo_c
new file mode 100644
index 0000000..a1b78ba
--- /dev/null
+++ b/exodus/cbind/test/test.exo_c
@@ -0,0 +1,40 @@
+CDF
+
+	time_stepnum_dim	num_nodesnum_elem
+num_el_blk
+len_string	len_lineQfour
num_node_sets
num_side_setsnum_el_in_blk10num_nod_per_el10num_att_in_blk10num_el_in_blk11num_nod_per_el11num_att_in_blk11
num_nod_ns20
num_nod_ns21
num_el_ss30
num_nod_ss30
+num_qa_recnum_info
num_glo_var
num_nod_var
num_elem_var
typerversion?�G�titleThis is a test
 
+time_whole
L	el_blk_id�
node_set_ids�
side_set_ids	�coord@�
+coor_names	elem_map	$	connect10
+

	elem_type	quadjunk	,	connect11

	elem_type	quadjunk	<attrib10
+
	Lattrib11
	P	node_ns20	Tdist_fact_ns20	h	node_ns21
	|dist_fact_ns21
	�	elem_ss30	�	node_ss30	�dist_fact_ss30	�
+qa_recordsH	�
info_records�
+
vals_glo_var
P
name_glo_var

+�
vals_nod_var@
T
name_nod_var

name_elem_var

vals_elem_var1eb10
+
�vals_elem_var2eb10
+
�vals_elem_var3eb10
+
�vals_elem_var1eb11

�vals_elem_var2eb11

�vals_elem_var3eb11

�
elem_var_tab
4
+

?�?�?�@@?�?�?�?�?�xcoorycoor@I�@ć�defgh?�@@@@�@����?���@ff at FffPRONTO2Dpronto2d3/10/9215:41:33FASTQfastq2/10/9211:41:33This is the first information record.This is the second information record.This is the third information record.glo_varsnod_var0nod_var1ele_var0ele_var1ele_var2?�?�?�?�?�?�?�?�@@@@@@@@@@@�@�@�@�@�<#�
+<#�
+?�?�G�?��\?��
+?�
�?�ff?��?���@@��@G�@�@�\@33@�
+@z�@@@�@�@�@�@�<��
+<��
+?�?��\?�
�?��?�=q?���?�\)?��@@G�@�\@�
+@
�@ff@�@��@@@�@�@�@�@�<�<�?�?��
+?��?��?�\)?�33?�
+=?��H@@�@�
+@@�@	��@
�@
p�@@@�@�@�@�@�=#�
+=#�
+?�?�
�?�=q?�\)?�z�?���?��R?��
+@@�\@
�@�@
+=q@
��@\)@�@@@�@�@�@�@�=L��=L��?�?�ff?���?�33?���?�?�ff?���@@33@ff@	��@
��@@33@ff@@@�@�@�@�@�=u=u?�?��?�\)?�
+=?��R?�ff?�{?�@@�
+@�@
�@\)@33@
+=@�H@@@�@�@�@�@�=�\)=�\)?�?���?��?��H?��
+?���?�?��R@@z�@��@
p�@�@ff@�H@\)@@@�@�@�@�@�=��
+=��
+?�?�=q?�z�?��R?���?�33?�p�?Ǯ@@
�@
+=q@\)@z�@��@
�R@#�
+@@@�@�@�@�@�=�Q�=�Q�?�?��?�
+>?��\?�{?���?�
�?У�@@@
�@G�@
diff --git a/exodus/cbind/test/test1.dmp b/exodus/cbind/test/test1.dmp
new file mode 100644
index 0000000..32e58c1
--- /dev/null
+++ b/exodus/cbind/test/test1.dmp
@@ -0,0 +1,715 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 28 ;
+	num_elem = 8 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_node_maps = 1 ;
+	num_elem_maps = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 3 ;
+	num_el_in_blk2 = 2 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 3 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 3 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 3 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 1 ;
+	num_att_in_blk5 = 3 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 1 ;
+	num_att_in_blk6 = 3 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 6 ;
+	num_att_in_blk7 = 3 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 2 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int nm_prop1(num_node_maps) ;
+		nm_prop1:name = "ID" ;
+	char nmap_names(num_node_maps, len_name) ;
+	int node_map1(num_nodes) ;
+	int em_prop1(num_elem_maps) ;
+		em_prop1:name = "ID" ;
+	char emap_names(num_elem_maps, len_name) ;
+	int elem_map1(num_elem) ;
+	int elem_map2(num_elem) ;
+	int em_prop2(num_elem_maps) ;
+		em_prop2:_FillValue = 0 ;
+		em_prop2:name = "ORDER" ;
+	int em_prop3(num_elem_maps) ;
+		em_prop3:_FillValue = 0 ;
+		em_prop3:name = "NUMBER" ;
+	int nm_prop2(num_node_maps) ;
+		nm_prop2:_FillValue = 0 ;
+		nm_prop2:name = "NUMBER" ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "circle" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "sphere" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var1eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var1eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var2eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var3eb7(time_step, num_el_in_blk7) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is testwt1" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 
+    100, 50, 3, 6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 
+    100, 50, 0, 0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    0, 20, 6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nm_prop1 = 333 ;
+
+ nmap_names =
+  "Node_Map_111" ;
+
+ node_map1 = 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 
+    54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84 ;
+
+ em_prop1 = 111, 222 ;
+
+ emap_names =
+  "Element_Map_111",
+  "Element_Map_222" ;
+
+ elem_map1 = 1, 2, 3, 4, 5, 6, 7, 8 ;
+
+ elem_map2 = 2, 4, 6, 8, 10, 12, 14, 16 ;
+
+ em_prop2 = 1, _ ;
+
+ em_prop3 = _, 1 ;
+
+ nm_prop2 = 1 ;
+
+ attrib1 =
+  1, 2, 3 ;
+
+ attrib_name1 =
+  "",
+  "",
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  1.11, 2.11, 3.11,
+  1.12, 2.12, 3.12 ;
+
+ attrib_name2 =
+  "",
+  "",
+  "" ;
+
+ connect2 =
+  1, 2, 3, 4,
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  1.2, 2.2, 3.2 ;
+
+ attrib_name3 =
+  "",
+  "",
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  1.3, 2.3, 3.3 ;
+
+ attrib_name4 =
+  "",
+  "",
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  1.4, 2.4, 3.4 ;
+
+ attrib_name5 =
+  "",
+  "",
+  "" ;
+
+ connect5 =
+  21 ;
+
+ attrib6 =
+  1.5, 2.5, 3.5 ;
+
+ attrib_name6 =
+  "",
+  "",
+  "" ;
+
+ connect6 =
+  22 ;
+
+ attrib7 =
+  1.6, 2.6, 3.6 ;
+
+ attrib_name7 =
+  "",
+  "",
+  "" ;
+
+ connect7 =
+  23, 24, 25, 26, 27, 28 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 3, 3 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 3 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 4, 4, 4, 4, 4, 4, 4 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 5, 5, 5, 5 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 6, 7 ;
+
+ side_ss5 = 1, 1 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT1",
+  "testwt1",
+  "03/16/94",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var1eb2 =
+  5.01, 5.02,
+  5.02, 5.04,
+  5.03, 5.06,
+  5.04, 5.08,
+  5.05, 5.1,
+  5.06, 5.12,
+  5.07, 5.14,
+  5.08, 5.16,
+  5.09, 5.18,
+  5.1, 5.2 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb6 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb7 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var2eb6 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb7 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var3eb6 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb7 =
+  12.01,
+  12.02,
+  12.03,
+  12.04,
+  12.05,
+  12.06,
+  12.07,
+  12.08,
+  12.09,
+  12.1 ;
+}
diff --git a/exodus/cbind/test/test2-1.dmp b/exodus/cbind/test/test2-1.dmp
new file mode 100644
index 0000000..9404304
--- /dev/null
+++ b/exodus/cbind/test/test2-1.dmp
@@ -0,0 +1,557 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT2",
+  "testwt2",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/cbind/test/test2-2.dmp b/exodus/cbind/test/test2-2.dmp
new file mode 100644
index 0000000..8d6b502
--- /dev/null
+++ b/exodus/cbind/test/test2-2.dmp
@@ -0,0 +1,557 @@
+netcdf test2 {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is test 2" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 100, 200, 300, 400, 500 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT2",
+  "testwt2",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/cbind/test/test2.dmp b/exodus/cbind/test/test2.dmp
new file mode 100644
index 0000000..a32177f
--- /dev/null
+++ b/exodus/cbind/test/test2.dmp
@@ -0,0 +1,278 @@
+netcdf test2 {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "ID" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "MATL" ;
+	int eb_prop4(num_el_blk) ;
+		eb_prop4:_FillValue = 0 ;
+		eb_prop4:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "ID" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:_FillValue = 0 ;
+		ns_prop3:name = "FACE" ;
+	int ns_prop4(num_node_sets) ;
+		ns_prop4:_FillValue = 0 ;
+		ns_prop4:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  0 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  0 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  0 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  0 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  0 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = _, _, _, _, _ ;
+
+ eb_prop3 = 10, 20, 30, 40, 50 ;
+
+ eb_prop4 = _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = _, _ ;
+
+ ns_prop3 = 4, 5 ;
+
+ ns_prop4 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT2",
+  "testwt2",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+}
diff --git a/exodus/cbind/test/test_clb.dmp b/exodus/cbind/test/test_clb.dmp
new file mode 100644
index 0000000..4930660
--- /dev/null
+++ b/exodus/cbind/test/test_clb.dmp
@@ -0,0 +1,988 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+	num_nset_var = 4 ;
+	num_sset_var = 7 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var1eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var2eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var3eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var1eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var2eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var3eb7(time_step, num_el_in_blk7) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+	char name_nset_var(num_nset_var, len_name) ;
+	float vals_nset_var1ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var3ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var1ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var3ns2(time_step, num_nod_ns2) ;
+	int nset_var_tab(num_node_sets, num_nset_var) ;
+	char name_sset_var(num_sset_var, len_name) ;
+	float vals_sset_var2ss1(time_step, num_side_ss1) ;
+	float vals_sset_var4ss1(time_step, num_side_ss1) ;
+	float vals_sset_var6ss1(time_step, num_side_ss1) ;
+	float vals_sset_var1ss2(time_step, num_side_ss2) ;
+	float vals_sset_var3ss2(time_step, num_side_ss2) ;
+	float vals_sset_var5ss2(time_step, num_side_ss2) ;
+	float vals_sset_var7ss2(time_step, num_side_ss2) ;
+	float vals_sset_var2ss3(time_step, num_side_ss3) ;
+	float vals_sset_var4ss3(time_step, num_side_ss3) ;
+	float vals_sset_var6ss3(time_step, num_side_ss3) ;
+	float vals_sset_var1ss4(time_step, num_side_ss4) ;
+	float vals_sset_var3ss4(time_step, num_side_ss4) ;
+	float vals_sset_var5ss4(time_step, num_side_ss4) ;
+	float vals_sset_var7ss4(time_step, num_side_ss4) ;
+	float vals_sset_var2ss5(time_step, num_side_ss5) ;
+	float vals_sset_var4ss5(time_step, num_side_ss5) ;
+	float vals_sset_var6ss5(time_step, num_side_ss5) ;
+	int sset_var_tab(num_side_sets, num_sset_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib_name1 =
+  "" ;
+
+ attrib1 =
+  3.1416 ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib_name2 =
+  "" ;
+
+ attrib2 =
+  6.1416 ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib_name3 =
+  "" ;
+
+ attrib3 =
+  6.1416 ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib_name4 =
+  "" ;
+
+ attrib4 =
+  6.1416 ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib_name5 =
+  "" ;
+
+ attrib5 =
+  6.1416 ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib_name6 =
+  "" ;
+
+ attrib6 =
+  6.1416 ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ attrib_name7 =
+  "" ;
+
+ attrib7 =
+  6.1416 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56, 1.58, 1.6, 1.62, 1.64, 1.66,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84, 1.87, 1.9, 1.93, 1.96, 1.99,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68, 2.74, 2.8, 2.86, 2.92, 2.98,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96, 3.03, 3.1, 3.17, 3.24, 3.31,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24, 3.32, 3.4, 3.48, 3.56, 3.64,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52, 3.61, 3.7, 3.79, 3.88, 3.97,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
+    4.1, 4.2, 4.3 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56, 2.58, 2.6, 2.62, 2.64, 2.66,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12, 3.16, 3.2, 3.24, 3.28, 3.32,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68, 3.74, 3.8, 3.86, 3.92, 3.98,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96, 4.03, 4.1, 4.17, 4.24, 4.31,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24, 4.32, 4.4, 4.48, 4.56, 4.64,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52, 4.61, 4.7, 4.79, 4.88, 4.97,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 
+    5.1, 5.2, 5.3 ;
+
+ name_nod_var =
+  "node_variable_a_very_long_name_0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var1eb6 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var2eb6 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var3eb6 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var1eb7 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb7 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb7 =
+  12.01,
+  12.02,
+  12.03,
+  12.04,
+  12.05,
+  12.06,
+  12.07,
+  12.08,
+  12.09,
+  12.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+
+ name_nset_var =
+  "nset_var0",
+  "nset_var1",
+  "nset_var2",
+  "nset_var3" ;
+
+ vals_nset_var1ns1 =
+  3.01, 3.02, 3.03, 3.04, 3.05,
+  3.02, 3.04, 3.06, 3.08, 3.1,
+  3.03, 3.06, 3.09, 3.12, 3.15,
+  3.04, 3.08, 3.12, 3.16, 3.2,
+  3.05, 3.1, 3.15, 3.2, 3.25,
+  3.06, 3.12, 3.18, 3.24, 3.3,
+  3.07, 3.14, 3.21, 3.28, 3.35,
+  3.08, 3.16, 3.24, 3.32, 3.4,
+  3.09, 3.18, 3.27, 3.36, 3.45,
+  3.1, 3.2, 3.3, 3.4, 3.5 ;
+
+ vals_nset_var3ns1 =
+  5.01, 5.02, 5.03, 5.04, 5.05,
+  5.02, 5.04, 5.06, 5.08, 5.1,
+  5.03, 5.06, 5.09, 5.12, 5.15,
+  5.04, 5.08, 5.12, 5.16, 5.2,
+  5.05, 5.1, 5.15, 5.2, 5.25,
+  5.06, 5.12, 5.18, 5.24, 5.3,
+  5.07, 5.14, 5.21, 5.28, 5.35,
+  5.08, 5.16, 5.24, 5.32, 5.4,
+  5.09, 5.18, 5.27, 5.36, 5.45,
+  5.1, 5.2, 5.3, 5.4, 5.5 ;
+
+ vals_nset_var1ns2 =
+  4.01, 4.02, 4.03,
+  4.02, 4.04, 4.06,
+  4.03, 4.06, 4.09,
+  4.04, 4.08, 4.12,
+  4.05, 4.1, 4.15,
+  4.06, 4.12, 4.18,
+  4.07, 4.14, 4.21,
+  4.08, 4.16, 4.24,
+  4.09, 4.18, 4.27,
+  4.1, 4.2, 4.3 ;
+
+ vals_nset_var3ns2 =
+  6.01, 6.02, 6.03,
+  6.02, 6.04, 6.06,
+  6.03, 6.06, 6.09,
+  6.04, 6.08, 6.12,
+  6.05, 6.1, 6.15,
+  6.06, 6.12, 6.18,
+  6.07, 6.14, 6.21,
+  6.08, 6.16, 6.24,
+  6.09, 6.18, 6.27,
+  6.1, 6.2, 6.3 ;
+
+ nset_var_tab =
+  1, 0, 1, 0,
+  1, 0, 1, 0 ;
+
+ name_sset_var =
+  "sset_var0",
+  "sset_var1",
+  "sset_var2",
+  "sset_var3",
+  "sset_var4",
+  "sset_var5",
+  "sset_var6" ;
+
+ vals_sset_var2ss1 =
+  4.01, 4.02,
+  4.02, 4.04,
+  4.03, 4.06,
+  4.04, 4.08,
+  4.05, 4.1,
+  4.06, 4.12,
+  4.07, 4.14,
+  4.08, 4.16,
+  4.09, 4.18,
+  4.1, 4.2 ;
+
+ vals_sset_var4ss1 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_sset_var6ss1 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var1ss2 =
+  4.01, 4.02,
+  4.02, 4.04,
+  4.03, 4.06,
+  4.04, 4.08,
+  4.05, 4.1,
+  4.06, 4.12,
+  4.07, 4.14,
+  4.08, 4.16,
+  4.09, 4.18,
+  4.1, 4.2 ;
+
+ vals_sset_var3ss2 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_sset_var5ss2 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var7ss2 =
+  10.01, 10.02,
+  10.02, 10.04,
+  10.03, 10.06,
+  10.04, 10.08,
+  10.05, 10.1,
+  10.06, 10.12,
+  10.07, 10.14,
+  10.08, 10.16,
+  10.09, 10.18,
+  10.1, 10.2 ;
+
+ vals_sset_var2ss3 =
+  6.01, 6.02, 6.03, 6.04, 6.05, 6.06, 6.07,
+  6.02, 6.04, 6.06, 6.08, 6.1, 6.12, 6.14,
+  6.03, 6.06, 6.09, 6.12, 6.15, 6.18, 6.21,
+  6.04, 6.08, 6.12, 6.16, 6.2, 6.24, 6.28,
+  6.05, 6.1, 6.15, 6.2, 6.25, 6.3, 6.35,
+  6.06, 6.12, 6.18, 6.24, 6.3, 6.36, 6.42,
+  6.07, 6.14, 6.21, 6.28, 6.35, 6.42, 6.49,
+  6.08, 6.16, 6.24, 6.32, 6.4, 6.48, 6.56,
+  6.09, 6.18, 6.27, 6.36, 6.45, 6.54, 6.63,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7 ;
+
+ vals_sset_var4ss3 =
+  8.01, 8.02, 8.03, 8.04, 8.05, 8.06, 8.07,
+  8.02, 8.04, 8.06, 8.08, 8.1, 8.12, 8.14,
+  8.03, 8.06, 8.09, 8.12, 8.15, 8.18, 8.21,
+  8.04, 8.08, 8.12, 8.16, 8.2, 8.24, 8.28,
+  8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35,
+  8.06, 8.12, 8.18, 8.24, 8.3, 8.36, 8.42,
+  8.07, 8.14, 8.21, 8.28, 8.35, 8.42, 8.49,
+  8.08, 8.16, 8.24, 8.32, 8.4, 8.48, 8.56,
+  8.09, 8.18, 8.27, 8.36, 8.45, 8.54, 8.63,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7 ;
+
+ vals_sset_var6ss3 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7 ;
+
+ vals_sset_var1ss4 =
+  6.01, 6.02, 6.03, 6.04, 6.05, 6.06, 6.07, 6.08,
+  6.02, 6.04, 6.06, 6.08, 6.1, 6.12, 6.14, 6.16,
+  6.03, 6.06, 6.09, 6.12, 6.15, 6.18, 6.21, 6.24,
+  6.04, 6.08, 6.12, 6.16, 6.2, 6.24, 6.28, 6.32,
+  6.05, 6.1, 6.15, 6.2, 6.25, 6.3, 6.35, 6.4,
+  6.06, 6.12, 6.18, 6.24, 6.3, 6.36, 6.42, 6.48,
+  6.07, 6.14, 6.21, 6.28, 6.35, 6.42, 6.49, 6.56,
+  6.08, 6.16, 6.24, 6.32, 6.4, 6.48, 6.56, 6.64,
+  6.09, 6.18, 6.27, 6.36, 6.45, 6.54, 6.63, 6.72,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8 ;
+
+ vals_sset_var3ss4 =
+  8.01, 8.02, 8.03, 8.04, 8.05, 8.06, 8.07, 8.08,
+  8.02, 8.04, 8.06, 8.08, 8.1, 8.12, 8.14, 8.16,
+  8.03, 8.06, 8.09, 8.12, 8.15, 8.18, 8.21, 8.24,
+  8.04, 8.08, 8.12, 8.16, 8.2, 8.24, 8.28, 8.32,
+  8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35, 8.4,
+  8.06, 8.12, 8.18, 8.24, 8.3, 8.36, 8.42, 8.48,
+  8.07, 8.14, 8.21, 8.28, 8.35, 8.42, 8.49, 8.56,
+  8.08, 8.16, 8.24, 8.32, 8.4, 8.48, 8.56, 8.64,
+  8.09, 8.18, 8.27, 8.36, 8.45, 8.54, 8.63, 8.72,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8 ;
+
+ vals_sset_var5ss4 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8 ;
+
+ vals_sset_var7ss4 =
+  12.01, 12.02, 12.03, 12.04, 12.05, 12.06, 12.07, 12.08,
+  12.02, 12.04, 12.06, 12.08, 12.1, 12.12, 12.14, 12.16,
+  12.03, 12.06, 12.09, 12.12, 12.15, 12.18, 12.21, 12.24,
+  12.04, 12.08, 12.12, 12.16, 12.2, 12.24, 12.28, 12.32,
+  12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4,
+  12.06, 12.12, 12.18, 12.24, 12.3, 12.36, 12.42, 12.48,
+  12.07, 12.14, 12.21, 12.28, 12.35, 12.42, 12.49, 12.56,
+  12.08, 12.16, 12.24, 12.32, 12.4, 12.48, 12.56, 12.64,
+  12.09, 12.18, 12.27, 12.36, 12.45, 12.54, 12.63, 12.72,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8 ;
+
+ vals_sset_var2ss5 =
+  8.01, 8.02, 8.03, 8.04, 8.05, 8.06, 8.07, 8.08, 8.09, 8.1,
+  8.02, 8.04, 8.06, 8.08, 8.1, 8.12, 8.14, 8.16, 8.18, 8.2,
+  8.03, 8.06, 8.09, 8.12, 8.15, 8.18, 8.21, 8.24, 8.27, 8.3,
+  8.04, 8.08, 8.12, 8.16, 8.2, 8.24, 8.28, 8.32, 8.36, 8.4,
+  8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35, 8.4, 8.45, 8.5,
+  8.06, 8.12, 8.18, 8.24, 8.3, 8.36, 8.42, 8.48, 8.54, 8.6,
+  8.07, 8.14, 8.21, 8.28, 8.35, 8.42, 8.49, 8.56, 8.63, 8.7,
+  8.08, 8.16, 8.24, 8.32, 8.4, 8.48, 8.56, 8.64, 8.72, 8.8,
+  8.09, 8.18, 8.27, 8.36, 8.45, 8.54, 8.63, 8.72, 8.81, 8.9,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9 ;
+
+ vals_sset_var4ss5 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08, 10.09, 10.1,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16, 10.18, 10.2,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24, 10.27, 10.3,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32, 10.36, 10.4,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48, 10.54, 10.6,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56, 10.63, 10.7,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72, 10.81, 10.9,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11 ;
+
+ vals_sset_var6ss5 =
+  12.01, 12.02, 12.03, 12.04, 12.05, 12.06, 12.07, 12.08, 12.09, 12.1,
+  12.02, 12.04, 12.06, 12.08, 12.1, 12.12, 12.14, 12.16, 12.18, 12.2,
+  12.03, 12.06, 12.09, 12.12, 12.15, 12.18, 12.21, 12.24, 12.27, 12.3,
+  12.04, 12.08, 12.12, 12.16, 12.2, 12.24, 12.28, 12.32, 12.36, 12.4,
+  12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5,
+  12.06, 12.12, 12.18, 12.24, 12.3, 12.36, 12.42, 12.48, 12.54, 12.6,
+  12.07, 12.14, 12.21, 12.28, 12.35, 12.42, 12.49, 12.56, 12.63, 12.7,
+  12.08, 12.16, 12.24, 12.32, 12.4, 12.48, 12.56, 12.64, 12.72, 12.8,
+  12.09, 12.18, 12.27, 12.36, 12.45, 12.54, 12.63, 12.72, 12.81, 12.9,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13 ;
+
+ sset_var_tab =
+  0, 1, 0, 1, 0, 1, 0,
+  1, 0, 1, 0, 1, 0, 1,
+  0, 1, 0, 1, 0, 1, 0,
+  1, 0, 1, 0, 1, 0, 1,
+  0, 1, 0, 1, 0, 1, 0 ;
+}
diff --git a/exodus/cbind/test/test_nemesis.c b/exodus/cbind/test/test_nemesis.c
new file mode 100644
index 0000000..01a7e6e
--- /dev/null
+++ b/exodus/cbind/test/test_nemesis.c
@@ -0,0 +1,948 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* This file contains the source code for the program used to test the
+ * Nemesis distribution.
+ *****************************************************************************
+ * Written By: Gary L. Hennigan (SNL, 1421)
+ *****************************************************************************
+ * Functions contained in this file:
+ *	main() - Entry point and main calling program.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <exodusII.h>
+
+/* Constants for init_global functions */
+#define NNG	100
+#define NEG	50
+#define NEBG	5
+#define NEBCG	10
+#define NNSG	2
+#define NSSG	3
+
+/* Constants for load-balance functions */
+#define NPROC	10
+#define NPROCF	NPROC
+#define NINTN	200
+#define NBORN	10
+#define NEXTN	5
+#define NINTE	100
+#define NBORE	20
+#define NNCMAP	4
+#define NECMAP	2
+
+/* Constants for communication map */
+#define NCNTCM	20
+#define ECNTCM	17
+
+int main(int argc, char *argv[])
+{
+
+  /* Local function calls */
+  int   ne_test_glbp(int);
+  int   ne_test_piinf(int);
+  int   ne_test_pinig(int);
+  int   ne_test_pelbid(int);
+  int	ne_test_pnsp(int);
+  int	ne_test_pssp(int);
+  int	ne_test_pnm(int);
+  int	ne_test_pem(int);
+  int	ne_test_pcmp(int);
+  int	ne_test_pncm(int);
+  int	ne_test_pecm(int);
+
+  int   ne_test_giinf(int);
+  int	ne_test_ginig(int);
+  int   ne_test_gelbid(int);
+  int   ne_test_gnsp(int);
+  int   ne_test_gssp(int);
+  int	ne_test_gnm(int);
+  int	ne_test_gem(int);
+  int   ne_test_gncm(int);
+  int 	ne_test_gecm(int);
+
+  int	ne_test_plbpc(int);
+  int   ne_test_pcmpc(int);
+
+  /* Unitialized local variables */
+  int     ne_file_id;
+  float	  version;
+
+  /* Initialized local variables */
+  int    mode3 = EX_CLOBBER;
+  int    mode4 = EX_CLOBBER|EX_NETCDF4|EX_NOCLASSIC;
+
+  char  *yo="main";
+  int    io_ws=0, cpu_ws=0, t_pass=0, t_fail=0;
+
+  char  *file_name = "ne_test.exo";
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+
+/*---------------------------------------------------------------------------*/
+/*                      OUTPUT TEST SECTION                                  */
+/*---------------------------------------------------------------------------*/
+
+  printf("*********************Output Tests***********************\n");
+
+  /* Create the ExodusII/Nemesis file */
+  printf("creating ExodusII file..."); fflush(stdout);
+
+  /* Attempt to create a netcdf4-format file; if it fails, then assume
+     that the netcdf library does not support that mode and fall back
+     to classic netcdf3 format.  If that fails, issue an error and
+     die.
+  */
+  if ((ne_file_id=ex_create(file_name, mode4, &cpu_ws, &io_ws)) < 0) {
+    /* netcdf4 create failed, try netcdf3 */
+    if ((ne_file_id=ex_create(file_name, mode3, &cpu_ws, &io_ws)) < 0) {
+      printf("FAILED\n");
+      t_fail++;
+      fprintf(stderr, "[%s]: ERROR, unable to create test file \"%s\"!\n",
+	      yo, file_name);
+      exit(-1);
+    }
+  }
+  printf("successful\n"); fflush(stdout);
+  t_pass++;
+
+  /* Test the output of initial information */
+  printf("testing init info output..."); fflush(stdout);
+  if (ne_test_piinf(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of initial global information */
+  printf("testing global init info output..."); fflush(stdout);
+  if (ne_test_pinig(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the global element block IDs */
+  printf("testing global element block ID output..."); fflush(stdout);
+  if (ne_test_pelbid(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the global node-set info */
+  printf("testing global node-set params output..."); fflush(stdout);
+  if (ne_test_pnsp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the global side-set info */
+  printf("testing global side-set params output..."); fflush(stdout);
+  if (ne_test_pssp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the concatenated load-balance parameters */
+  printf("testing concatenated load balance info output...");
+  fflush(stdout);
+  if (ne_test_plbpc(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+  }
+  else {
+    printf("succesful\n"); fflush(stdout);
+  }
+
+  /* Test the output of the node map */
+  printf("testing node map output..."); fflush(stdout);
+  if (ne_test_pnm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the element map */
+  printf("testing element map output..."); fflush(stdout);
+  if (ne_test_pem(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the concatenated communication map params */
+  printf("testing concatenated communication map params output...");
+  fflush(stdout);
+  if (ne_test_pcmpc(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test nodal communication map output */
+  printf("testing nodal communication map output..."); fflush(stdout);
+  if (ne_test_pncm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test elemental communication map output */
+  printf("testing elemental communication map output..."); fflush(stdout);
+  if (ne_test_pecm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Close the ExodusII/Nemesis test file */
+  printf("closing ExodusII file..."); fflush(stdout);
+  if (ex_close(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    fprintf(stderr, "[%s]: ERROR, unable to close test file \"%s\"!\n",
+            yo, file_name);
+    exit(-1);
+  }
+  printf("successful\n"); fflush(stdout);
+  t_pass++;
+
+/*---------------------------------------------------------------------------*/
+/*                       INPUT TEST SECTION                                  */
+/*---------------------------------------------------------------------------*/
+
+  printf("**********************Input Tests***********************\n");
+
+  /* Re-open the ExodusII/NemesisI file */
+  printf("reopening ExodusII file..."); fflush(stdout);
+  if (ex_open(file_name, EX_READ, &cpu_ws, &io_ws, &version) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of of the initial information */
+  printf("testing init info input..."); fflush(stdout);
+  if (ne_test_giinf(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of initial global information */
+  printf("testing global init info input..."); fflush(stdout);
+  if (ne_test_ginig(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of global element block IDs */
+  printf("testing global element block IDs input..."); fflush(stdout);
+  if (ne_test_gelbid(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of global node-set params */
+  printf("testing global node-set params input..."); fflush(stdout);
+  if (ne_test_gnsp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of global side-set params */
+  printf("testing global side-set params input..."); fflush(stdout);
+  if (ne_test_gssp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of load-balance params */
+  printf("testing load-balance params input..."); fflush(stdout);
+  if (ne_test_glbp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of the node map */
+  printf("testing node map input..."); fflush(stdout);
+  if (ne_test_gnm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of element map */
+  printf("testing element map input..."); fflush(stdout);
+  if (ne_test_gem(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of nodal communication maps */
+  printf("testing nodal communication map input..."); fflush(stdout);
+  if (ne_test_gncm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of elemental communication maps */
+  printf("testing elemental communication map input..."); fflush(stdout);
+  if (ne_test_gecm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Close the ExodusII/Nemesis test file */
+  printf("closing ExodusII file..."); fflush(stdout);
+  if (ex_close(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    fprintf(stderr, "[%s]: ERROR, unable to close test file \"%s\"!\n",
+            yo, file_name);
+    exit(-1);
+  }
+  printf("successful\n"); fflush(stdout);
+  t_pass++;
+
+  /* Output a test summary */
+  printf("\n");
+  printf("Tests Passed: %d\n", t_pass);
+  printf("Tests Failed: %d\n", t_fail);
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_piinf(int fileid)
+{
+  char ftype[3];
+
+  strcpy(ftype, "s");
+
+  return (ex_put_init_info(fileid, NPROC, NPROCF, ftype));
+}
+
+/*****************************************************************************/
+int ne_test_pinig(int fileid)
+{
+
+  int	nng=NNG, neg=NEG, nebg=NEBG, nnsg=NNSG, nssg=NSSG;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  return (ex_put_init_global(fileid, nng, neg, nebg, nnsg, nssg));
+}
+
+/*****************************************************************************/
+int ne_test_pelbid(int fileid)
+{
+  int	i, elblk_ids[NEBG], elblk_cnt[NEBG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(i=0; i < NEBG; i++) {
+    elblk_ids[i]=(i+1);
+    elblk_cnt[i]=NEBCG;
+  }
+
+  return (ex_put_eb_info_global(fileid, elblk_ids, elblk_cnt));
+}
+
+/*****************************************************************************/
+int ne_test_pnsp(int fileid)
+{
+  int	i, global_ids[NNSG], global_n_cnts[NNSG], global_df_cnts[NNSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(i=0; i < NNSG; i++) {
+    global_ids[i]=2*(i+1);
+    global_n_cnts[i]=3*(i+1);
+    global_df_cnts[i]=1;
+  }
+
+  return (ex_put_ns_param_global(fileid, global_ids, global_n_cnts,
+                                 global_df_cnts));
+}
+
+/*****************************************************************************/
+int ne_test_pssp(int fileid)
+{
+  int	i, global_ids[NSSG], global_el_cnts[NSSG], global_df_cnts[NSSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(i=0; i < NSSG; i++) {
+    global_ids[i]=3*(i+1);
+    global_el_cnts[i]=2*(i+1);
+    global_df_cnts[i]=1;
+  }
+
+  return (ex_put_ss_param_global(fileid, global_ids, global_el_cnts,
+                                 global_df_cnts));
+}
+
+/*****************************************************************************/
+int ne_test_pnm(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	node_mapi[NINTN], node_mapb[NBORN], node_mape[NEXTN];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(j=0; j < NINTN; node_mapi[j++]=j1++);
+    for(j=0; j < NBORN; node_mapb[j++]=j1++);
+    for(j=0; j < NEXTN; node_mape[j++]=j1++);
+    j1 = 0;
+    error = ex_put_processor_node_maps(fileid, node_mapi, node_mapb, node_mape, iproc);
+    if (error < 0) return error;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_pem(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	elem_mapi[NINTE], elem_mapb[NBORE];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(j=0; j < NINTE; elem_mapi[j++]=j1++);
+    for(j=0; j < NBORE; elem_mapb[j++]=j1++);
+    j1 = 0;
+    error = ex_put_processor_elem_maps(fileid, elem_mapi, elem_mapb, iproc);
+    if (error < 0) return error;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_pcmp(int fileid)
+{
+  int 	i, iproc, error;
+  int	node_map_ids[NNCMAP], node_map_node_cnts[NNCMAP];
+  int   elem_map_ids[NECMAP], elem_map_elem_cnts[NECMAP];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(i=0; i < NNCMAP; i++) {
+      node_map_ids[i]=(i+1);
+      node_map_node_cnts[i]=NCNTCM;
+    }
+
+    for(i=0; i < NECMAP; i++) {
+      elem_map_ids[i]=2*(i+1);
+      elem_map_elem_cnts[i]=ECNTCM;
+    }
+
+    error = ex_put_cmap_params(fileid, node_map_node_cnts, node_map_ids,
+                               elem_map_elem_cnts, elem_map_ids, iproc);
+    if (error < 0) return error;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_pncm(int fileid)
+{
+  int i, iproc, error;
+  int node_map_ids[NNCMAP], node_ids[NCNTCM], proc_ids[NCNTCM];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(i=0; i < NNCMAP; i++) {
+      node_map_ids[i]=(i+1);
+    }
+    for(i=0; i < NCNTCM; i++) {
+      node_ids[i] = 2*(i+1);
+      proc_ids[i] = 3*(i+1);
+    }
+
+    for(i=0; i < NNCMAP; i++) {
+      error = ex_put_node_cmap(fileid, node_map_ids[i], node_ids,
+                               proc_ids, iproc);
+      if (error < 0) return error;
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_pecm(int fileid)
+{
+  int i, iproc, error;
+  int elem_map_ids[NECMAP], elem_ids[ECNTCM], side_ids[ECNTCM];
+  int proc_ids[ECNTCM];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(i=0; i < NECMAP; i++) {
+      elem_map_ids[i]=2*(i+1);
+    }
+    for(i=0; i < ECNTCM; i++) {
+      elem_ids[i] = 2*(i+1);
+      side_ids[i] = 3*(i+1);
+      proc_ids[i] = 4*(i+1);
+    }
+
+    for(i=0; i < NECMAP; i++) {
+      error = ex_put_elem_cmap(fileid, elem_map_ids[i], elem_ids,
+                               side_ids, proc_ids, iproc);
+      if (error < 0) return error;
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_giinf(int fileid)
+{
+  int  error, nproc, nprocf;
+  char ftype[2];
+
+/*-----------------------------Execution Begins-----------------------------*/
+  error = ex_get_init_info(fileid, &nproc, &nprocf, ftype);
+
+  if (error < 0) return error;
+
+  if (nproc != NPROC) return -1;
+  if (nprocf != NPROCF) return -1;
+  if (strcmp(ftype, "s") != 0) return -1;
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_ginig(int fileid)
+{
+
+  int error;
+  int num_nodes_g, num_elems_g, num_elem_blks_g, num_ns_g, num_ss_g;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ex_get_init_global(fileid, &num_nodes_g, &num_elems_g,
+                             &num_elem_blks_g, &num_ns_g, &num_ss_g);
+
+  if (error < 0) return error;
+
+  if (num_nodes_g     != NNG)  return -1;
+  if (num_elems_g     != NEG)  return -1;
+  if (num_elem_blks_g != NEBG) return -1;
+  if (num_ns_g        != NNSG) return -1;
+  if (num_ss_g        != NSSG) return -1;
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gelbid(int fileid)
+{
+
+  int i, error;
+  int el_blk_ids[NEBG], el_blk_cnt[NEBG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ex_get_eb_info_global(fileid, el_blk_ids, el_blk_cnt);
+
+  if (error < 0) return error;
+
+  for(i=0; i < NEBG; i++) {
+    if (el_blk_ids[i] != (i+1)) return -1;
+    if (el_blk_cnt[i] != NEBCG) return -1;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gnsp(int fileid)
+{
+
+  int i, error;
+  int global_ids[NNSG], global_n_cnts[NNSG], global_df_cnts[NNSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ex_get_ns_param_global(fileid, global_ids, global_n_cnts,
+                                 global_df_cnts);
+
+  if (error < 0) return error;
+
+  for(i=0; i < NNSG; i++) {
+    if (global_ids[i]     != 2*(i+1)) return -1;
+    if (global_n_cnts[i]  != 3*(i+1)) return -1;
+    if (global_df_cnts[i] != 1      ) return -1;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gssp(int fileid)
+{
+
+  int i, error;
+  int global_ids[NSSG], global_e_cnts[NSSG], global_df_cnts[NSSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ex_get_ss_param_global(fileid, global_ids, global_e_cnts,
+                                 global_df_cnts);
+
+  if (error < 0) return error;
+
+  for(i=0; i < NSSG; i++) {
+    if (global_ids[i]     != 3*(i+1)) return -1;
+    if (global_e_cnts[i]  != 2*(i+1)) return -1;
+    if (global_df_cnts[i] != 1      ) return -1;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_glbp(int fileid)
+{
+
+  int	iproc, error;
+  int	nintn, nborn, nextn, ninte, nbore, nncmap, necmap;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    error = ex_get_loadbal_param(fileid, &nintn, &nborn, &nextn, &ninte,
+                                 &nbore, &nncmap, &necmap, iproc);
+
+    if (error < 0) return error;
+
+    if (nintn  != NINTN ) return -1;
+    if (nborn  != NBORN ) return -1;
+    if (nextn  != NEXTN ) return -1;
+    if (ninte  != NINTE ) return -1;
+    if (nbore  != NBORE ) return -1;
+    if (nncmap != NNCMAP) return -1;
+    if (necmap != NECMAP) return -1;
+
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gnm(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	node_mapi[NINTN], node_mapb[NBORN], node_mape[NEXTN];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    error = ex_get_processor_node_maps(fileid, node_mapi, node_mapb, node_mape, iproc);
+
+    if (error < 0) return error;
+
+    for(j=0; j < NINTN; j++) {
+      if (node_mapi[j] != j1++) return -1;
+    }
+    for(j=0; j < NBORN; j++) {
+      if (node_mapb[j] != j1++) return -1;
+    }
+    for(j=0; j < NEXTN; j++) {
+      if (node_mape[j] != j1++) return -1;
+    }
+
+    j1 = 0;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gem(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	elem_mapi[NINTE], elem_mapb[NBORE];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    error = ex_get_processor_elem_maps(fileid, elem_mapi, elem_mapb, iproc);
+
+    if (error < 0) return error;
+
+    for(j=0; j < NINTE; j++) {
+      if (elem_mapi[j] != j1++) return -1;
+    }
+    for(j=0; j < NBORE; j++) {
+      if (elem_mapb[j] != j1++) return -1;
+    }
+    j1 = 0;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_gncm(int fileid)
+{
+  int i, j, iproc, error;
+  int node_map_ids[NNCMAP], node_map_cnts[NNCMAP];
+  int node_ids[NCNTCM], proc_ids[NCNTCM];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    error = ex_get_cmap_params(fileid, node_map_ids, node_map_cnts,
+                               NULL, NULL, iproc);
+
+    if (error < 0) return error;
+
+    for(i=0; i < NNCMAP; i++) {
+      error = ex_get_node_cmap(fileid, node_map_ids[i], node_ids,
+                               proc_ids, iproc);
+
+      if (error < 0) return error;
+
+      for(j=0; j < NCNTCM; j++) {
+        if (node_ids[j] != 2*(j+1)) return -1;
+        if (proc_ids[j] != 3*(j+1)) return -1;
+      }
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gecm(int fileid)
+{
+  int i, j, iproc, error;
+  int elem_ids[ECNTCM], elem_map_cnts[NECMAP], proc_ids[ECNTCM];
+  int side_ids[ECNTCM], elem_map_ids[NECMAP];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    error = ex_get_cmap_params(fileid, NULL, NULL,
+                               elem_map_ids, elem_map_cnts, iproc);
+
+    if (error < 0) return error;
+
+    for(i=0; i < NECMAP; i++) {
+      error = ex_get_elem_cmap(fileid, elem_map_ids[i], elem_ids,
+                               side_ids, proc_ids, iproc);
+
+      if (error < 0) return error;
+
+      for(j=0; j < ECNTCM; j++) {
+        if (elem_ids[j] != 2*(j+1)) return -1;
+        if (side_ids[j] != 3*(j+1)) return -1;
+        if (proc_ids[j] != 4*(j+1)) return -1;
+      }
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_plbpc(int fileid)
+{
+  int   iproc;
+
+  int 	num_int_nodes[NPROCF], num_bor_nodes[NPROCF], num_ext_nodes[NPROCF];
+  int	num_int_elems[NPROCF], num_bor_elems[NPROCF];
+  int	num_node_cmaps[NPROCF], num_elem_cmaps[NPROCF];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  /* Set up the vectors */
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    num_int_nodes[iproc] = NINTN;
+    num_bor_nodes[iproc] = NBORN;
+    num_ext_nodes[iproc] = NEXTN;
+
+    num_int_elems[iproc] = NINTE;
+    num_bor_elems[iproc] = NBORE;
+
+    num_node_cmaps[iproc] = NNCMAP;
+    num_elem_cmaps[iproc] = NECMAP;
+  }
+
+  return (ex_put_loadbal_param_cc(fileid, num_int_nodes, num_bor_nodes,
+                                  num_ext_nodes, num_int_elems,
+                                  num_bor_elems, num_node_cmaps,
+                                  num_elem_cmaps));
+
+}
+
+/*****************************************************************************/
+int ne_test_pcmpc(int fileid)
+{
+  int   iproc, j, n_cntr, e_cntr;
+
+  int 	nmap_ids[NNCMAP*NPROCF], nmap_n_cnts[NNCMAP*NPROCF];
+  int   nmap_proc_ptr[NPROCF+1];
+  int	emap_ids[NECMAP*NPROCF], emap_e_cnts[NECMAP*NPROCF];
+  int   emap_proc_ptr[NPROCF+1];
+/*-----------------------------Execution Begins-----------------------------*/
+
+  nmap_proc_ptr[0] = 0;
+  emap_proc_ptr[0] = 0;
+  n_cntr = 0;
+  e_cntr = 0;
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    for(j=0; j < NNCMAP; j++) {
+      nmap_ids[n_cntr]      = (j+1);
+      nmap_n_cnts[n_cntr++] = NCNTCM;
+    }
+
+    for(j=0; j < NECMAP; j++) {
+      emap_ids[e_cntr]      = 2*(j+1);
+      emap_e_cnts[e_cntr++] = ECNTCM;
+    }
+
+    nmap_proc_ptr[iproc+1] = nmap_proc_ptr[iproc] + NNCMAP;
+    emap_proc_ptr[iproc+1] = emap_proc_ptr[iproc] + NECMAP;
+  }
+
+
+  return (ex_put_cmap_params_cc(fileid, nmap_ids, nmap_n_cnts, nmap_proc_ptr,
+                                emap_ids, emap_e_cnts, emap_proc_ptr));
+}
diff --git a/exodus/cbind/test/test_nemesis.dmp b/exodus/cbind/test/test_nemesis.dmp
new file mode 100644
index 0000000..94cf160
--- /dev/null
+++ b/exodus/cbind/test/test_nemesis.dmp
@@ -0,0 +1,30 @@
+*********************Output Tests***********************
+creating ExodusII file... successful
+testing init info output...successful
+testing global init info output...successful
+testing global element block ID output...successful
+testing global node-set params output...successful
+testing global side-set params output...successful
+testing concatenated load balance info output...succesful
+testing node map output...successful
+testing element map output...successful
+testing concatenated communication map params output...successful
+testing nodal communication map output...successful
+testing elemental communication map output...successful
+closing ExodusII file...successful
+**********************Input Tests***********************
+reopening ExodusII file...successful
+testing init info input...successful
+testing global init info input...successful
+testing global element block IDs input...successful
+testing global node-set params input...successful
+testing global side-set params input...successful
+testing load-balance params input...successful
+testing node map input...successful
+testing element map input...successful
+testing nodal communication map input...successful
+testing elemental communication map input...successful
+closing ExodusII file...successful
+
+Tests Passed: 24
+Tests Failed: 0
diff --git a/exodus/cbind/test/testall.in b/exodus/cbind/test/testall.in
new file mode 100644
index 0000000..9308263
--- /dev/null
+++ b/exodus/cbind/test/testall.in
@@ -0,0 +1,236 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SUFFIX = ""
+set BINDIR = @CMAKE_CURRENT_BINARY_DIR@
+set SRCDIR = @CMAKE_CURRENT_SOURCE_DIR@
+set NCDUMP = @NETCDF_NCDUMP@
+set DIFF = "diff -w"
+
+echo "************************************************************************"
+echo "************************************************************************"
+rm -f test.output
+echo "testwt - single precision write test..."
+echo "begin testwt" > test.output
+${PREFIX} ${BINDIR}/testwt${SUFFIX} >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test.dmp | tee testwt.res
+
+echo "testrd - single precision read test..."
+echo "begin testrd" >> test.output
+${PREFIX} ${BINDIR}/testrd${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd.dmp | tee testrd.res
+echo "end testrd" >> test.output
+
+echo "testcp_ss - single-to-single precision copy test..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${BINDIR}/testcp${SUFFIX} >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ss.dmp | tee testcp_ss.res
+
+echo "testcp_sd - single-to-double precision copy test..."
+echo "begin testcp_sd" >> test.output
+${PREFIX} ${BINDIR}/testcpd${SUFFIX} >> test.output
+echo "end testcp_sd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_sd.dmp | tee testcp_sd.res
+
+echo "testcp_ln - large model to normal model single precision copy test..."
+echo "begin testcp_ln" >> test.output
+${PREFIX} ${BINDIR}/testcp_ln${SUFFIX} >> test.output
+echo "end testcp_ln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ln.dmp | tee testcp_ln.res
+
+echo "testcp_nl - normal_model to large_model single precision copy test..."
+echo "begin testcp_nl" >> test.output
+${PREFIX} ${BINDIR}/testcp_nl${SUFFIX} >> test.output
+echo "end testcp_nl" >> test.output
+${NCDUMP} -d5,5 testcp_nl.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_nl.dmp | tee testcp_nl.res
+
+echo "testwt_clb - single precision write test using concatenated puts..."
+echo "begin testwt_clb" >> test.output
+${PREFIX} ${BINDIR}/testwt_clb${SUFFIX} >> test.output
+echo "end testwt_clb" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test_clb.dmp | tee testwt_clb.res
+
+echo "testwtd - double precision write test..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${BINDIR}/testwtd${SUFFIX} >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testd.dmp | tee testwtd.res
+
+echo "testrdd - double precision read test..."
+echo "begin testrdd" >> test.output
+${PREFIX} ${BINDIR}/testrdd${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrdd.dmp | tee testrdd.res
+echo "end testrdd" >> test.output
+
+echo "testcp_dd - double-to-double precision copy test..."
+echo "begin testcp_dd" >> test.output
+${PREFIX} ${BINDIR}/testcpd${SUFFIX} >> test.output
+echo "end testcp_dd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_dd.dmp | tee testcp_dd.res
+
+echo "testcp_ds - double-to-single precision copy test..."
+echo "begin testcp_ds" >> test.output
+${PREFIX} ${BINDIR}/testcp${SUFFIX} >> test.output
+echo "end testcp_ds" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ds.dmp | tee testcp_ds.res
+
+echo "testwt1 - single precision write files with several side sets..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${BINDIR}/testwt1${SUFFIX} >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test1.dmp | tee testwt1.res
+
+echo "testrd1 - single precision read test of a file with several side sets..."
+echo "testrd1 ... [Expect file create failure error, NOCLOBBER]"
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+echo "begin testrd1" >> test.output
+${PREFIX} ${BINDIR}/testrd1${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd1.dmp | tee testrd1.res
+echo "end testrd1" >> test.output
+
+echo "testwt_ss - write files to test side sets..."
+echo "testwt_ss ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt_ss" >> test.output
+${PREFIX} ${BINDIR}/testwt_ss${SUFFIX} >> test.output
+echo "end testwt_ss" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt_ss.dmp | tee testwt_ss.res
+
+echo "testrd_ss - read test of a file with several side sets..."
+echo "testrd_ss ... [Expect warning for NULL sidesets 30 and 31]"
+echo "begin testrd_ss" >> test.output
+${PREFIX} ${BINDIR}/testrd_ss${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd_ss.dmp | tee testrd_ss.res
+echo "end testrd_ss" >> test.output
+
+echo "testwt2 - single precision write 2 files (simultaneously open) test..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${BINDIR}/testwt2${SUFFIX} >> test.output
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2-1.dmp | tee testwt2-1.res
+${NCDUMP} -d5,5 test2.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2-2.dmp | tee testwt2-2.res
+
+echo "testrdwt - read from one and write to another (simutaneously open) file..."
+echo "begin testrdwt" >> test.output
+${PREFIX} ${BINDIR}/testrdwt${SUFFIX} >> test.output
+echo "end testrdwt" >> test.output
+${NCDUMP} -d5,5 test2.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2.dmp | tee testrdwt.res
+
+echo "testwt_nc - write x y z components of coordinates separately..."
+echo "begin testwt_nc" >> test.output
+${PREFIX} ${BINDIR}/testwt_nc${SUFFIX} >> test.output
+echo "end testwt_nc" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test.dmp | tee testwt_nc.res
+
+echo "testrd_nc - read x y z components of coordinates separately..."
+echo "begin testrd_nc" >> test.output
+${PREFIX} ${BINDIR}/testrd_nc${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd_nc.dmp | tee testrd_nc.res
+echo "end testrd" >> test.output
+
+echo "testwt-zeron - write file with zero nodes and elements..."
+echo "begin testwt-zeron" >> test.output
+${PREFIX} ${BINDIR}/testwt-zeron${SUFFIX} >> test.output
+echo "end testwt-zeron" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-zeron.dmp | tee testwt-zeron.res
+
+echo "testrd - read test of file with zero nodes and elements..."
+echo "begin testrd zero nodes" >> test.output
+${PREFIX} ${BINDIR}/testrd${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd_zeron.dmp | tee testrd_zeron.res
+echo "end testrd zero nodes" >> test.output
+
+echo "testwt-zeroe - write file with zero elements..."
+echo "begin testwt-zeroe" >> test.output
+${PREFIX} ${BINDIR}/testwt-zeroe${SUFFIX} >> test.output
+echo "end testwt-zeroe" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-zeroe.dmp | tee testwt-zeroe.res
+
+echo "testrd - read test of file with zero elements..."
+echo "begin testrd zero elements" >> test.output
+${PREFIX} ${BINDIR}/testrd${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd_zeroe.dmp | tee testrd_zeroe.res
+echo "end testrd zero elements" >> test.output
+
+echo "testwt-one-attrib - read/write test of element attributes - read one at a time..."
+echo "begin testwt-one-attrib - read attributes one at a time" >> test.output
+${PREFIX} ${BINDIR}/testwt-one-attrib${SUFFIX} | tee testrd_zeroe.res
+echo "end testwt-one-attrib - read attributes one at a time" >> test.output
+
+echo "testwt-nsided - write file with nsided elements..."
+echo "begin testwt-nsided" >> test.output
+${PREFIX} ${BINDIR}/testwt-nsided${SUFFIX} >> test.output
+echo "end testwt-nsided" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-nsided.dmp | tee testwt-nsided.res
+
+echo "testrd-nsided - read file with nsided elements..."
+echo "begin testrd-nsided" >> test.output
+${PREFIX} ${BINDIR}/testrd-nsided${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nsided.dmp | tee testrd-nsided.res
+echo "end testrd-nsided" >> test.output
+
+echo "testwt-nfaced - write file with nfaced elements..."
+echo "begin testwt-nfaced" >> test.output
+${PREFIX} ${BINDIR}/testwt-nfaced${SUFFIX} >> test.output
+echo "end testwt-nfaced" >> test.output
+${NCDUMP} -d5,5 test-nfaced.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-nfaced.dmp | tee testwt-nfaced.res
+
+echo "testrd-nfaced - read file with nfaced elements..."
+echo "begin testrd-nfaced" >> test.output
+${PREFIX} ${BINDIR}/testrd-nfaced${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nfaced.dmp | tee testrd-nfaced.res
+echo "end testrd-nfaced" >> test.output
+
+echo "testwt-long-name - write file with long (64-character) names..."
+echo "begin testwt-long-name" >> test.output
+${PREFIX} ${BINDIR}/testwt-long-name${SUFFIX} >> test.output
+echo "end testwt-long-name" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-long-name.dmp | tee testwt-long-name.res
+
+echo "testrd - read long name file truncating to 32 characters on read..."
+echo "begin testrd (truncate)" >> test.output
+${PREFIX} ${BINDIR}/testrd${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nm32.dmp | tee testrd-nm32.res
+echo "end testrd (truncate)" >> test.output
+
+echo "testrd-long-name - read long name file..."
+echo "begin testrd-long-name" >> test.output
+${PREFIX} ${BINDIR}/testrd-long-name${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/testrd-long-name.dmp | tee testrd-long-name.res
+echo "end testrd-long-name" >> test.output
+
+echo "test_nemesis - read long name file..."
+echo "begin test_nemesis" >> test.output
+${PREFIX} ${BINDIR}/test_nemesis${SUFFIX} | grep -v version | ${DIFF} - ${SRCDIR}/test_nemesis.dmp | tee test_nemesis.res
+echo "end test_nemesis" >> test.output
+
+echo "************************************************************************"
+echo "************************************************************************"
diff --git a/exodus/cbind/test/testall.in1 b/exodus/cbind/test/testall.in1
new file mode 100644
index 0000000..4b95206
--- /dev/null
+++ b/exodus/cbind/test/testall.in1
@@ -0,0 +1,233 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SRCDIR = .
+set NCDUMP = @<BINDIR>@/ncdump
+set DIFF = "diff -w"
+echo "************************************************************************"
+echo "************************************************************************"
+rm -f test.output
+echo "testwt - single precision write test..."
+echo "begin testwt" > test.output
+${PREFIX} ${SRCDIR}/testwt >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test.dmp | tee testwt.res
+
+echo "testrd - single precision read test..."
+echo "begin testrd" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd.dmp | tee testrd.res
+echo "end testrd" >> test.output
+
+echo "testcp_ss - single-to-single precision copy test..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ss.dmp | tee testcp_ss.res
+
+echo "testcp_sd - single-to-double precision copy test..."
+echo "begin testcp_sd" >> test.output
+${PREFIX} ${SRCDIR}/testcpd >> test.output
+echo "end testcp_sd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_sd.dmp | tee testcp_sd.res
+
+echo "testcp_ln - large model to normal model single precision copy test..."
+echo "begin testcp_ln" >> test.output
+${PREFIX} ${SRCDIR}/testcp_ln >> test.output
+echo "end testcp_ln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ln.dmp | tee testcp_ln.res
+
+echo "testcp_nl - normal_model to large_model single precision copy test..."
+echo "begin testcp_nl" >> test.output
+${PREFIX} ${SRCDIR}/testcp_nl >> test.output
+echo "end testcp_nl" >> test.output
+${NCDUMP} -d5,5 testcp_nl.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_nl.dmp | tee testcp_nl.res
+
+echo "testwt_clb - single precision write test using concatenated puts..."
+echo "begin testwt_clb" >> test.output
+${PREFIX} ${SRCDIR}/testwt_clb >> test.output
+echo "end testwt_clb" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test_clb.dmp | tee testwt_clb.res
+
+echo "testwtd - double precision write test..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${SRCDIR}/testwtd >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testd.dmp | tee testwtd.res
+
+echo "testrdd - double precision read test..."
+echo "begin testrdd" >> test.output
+${PREFIX} ${SRCDIR}/testrdd | grep -v version | ${DIFF} - ${SRCDIR}/testrdd.dmp | tee testrdd.res
+echo "end testrdd" >> test.output
+
+echo "testcp_dd - double-to-double precision copy test..."
+echo "begin testcp_dd" >> test.output
+${PREFIX} ${SRCDIR}/testcpd >> test.output
+echo "end testcp_dd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_dd.dmp | tee testcp_dd.res
+
+echo "testcp_ds - double-to-single precision copy test..."
+echo "begin testcp_ds" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ds" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ds.dmp | tee testcp_ds.res
+
+echo "testwt1 - single precision write files with several side sets..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${SRCDIR}/testwt1 >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test1.dmp | tee testwt1.res
+
+echo "testrd1 - single precision read test of a file with several side sets..."
+echo "testrd1 ... [Expect file create failure error, NOCLOBBER]"
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+echo "begin testrd1" >> test.output
+${PREFIX} ${SRCDIR}/testrd1 | grep -v version | ${DIFF} - ${SRCDIR}/testrd1.dmp | tee testrd1.res
+echo "end testrd1" >> test.output
+
+echo "testwt_ss - write files to test side sets..."
+echo "testwt_ss ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt_ss" >> test.output
+${PREFIX} ${SRCDIR}/testwt_ss >> test.output
+echo "end testwt_ss" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt_ss.dmp | tee testwt_ss.res
+
+echo "testrd_ss - read test of a file with several side sets..."
+echo "testrd_ss ... [Expect warning for NULL sidesets 30 and 31]"
+echo "begin testrd_ss" >> test.output
+${PREFIX} ${SRCDIR}/testrd_ss | grep -v version | ${DIFF} - ${SRCDIR}/testrd_ss.dmp | tee testrd_ss.res
+echo "end testrd_ss" >> test.output
+
+echo "testwt2 - single precision write 2 files (simultaneously open) test..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${SRCDIR}/testwt2 >> test.output
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2-1.dmp | tee testwt2-1.res
+${NCDUMP} -d5,5 test2.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2-2.dmp | tee testwt2-2.res
+
+echo "testrdwt - read from one and write to another (simutaneously open) file..."
+echo "begin testrdwt" >> test.output
+${PREFIX} ${SRCDIR}/testrdwt >> test.output
+echo "end testrdwt" >> test.output
+${NCDUMP} -d5,5 test2.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2.dmp | tee testrdwt.res
+
+echo "testwt_nc - write x y z components of coordinates separately..."
+echo "begin testwt_nc" >> test.output
+${PREFIX} ${SRCDIR}/testwt_nc >> test.output
+echo "end testwt_nc" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test.dmp | tee testwt_nc.res
+
+echo "testrd_nc - read x y z components of coordinates separately..."
+echo "begin testrd_nc" >> test.output
+${PREFIX} ${SRCDIR}/testrd_nc | grep -v version | ${DIFF} - ${SRCDIR}/testrd_nc.dmp | tee testrd_nc.res
+echo "end testrd" >> test.output
+
+echo "testwt-zeron - write file with zero nodes and elements..."
+echo "begin testwt-zeron" >> test.output
+${PREFIX} ${SRCDIR}/testwt-zeron >> test.output
+echo "end testwt-zeron" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-zeron.dmp | tee testwt-zeron.res
+
+echo "testrd - read test of file with zero nodes and elements..."
+echo "begin testrd zero nodes" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd_zeron.dmp | tee testrd_zeron.res
+echo "end testrd zero nodes" >> test.output
+
+echo "testwt-zeroe - write file with zero elements..."
+echo "begin testwt-zeroe" >> test.output
+${PREFIX} ${SRCDIR}/testwt-zeroe >> test.output
+echo "end testwt-zeroe" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-zeroe.dmp | tee testwt-zeroe.res
+
+echo "testrd - read test of file with zero elements..."
+echo "begin testrd zero elements" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd_zeroe.dmp | tee testrd_zeroe.res
+echo "end testrd zero elements" >> test.output
+
+echo "testwt-one-attrib - read/write test of element attributes - read one at a time..."
+echo "begin testwt-one-attrib - read attributes one at a time" >> test.output
+${PREFIX} ${SRCDIR}/testwt-one-attrib | tee testrd_zeroe.res
+echo "end testwt-one-attrib - read attributes one at a time" >> test.output
+
+echo "testwt-nsided - write file with nsided elements..."
+echo "begin testwt-nsided" >> test.output
+${PREFIX} ${SRCDIR}/testwt-nsided >> test.output
+echo "end testwt-nsided" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-nsided.dmp | tee testwt-nsided.res
+
+echo "testrd-nsided - read file with nsided elements..."
+echo "begin testrd-nsided" >> test.output
+${PREFIX} ${SRCDIR}/testrd-nsided | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nsided.dmp | tee testrd-nsided.res
+echo "end testrd-nsided" >> test.output
+
+echo "testwt-nfaced - write file with nfaced elements..."
+echo "begin testwt-nfaced" >> test.output
+${PREFIX} ${SRCDIR}/testwt-nfaced >> test.output
+echo "end testwt-nfaced" >> test.output
+${NCDUMP} -d5,5 test-nfaced.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-nfaced.dmp | tee testwt-nfaced.res
+
+echo "testrd-nfaced - read file with nfaced elements..."
+echo "begin testrd-nfaced" >> test.output
+${PREFIX} ${SRCDIR}/testrd-nfaced | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nfaced.dmp | tee testrd-nfaced.res
+echo "end testrd-nfaced" >> test.output
+
+echo "testwt-long-name - write file with long (64-character) names..."
+echo "begin testwt-long-name" >> test.output
+${PREFIX} ${SRCDIR}/testwt-long-name >> test.output
+echo "end testwt-long-name" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-long-name.dmp | tee testwt-long-name.res
+
+echo "testrd - read long name file truncating to 32 characters on read..."
+echo "begin testrd (truncate)" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nm32.dmp | tee testrd-nm32.res
+echo "end testrd (truncate)" >> test.output
+
+echo "testrd-long-name - read long name file..."
+echo "begin testrd-long-name" >> test.output
+${PREFIX} ${SRCDIR}/testrd-long-name | grep -v version | ${DIFF} - ${SRCDIR}/testrd-long-name.dmp | tee testrd-long-name.res
+echo "end testrd-long-name" >> test.output
+
+echo "test_nemesis - read long name file..."
+echo "begin test_nemesis" >> test.output
+${PREFIX} ${SRCDIR}/test_nemesis | grep -v version | ${DIFF} - ${SRCDIR}/test_nemesis.dmp | tee test_nemesis.res
+echo "end test_nemesis" >> test.output
+
+echo "************************************************************************"
+echo "************************************************************************"
diff --git a/exodus/cbind/test/testall.standalone b/exodus/cbind/test/testall.standalone
new file mode 100644
index 0000000..b4ba8a0
--- /dev/null
+++ b/exodus/cbind/test/testall.standalone
@@ -0,0 +1,238 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+if ($#argv == 0) then
+  set NCDUMP = `which ncdump`
+else
+  set NCDUMP = $1
+endif
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SRCDIR = .
+set DIFF = "diff -w"
+echo "************************************************************************"
+echo "************************************************************************"
+rm -f test.output
+echo "testwt - single precision write test..."
+echo "begin testwt" > test.output
+${PREFIX} ${SRCDIR}/testwt >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test.dmp | tee testwt.res
+
+echo "testrd - single precision read test..."
+echo "begin testrd" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd.dmp | tee testrd.res
+echo "end testrd" >> test.output
+
+echo "testcp_ss - single-to-single precision copy test..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ss.dmp | tee testcp_ss.res
+
+echo "testcp_sd - single-to-double precision copy test..."
+echo "begin testcp_sd" >> test.output
+${PREFIX} ${SRCDIR}/testcpd >> test.output
+echo "end testcp_sd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_sd.dmp | tee testcp_sd.res
+
+echo "testcp_ln - large model to normal model single precision copy test..."
+echo "begin testcp_ln" >> test.output
+${PREFIX} ${SRCDIR}/testcp_ln >> test.output
+echo "end testcp_ln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ln.dmp | tee testcp_ln.res
+
+echo "testcp_nl - normal_model to large_model single precision copy test..."
+echo "begin testcp_nl" >> test.output
+${PREFIX} ${SRCDIR}/testcp_nl >> test.output
+echo "end testcp_nl" >> test.output
+${NCDUMP} -d5,5 testcp_nl.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_nl.dmp | tee testcp_nl.res
+
+echo "testwt_clb - single precision write test using concatenated puts..."
+echo "begin testwt_clb" >> test.output
+${PREFIX} ${SRCDIR}/testwt_clb >> test.output
+echo "end testwt_clb" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test_clb.dmp | tee testwt_clb.res
+
+echo "testwtd - double precision write test..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${SRCDIR}/testwtd >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testd.dmp | tee testwtd.res
+
+echo "testrdd - double precision read test..."
+echo "begin testrdd" >> test.output
+${PREFIX} ${SRCDIR}/testrdd | grep -v version | ${DIFF} - ${SRCDIR}/testrdd.dmp | tee testrdd.res
+echo "end testrdd" >> test.output
+
+echo "testcp_dd - double-to-double precision copy test..."
+echo "begin testcp_dd" >> test.output
+${PREFIX} ${SRCDIR}/testcpd >> test.output
+echo "end testcp_dd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_dd.dmp | tee testcp_dd.res
+
+echo "testcp_ds - double-to-single precision copy test..."
+echo "begin testcp_ds" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ds" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | ${DIFF} - ${SRCDIR}/testcp_ds.dmp | tee testcp_ds.res
+
+echo "testwt1 - single precision write files with several side sets..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${SRCDIR}/testwt1 >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test1.dmp | tee testwt1.res
+
+echo "testrd1 - single precision read test of a file with several side sets..."
+echo "testrd1 ... [Expect file create failure error, NOCLOBBER]"
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+echo "begin testrd1" >> test.output
+${PREFIX} ${SRCDIR}/testrd1 | grep -v version | ${DIFF} - ${SRCDIR}/testrd1.dmp | tee testrd1.res
+echo "end testrd1" >> test.output
+
+echo "testwt_ss - write files to test side sets..."
+echo "testwt_ss ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt_ss" >> test.output
+${PREFIX} ${SRCDIR}/testwt_ss >> test.output
+echo "end testwt_ss" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt_ss.dmp | tee testwt_ss.res
+
+echo "testrd_ss - read test of a file with several side sets..."
+echo "testrd_ss ... [Expect warning for NULL sidesets 30 and 31]"
+echo "begin testrd_ss" >> test.output
+${PREFIX} ${SRCDIR}/testrd_ss | grep -v version | ${DIFF} - ${SRCDIR}/testrd_ss.dmp | tee testrd_ss.res
+echo "end testrd_ss" >> test.output
+
+echo "testwt2 - single precision write 2 files (simultaneously open) test..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${SRCDIR}/testwt2 >> test.output
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2-1.dmp | tee testwt2-1.res
+${NCDUMP} -d5,5 test2.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2-2.dmp | tee testwt2-2.res
+
+echo "testrdwt - read from one and write to another (simutaneously open) file..."
+echo "begin testrdwt" >> test.output
+${PREFIX} ${SRCDIR}/testrdwt >> test.output
+echo "end testrdwt" >> test.output
+${NCDUMP} -d5,5 test2.exo | grep -v version | ${DIFF} - ${SRCDIR}/test2.dmp | tee testrdwt.res
+
+echo "testwt_nc - write x y z components of coordinates separately..."
+echo "begin testwt_nc" >> test.output
+${PREFIX} ${SRCDIR}/testwt_nc >> test.output
+echo "end testwt_nc" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/test.dmp | tee testwt_nc.res
+
+echo "testrd_nc - read x y z components of coordinates separately..."
+echo "begin testrd_nc" >> test.output
+${PREFIX} ${SRCDIR}/testrd_nc | grep -v version | ${DIFF} - ${SRCDIR}/testrd_nc.dmp | tee testrd_nc.res
+echo "end testrd" >> test.output
+
+echo "testwt-zeron - write file with zero nodes and elements..."
+echo "begin testwt-zeron" >> test.output
+${PREFIX} ${SRCDIR}/testwt-zeron >> test.output
+echo "end testwt-zeron" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-zeron.dmp | tee testwt-zeron.res
+
+echo "testrd - read test of file with zero nodes and elements..."
+echo "begin testrd zero nodes" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd_zeron.dmp | tee testrd_zeron.res
+echo "end testrd zero nodes" >> test.output
+
+echo "testwt-zeroe - write file with zero elements..."
+echo "begin testwt-zeroe" >> test.output
+${PREFIX} ${SRCDIR}/testwt-zeroe >> test.output
+echo "end testwt-zeroe" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-zeroe.dmp | tee testwt-zeroe.res
+
+echo "testrd - read test of file with zero elements..."
+echo "begin testrd zero elements" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd_zeroe.dmp | tee testrd_zeroe.res
+echo "end testrd zero elements" >> test.output
+
+echo "testwt-one-attrib - read/write test of element attributes - read one at a time..."
+echo "begin testwt-one-attrib - read attributes one at a time" >> test.output
+${PREFIX} ${SRCDIR}/testwt-one-attrib | tee testrd_zeroe.res
+echo "end testwt-one-attrib - read attributes one at a time" >> test.output
+
+echo "testwt-nsided - write file with nsided elements..."
+echo "begin testwt-nsided" >> test.output
+${PREFIX} ${SRCDIR}/testwt-nsided >> test.output
+echo "end testwt-nsided" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-nsided.dmp | tee testwt-nsided.res
+
+echo "testrd-nsided - read file with nsided elements..."
+echo "begin testrd-nsided" >> test.output
+${PREFIX} ${SRCDIR}/testrd-nsided | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nsided.dmp | tee testrd-nsided.res
+echo "end testrd-nsided" >> test.output
+
+echo "testwt-nfaced - write file with nfaced elements..."
+echo "begin testwt-nfaced" >> test.output
+${PREFIX} ${SRCDIR}/testwt-nfaced >> test.output
+echo "end testwt-nfaced" >> test.output
+${NCDUMP} -d5,5 test-nfaced.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-nfaced.dmp | tee testwt-nfaced.res
+
+echo "testrd-nfaced - read file with nfaced elements..."
+echo "begin testrd-nfaced" >> test.output
+${PREFIX} ${SRCDIR}/testrd-nfaced | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nfaced.dmp | tee testrd-nfaced.res
+echo "end testrd-nfaced" >> test.output
+
+echo "testwt-long-name - write file with long (64-character) names..."
+echo "begin testwt-long-name" >> test.output
+${PREFIX} ${SRCDIR}/testwt-long-name >> test.output
+echo "end testwt-long-name" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | ${DIFF} - ${SRCDIR}/testwt-long-name.dmp | tee testwt-long-name.res
+
+echo "testrd - read long name file truncating to 32 characters on read..."
+echo "begin testrd (truncate)" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version | ${DIFF} - ${SRCDIR}/testrd-nm32.dmp | tee testrd-nm32.res
+echo "end testrd (truncate)" >> test.output
+
+echo "testrd-long-name - read long name file..."
+echo "begin testrd-long-name" >> test.output
+${PREFIX} ${SRCDIR}/testrd-long-name | grep -v version | ${DIFF} - ${SRCDIR}/testrd-long-name.dmp | tee testrd-long-name.res
+echo "end testrd-long-name" >> test.output
+
+echo "test_nemesis - read long name file..."
+echo "begin test_nemesis" >> test.output
+${PREFIX} ${SRCDIR}/test_nemesis | grep -v version | ${DIFF} - ${SRCDIR}/test_nemesis.dmp | tee test_nemesis.res
+echo "end test_nemesis" >> test.output
+
+echo "************************************************************************"
+echo "************************************************************************"
diff --git a/exodus/cbind/test/testcp.c b/exodus/cbind/test/testcp.c
new file mode 100644
index 0000000..f6c51b9
--- /dev/null
+++ b/exodus/cbind/test/testcp.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testcp - copy file test.exo created by testwt
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+
+int main (int argc, char **argv)
+{
+   int exoid, exoid1, error, idum;
+   int CPU_word_size,IO_word_size;
+
+   float version;
+
+   char *cdum = 0;
+
+   ex_opts(EX_VERBOSE | EX_ABORT);
+
+/* open EXODUS II files */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use size in file */
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+   CPU_word_size = 8;                   /* this really shouldn't matter for
+                                           the copy but tests the conversion
+                                           routines */
+   IO_word_size = 4;
+
+   exoid1 = ex_create ("testcp.exo",    /* filename */
+                        EX_CLOBBER,     /* OK to overwrite */
+                        &CPU_word_size, /* CPU float word size in bytes */
+                        &IO_word_size); /* I/O float word size in bytes */
+
+   printf ("\nafter ex_create, exoid = %3d\n",exoid1);
+   if (exoid1 < 0) exit(1);
+
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+   error = ex_copy (exoid, exoid1);
+   printf ("\nafter ex_copy, error = %3d\n", error);
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+
+   error = ex_close (exoid1);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testcp_dd.dmp b/exodus/cbind/test/testcp_dd.dmp
new file mode 100644
index 0000000..e02d606
--- /dev/null
+++ b/exodus/cbind/test/testcp_dd.dmp
@@ -0,0 +1,248 @@
+netcdf testcpd {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+variables:
+	double time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	double coordx(num_nodes) ;
+	double coordy(num_nodes) ;
+	double coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	double attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	double attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	double attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	double attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	double attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	double dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	double dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	double dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	double dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 8 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/cbind/test/testcp_ds.dmp b/exodus/cbind/test/testcp_ds.dmp
new file mode 100644
index 0000000..d55b2a6
--- /dev/null
+++ b/exodus/cbind/test/testcp_ds.dmp
@@ -0,0 +1,248 @@
+netcdf testcp {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/cbind/test/testcp_ln.c b/exodus/cbind/test/testcp_ln.c
new file mode 100644
index 0000000..975d1bf
--- /dev/null
+++ b/exodus/cbind/test/testcp_ln.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testcp_ln - copy file test.exo created by testwt, large_model to normal_model
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+
+int main (int argc, char **argv)
+{
+   int exoid, exoid1, error, idum;
+   int CPU_word_size,IO_word_size;
+
+   float version;
+
+   char *cdum = 0;
+
+   ex_opts(EX_VERBOSE | EX_ABORT);
+
+/* open EXODUS II files */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use size in file */
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+   CPU_word_size = 8;                   /* this really shouldn't matter for
+                                           the copy but tests the conversion
+                                           routines */
+   IO_word_size = 4;
+
+   exoid1 = ex_create ("testcp.exo",    /* filename */
+                        EX_CLOBBER|EX_NORMAL_MODEL,     /* OK to overwrite, normal */
+                        &CPU_word_size, /* CPU float word size in bytes */
+                        &IO_word_size); /* I/O float word size in bytes */
+
+   printf ("\nafter ex_create, exoid = %3d\n",exoid1);
+   if (exoid1 < 0) exit(1);
+
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+   error = ex_copy (exoid, exoid1);
+   printf ("\nafter ex_copy, error = %3d\n", error);
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+
+   error = ex_close (exoid1);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testcp_ln.dmp b/exodus/cbind/test/testcp_ln.dmp
new file mode 100644
index 0000000..e8b4cbf
--- /dev/null
+++ b/exodus/cbind/test/testcp_ln.dmp
@@ -0,0 +1,334 @@
+netcdf testcp {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coord(num_dim, num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATERIAL_PROPERTY_LONG_NAME_32CH" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	float nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 0 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coord =
+  0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 
+    3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10,
+  0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 
+    2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 
+    0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "block_1",
+  "block_2",
+  "block_3",
+  "block_4",
+  "block_5",
+  "block_6",
+  "block_7" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  6.1416 ;
+
+ attrib_name6 =
+  "THICKNESS" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  6.1416 ;
+
+ attrib_name7 =
+  "THICKNESS" ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/cbind/test/testcp_nl.c b/exodus/cbind/test/testcp_nl.c
new file mode 100644
index 0000000..e4e194c
--- /dev/null
+++ b/exodus/cbind/test/testcp_nl.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testcp_lrg - copy file test.exo created by testwt, normal_model to large_model
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+
+int main (int argc, char **argv)
+{
+   int exoid, exoid1, error, idum;
+   int CPU_word_size,IO_word_size;
+
+   float version;
+
+   char *cdum = 0;
+
+   ex_opts(EX_VERBOSE | EX_ABORT);
+
+/* open EXODUS II files */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use size in file */
+
+   exoid = ex_open ("testcp.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+   CPU_word_size = 8;                   /* this really shouldn't matter for
+                                           the copy but tests the conversion
+                                           routines */
+   IO_word_size = 4;
+
+   exoid1 = ex_create ("testcp_nl.exo",    /* filename */
+                        EX_CLOBBER|EX_LARGE_MODEL,     /* OK to overwrite, large */
+                        &CPU_word_size, /* CPU float word size in bytes */
+                        &IO_word_size); /* I/O float word size in bytes */
+
+   printf ("\nafter ex_create, exoid = %3d\n",exoid1);
+   if (exoid1 < 0) exit(1);
+
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+   error = ex_copy (exoid, exoid1);
+   printf ("\nafter ex_copy, error = %3d\n", error);
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+
+   error = ex_close (exoid1);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testcp_nl.dmp b/exodus/cbind/test/testcp_nl.dmp
new file mode 100644
index 0000000..ce1727a
--- /dev/null
+++ b/exodus/cbind/test/testcp_nl.dmp
@@ -0,0 +1,337 @@
+netcdf testcp_nl {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATERIAL_PROPERTY_LONG_NAME_32CH" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	float nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "block_1",
+  "block_2",
+  "block_3",
+  "block_4",
+  "block_5",
+  "block_6",
+  "block_7" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  6.1416 ;
+
+ attrib_name6 =
+  "THICKNESS" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  6.1416 ;
+
+ attrib_name7 =
+  "THICKNESS" ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/cbind/test/testcp_sd.dmp b/exodus/cbind/test/testcp_sd.dmp
new file mode 100644
index 0000000..1bbd2b9
--- /dev/null
+++ b/exodus/cbind/test/testcp_sd.dmp
@@ -0,0 +1,337 @@
+netcdf testcpd {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+variables:
+	double time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	double coordx(num_nodes) ;
+	double coordy(num_nodes) ;
+	double coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	double nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	double attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	double attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	double attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	double attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	double attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	double attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	double attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATERIAL_PROPERTY_LONG_NAME_32CH" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	double dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	double dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	double nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	double dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	double dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 8 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "block_1",
+  "block_2",
+  "block_3",
+  "block_4",
+  "block_5",
+  "block_6",
+  "block_7" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  6.1416 ;
+
+ attrib_name6 =
+  "THICKNESS" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  6.1416 ;
+
+ attrib_name7 =
+  "THICKNESS" ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/cbind/test/testcp_ss.dmp b/exodus/cbind/test/testcp_ss.dmp
new file mode 100644
index 0000000..afc0856
--- /dev/null
+++ b/exodus/cbind/test/testcp_ss.dmp
@@ -0,0 +1,337 @@
+netcdf testcp {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATERIAL_PROPERTY_LONG_NAME_32CH" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	float nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "block_1",
+  "block_2",
+  "block_3",
+  "block_4",
+  "block_5",
+  "block_6",
+  "block_7" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  6.1416 ;
+
+ attrib_name6 =
+  "THICKNESS" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  6.1416 ;
+
+ attrib_name7 =
+  "THICKNESS" ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/cbind/test/testcpd.c b/exodus/cbind/test/testcpd.c
new file mode 100644
index 0000000..8872824
--- /dev/null
+++ b/exodus/cbind/test/testcpd.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testcpd - copy file test.exo created by testwtd
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+
+int main (int argc, char **argv)
+{
+   int exoid, exoid1, error, idum;
+   int CPU_word_size,IO_word_size;
+
+   float version;
+
+   char *cdum = 0;
+
+/* open EXODUS II files */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use size in file */
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+   CPU_word_size = 8;                   /* this shouldn't matter during
+                                           copying but it tests out the
+                                           conversion routines */
+   IO_word_size = 8;                    /* store doubles */
+
+   exoid1 = ex_create ("testcpd.exo",    /* filename */
+                        EX_CLOBBER,     /* OK to overwrite */
+                        &CPU_word_size, /* CPU float word size in bytes */
+                        &IO_word_size); /* I/O float word size in bytes */
+
+   printf ("\nafter ex_create, exoid = %3d\n",exoid);
+   if (exoid1 < 0) exit(1);
+
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+   error = ex_copy (exoid, exoid1);
+   printf ("\nafter ex_copy, error = %3d\n", error);
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+
+   error = ex_close (exoid1);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testd.dmp b/exodus/cbind/test/testd.dmp
new file mode 100644
index 0000000..da035d7
--- /dev/null
+++ b/exodus/cbind/test/testd.dmp
@@ -0,0 +1,557 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	double time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	double coordx(num_nodes) ;
+	double coordy(num_nodes) ;
+	double coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	double attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	double attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	double attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	double attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	double attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	double dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	double dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	double dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	double dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	double vals_glo_var(time_step, num_glo_var) ;
+	double vals_nod_var1(time_step, num_nodes) ;
+	double vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	double vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	double vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	double vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	double vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	double vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	double vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	double vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	double vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	double vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	double vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	double vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	double vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	double vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	double vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	double vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 8 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWTD",
+  "testwtd",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/cbind/test/testrd-groups.c b/exodus/cbind/test/testrd-groups.c
new file mode 100644
index 0000000..5b766a7
--- /dev/null
+++ b/exodus/cbind/test/testrd-groups.c
@@ -0,0 +1,1226 @@
+/*
+ * Copyright (c) 2013 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test.exo created by testwt
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "netcdf.h"
+#include "exodusII.h"
+/* #include "drmd.h" */
+
+
+int main (int argc, char **argv)
+{
+  int exoid, root_id, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+  int num_side_sets, error;
+  int i, j, k, node_ctr;
+  int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+  int *ids; 
+  int *num_nodes_per_set = NULL;
+  int *num_elem_per_set = NULL;
+  int *num_df_per_set = NULL;
+  int *node_ind = NULL;
+  int *elem_ind = NULL;
+  int *df_ind = NULL;
+  int num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars;
+  int num_nset_vars, num_sset_vars;
+  int *truth_tab;
+  int num_time_steps;
+  int *num_elem_in_block = NULL;
+  int *num_nodes_per_elem = NULL;
+  int *num_attr = NULL;
+  int num_nodes_in_set, num_elem_in_set;
+  int num_sides_in_set, num_df_in_set;
+  int list_len, elem_list_len, node_list_len, df_list_len;
+  int node_num, time_step, var_index, beg_time, end_time, elem_num;
+  int CPU_word_size,IO_word_size;
+  int num_props, prop_value, *prop_values;
+  int idum;
+  int num_groups, group, group_ids[10];
+
+  float time_value, *time_values, *var_values;
+  float *x, *y, *z;
+  float *attrib, *dist_fact;
+  float version, fdum;
+
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+  char *block_names[10], *nset_names[10], *sset_names[10];
+  char *attrib_names[10];
+  char name[MAX_STR_LENGTH+1];
+  char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+  char title_chk[MAX_LINE_LENGTH+1];
+  char *cdum = 0;
+  char *prop_names[3];
+
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* open EXODUS II files */
+  exoid = ex_open ("test-groups.exo",  /* filename path */
+                   EX_READ,             /* access mode = READ */
+                   &CPU_word_size,      /* CPU word size */
+                   &IO_word_size,       /* IO word size */
+                   &version);           /* ExodusII library version */
+
+  printf ("\nafter ex_open\n");
+  if (exoid < 0) exit(1);
+
+  printf ("test-groups.exo is an EXODUSII file; version %4.2f\n",
+          version);
+  /*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+  printf ("         I/O word size %1d\n",IO_word_size);
+  ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+  printf ("EXODUSII API; version %4.2f\n", version);
+
+  ex_inquire(exoid,EX_INQ_LIB_VERS, &idum, &version, cdum);
+  printf ("EXODUSII Library API; version %4.2f (%d)\n", version, idum);
+
+  /* ncopts = NC_VERBOSE; */
+
+  /* See how many groups are children of the 'root_id'... */
+  root_id = exoid;
+
+  num_groups = ex_inquire_int(root_id, EX_INQ_NUM_CHILD_GROUPS);
+  printf ("file 'test-groups.exo' contains %d groups\n", num_groups);
+  
+  /* Get the group ids for each group... */
+  ex_get_group_ids(exoid, &idum, group_ids);
+  if (num_groups != idum) {
+    printf ("error - child group mismatch between ex_get_group_ids %d and ex_inquire %d\n",
+	    idum, num_groups);
+  }
+
+  for (group=0; group < num_groups; group++) {
+    /* Get the name of the group... */
+    float rdum;
+    exoid = group_ids[group];
+    
+    ex_inquire(exoid, EX_INQ_GROUP_NAME, &idum, &rdum, name);
+    printf ("\tId for group %d, named '%s' is %d\n", group, name, group_ids[group]);
+
+    
+  /* read database parameters */
+  error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                       &num_elem_blk, &num_node_sets, &num_side_sets);
+
+  printf ("after ex_get_init, error = %3d\n", error);
+
+  printf ("database parameters:\n");
+  printf ("title =  '%s'\n",title);
+  printf ("num_dim = %3d\n",num_dim);
+  printf ("num_nodes = %3d\n",num_nodes);
+  printf ("num_elem = %3d\n",num_elem);
+  printf ("num_elem_blk = %3d\n",num_elem_blk);
+  printf ("num_node_sets = %3d\n",num_node_sets);
+  printf ("num_side_sets = %3d\n",num_side_sets);
+
+  /* Check that ex_inquire gives same title */
+  error = ex_inquire (exoid, EX_INQ_TITLE, &idum, &fdum, title_chk);
+  printf (" after ex_inquire, error = %d\n", error);
+  if (strcmp(title, title_chk) != 0) {
+    printf ("error in ex_inquire for EX_INQ_TITLE\n");
+  }
+  
+  /* read nodal coordinates values and names from database */
+
+  x = (float *) calloc(num_nodes, sizeof(float));
+  if (num_dim >= 2)
+    y = (float *) calloc(num_nodes, sizeof(float));
+  else
+    y = 0;
+  
+  if (num_dim >= 3)
+    z = (float *) calloc(num_nodes, sizeof(float));
+  else
+    z = 0;
+
+  error = ex_get_coord (exoid, x, y, z);
+  printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+  printf ("x coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", x[i]);
+    }
+
+  if (num_dim >= 2) {
+    printf ("y coords = \n");
+    for (i=0; i<num_nodes; i++)
+      {
+	printf ("%5.1f\n", y[i]);
+      }
+  }
+  if (num_dim >= 3)
+    {
+      printf ("z coords = \n");
+      for (i=0; i<num_nodes; i++)
+        {
+          printf ("%5.1f\n", z[i]);
+        }
+    }
+
+  /*
+    error = ex_get_1_coord (exoid, 2, x, y, z);
+    printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+    printf ("x coord of node 2 = \n");
+    printf ("%f \n", x[0]);
+
+    printf ("y coord of node 2 = \n");
+    printf ("%f \n", y[0]);
+  */
+  free (x);
+  if (num_dim >= 2)
+    free (y);
+  if (num_dim >= 3)
+    free (z);
+
+
+  for (i=0; i<num_dim; i++)
+    {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_coord_names (exoid, coord_names);
+  printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+  printf ("x coord name = '%s'\n", coord_names[0]);
+  if (num_dim >1)
+    printf ("y coord name = '%s'\n", coord_names[1]);
+  if (num_dim >2)
+    printf ("z coord name = '%s'\n", coord_names[2]);
+
+  for (i=0; i<num_dim; i++)
+    free(coord_names[i]);
+
+  {
+    int num_attrs = 0;
+    error = ex_get_attr_param(exoid, EX_NODAL, 0, &num_attrs);
+    printf (" after ex_get_attr_param, error = %d\n", error);
+    printf ("num nodal attributes = %d\n", num_attrs);
+    if (num_attrs > 0) {
+      for (j=0; j<num_attrs; j++) {
+	attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+      error = ex_get_attr_names (exoid, EX_NODAL, 0, attrib_names);
+      printf (" after ex_get_attr_names, error = %d\n", error);
+      
+      if (error == 0) {
+	attrib = (float *) calloc(num_nodes,sizeof(float));
+	for (j=0; j<num_attrs; j++) {
+	  printf ("nodal attribute %d = '%s'\n", j, attrib_names[j]);
+	  error = ex_get_one_attr(exoid, EX_NODAL, 0, j+1, attrib);
+	  printf (" after ex_get_one_attr, error = %d\n", error);
+	  for (i=0; i < num_nodes; i++) {
+	    printf ("%5.1f\n", attrib[i]);
+	  }
+	  free(attrib_names[j]);
+	}
+	free(attrib);
+      }
+    }
+  }
+  
+  /* read element order map */
+
+  elem_map = (int *) calloc(num_elem, sizeof(int));
+
+  error = ex_get_map (exoid, elem_map);
+  printf ("\nafter ex_get_map, error = %3d\n", error);
+
+  for (i=0; i<num_elem; i++)
+    {
+      printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+    }
+
+  free (elem_map);
+
+  /* read element block parameters */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+    num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++) {
+      block_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_ELEM_BLOCK, block_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+    
+    for (i=0; i<num_elem_blk; i++)
+      {
+	ex_get_name(exoid, EX_ELEM_BLOCK, ids[i], name);
+	if (strcmp(name, block_names[i]) != 0) {
+	  printf ("error in ex_get_name for block id %d\n", ids[i]);
+	}
+        error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                   &(num_elem_in_block[i]), 
+                                   &(num_nodes_per_elem[i]), &(num_attr[i]));
+        printf ("\nafter ex_get_elem_block, error = %d\n", error);
+         
+        printf ("element block id = %2d\n",ids[i]);
+        printf ("element type = '%s'\n", elem_type);
+        printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+        printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+        printf ("num_attr = %2d\n",num_attr[i]);
+        printf ("name = '%s'\n",block_names[i]);
+	free(block_names[i]);
+      }
+     
+    /* read element block properties */
+    error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each element block\n", num_props);
+     
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+     
+     
+    for (i=1; i<num_props; i++) /* Prop 1 is id; skip that here */
+      {
+        for (j=0; j<num_elem_blk; j++)
+          {
+            error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+     
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+  }
+   
+  /* read element connectivity */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+				 sizeof(int));
+	
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	
+	for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	    printf ("%3d\n", connect[j]);
+	  }
+	/*
+	  error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+	  printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	  
+	  printf ("node list for first element of element block %d \n ", ids[i]);
+	  for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	  printf ("%d \n", connect[j]);
+	  }
+	*/
+	free (connect);
+      }
+    }
+
+  /* read element block attributes */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	for (j=0; j<num_attr[i]; j++)
+	  attrib_names[j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	
+	attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+	error = ex_get_elem_attr (exoid, ids[i], attrib);
+	printf ("\n after ex_get_elem_attr, error = %d\n", error);
+	
+	if (error == 0) {
+	  error = ex_get_elem_attr_names (exoid, ids[i], attrib_names);
+	  printf (" after ex_get_elem_attr_names, error = %d\n", error);
+	  
+	  if (error == 0) {
+	    printf ("element block %d attribute '%s' = %6.4f\n", ids[i], attrib_names[0], *attrib);
+	  }
+	}
+	free (attrib);
+	for (j=0; j<num_attr[i]; j++)
+	  free (attrib_names[j]);
+      }
+    }
+      
+  if (num_elem_blk > 0) {
+    free (ids);
+    free (num_nodes_per_elem);
+    free (num_attr);
+  }
+
+  /* read individual node sets */
+  if (num_node_sets > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++) {
+      nset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_NODE_SET, nset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++)
+      {
+	ex_get_name(exoid, EX_NODE_SET, ids[i], name);
+	if (strcmp(name, nset_names[i]) != 0) {
+	  printf ("error in ex_get_name for nodeset id %d\n", ids[i]);
+	}
+
+        error = ex_get_node_set_param (exoid, ids[i], 
+                                       &num_nodes_in_set, &num_df_in_set);
+        printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+        printf ("\nnode set %2d parameters: \n", ids[i]);
+        printf ("num_nodes = %2d\n", num_nodes_in_set);
+	printf ("name = '%s'\n", nset_names[i]);
+	free(nset_names[i]);
+        node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+        dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+        error = ex_get_node_set (exoid, ids[i], node_list);
+        printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+          }
+
+        printf ("\nnode list for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_nodes_in_set; j++)
+          {
+            printf ("%3d\n", node_list[j]);
+          }
+
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for node set %2d\n", ids[i]);
+
+            for (j=0; j<num_nodes_in_set; j++)
+              {
+                printf ("%5.2f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for node set %2d\n", ids[i]);
+
+        free (node_list);
+        free (dist_fact);
+
+	{
+	  int num_attrs = 0;
+	  error = ex_get_attr_param(exoid, EX_NODE_SET, ids[i], &num_attrs);
+	  printf (" after ex_get_attr_param, error = %d\n", error);
+	  printf ("num nodeset attributes for nodeset %d = %d\n", ids[i], num_attrs);
+	  if (num_attrs > 0) {
+	    for (j=0; j<num_attrs; j++) {
+	      attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	    }
+	    error = ex_get_attr_names (exoid, EX_NODE_SET, ids[i], attrib_names);
+	    printf (" after ex_get_attr_names, error = %d\n", error);
+	    
+	    if (error == 0) {
+	      attrib = (float *) calloc(num_nodes_in_set,sizeof(float));
+	      for (j=0; j<num_attrs; j++) {
+		printf ("nodeset attribute %d = '%s'\n", j, attrib_names[j]);
+		error = ex_get_one_attr(exoid, EX_NODE_SET, ids[i], j+1, attrib);
+		printf (" after ex_get_one_attr, error = %d\n", error);
+		for (k=0; k < num_nodes_in_set; k++) {
+		  printf ("%5.1f\n", attrib[k]);
+		}
+		free(attrib_names[j]);
+	      }
+	      free(attrib);
+	    }
+	  }
+	}
+      }
+    free(ids);
+
+    /* read node set properties */
+    error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each node set\n", num_props);
+
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+    error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                                  prop_values);
+        if (error == 0)
+          for (j=0; j<num_node_sets; j++)
+            printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                    j+1, i+1, prop_names[i], prop_values[j]);
+        else
+          printf ("after ex_get_prop_array, error = %d\n", error);
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free(prop_values);
+
+    /* read concatenated node sets; this produces the same information as
+     * the above code which reads individual node sets
+     */
+
+    error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %3d\n",error);
+
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+    num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    node_ind = (int *) calloc(num_node_sets, sizeof(int));
+    df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+    node_list = (int *) calloc(list_len, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+    dist_fact = (float *) calloc(list_len, sizeof(float));
+
+    error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                     node_ind, df_ind, node_list, dist_fact);
+    printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+    printf ("\nconcatenated node set info\n");
+
+    printf ("ids = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+    printf ("num_nodes_per_set = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+    printf ("node_ind = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+    printf ("node_list = \n");
+    for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+    printf ("dist_fact = \n");
+    for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+    free (ids);
+    free (df_ind);
+    free (node_ind);
+    free (num_df_per_set);
+    free (node_list);
+    free (dist_fact);
+  }
+
+  /* read individual side sets */
+
+  if (num_side_sets > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+    
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+    
+    for (i=0; i<num_side_sets; i++) {
+      sset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_SIDE_SET, sset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_side_sets; i++)
+      {
+	ex_get_name(exoid, EX_SIDE_SET, ids[i], name);
+	if (strcmp(name, sset_names[i]) != 0) {
+	  printf ("error in ex_get_name for sideset id %d\n", ids[i]);
+	}
+
+        error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                       &num_df_in_set);
+        printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+        
+        printf ("side set %2d parameters:\n",ids[i]);
+	printf ("name = '%s'\n", sset_names[i]);
+        printf ("num_sides = %3d\n",num_sides_in_set);
+        printf ("num_dist_factors = %3d\n", num_df_in_set);
+	free(sset_names[i]);
+        
+        
+        /* Note: The # of elements is same as # of sides!  */
+        num_elem_in_set = num_sides_in_set;
+        elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+        node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+        dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+        
+        error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+        printf ("\nafter ex_get_side_set, error = %3d\n", error);
+        
+        error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                           node_list);
+        printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+        
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+          }
+        
+        printf ("element list for side set %2d\n", ids[i]);
+        for (j=0; j<num_elem_in_set; j++)
+          {
+            printf ("%3d\n", elem_list[j]);
+          }
+        
+        printf ("side list for side set %2d\n", ids[i]);
+        for (j=0; j<num_sides_in_set; j++)
+          {
+            printf ("%3d\n", side_list[j]);
+          }
+        
+        node_ctr = 0;
+        printf ("node list for side set %2d\n", ids[i]);
+        for (k=0; k<num_elem_in_set; k++)
+          {
+            for (j=0; j<node_ctr_list[k]; j++)
+              {
+                printf ("%3d\n", node_list[node_ctr+j]);
+              }
+            node_ctr += node_ctr_list[k];
+          }
+        
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for side set %2d\n", ids[i]);
+            
+            for (j=0; j<num_df_in_set; j++)
+              {
+                printf ("%5.3f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for side set %2d\n", ids[i]);
+        
+        free (elem_list);
+        free (side_list);
+        free (node_ctr_list);
+        free (node_list);
+        free (dist_fact);
+        
+      }
+    
+    /* read side set properties */
+    error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each side set\n", num_props);
+    
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    
+    error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        for (j=0; j<num_side_sets; j++)
+          {
+            error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free (ids);
+
+    error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+    if (num_side_sets > 0)
+      {
+        error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+                elem_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+                node_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+                df_list_len, error);
+      }
+
+    /* read concatenated side sets; this produces the same information as
+     * the above code which reads individual side sets
+     */
+
+    /* concatenated side set read */
+
+    if (num_side_sets > 0) {
+      ids = (int *) calloc(num_side_sets, sizeof(int));
+      num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+      df_ind = (int *) calloc(num_side_sets, sizeof(int));
+      elem_list = (int *) calloc(elem_list_len, sizeof(int));
+      side_list = (int *) calloc(elem_list_len, sizeof(int));
+      dist_fact = (float *) calloc(df_list_len, sizeof(float));
+     
+      error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                       num_df_per_set, elem_ind, df_ind, 
+                                       elem_list, side_list, dist_fact);
+      printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+     
+      printf ("concatenated side set info\n");
+     
+      printf ("ids = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+     
+      printf ("num_elem_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+     
+      printf ("num_dist_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+     
+      printf ("elem_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+     
+      printf ("dist_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+     
+      printf ("elem_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+     
+      printf ("side_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+     
+      printf ("dist_fact = \n");
+      for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+     
+      free (ids);
+      free (num_df_per_set);
+      free (df_ind);
+      free (elem_ind);
+      free (elem_list);
+      free (side_list);
+      free (dist_fact);
+    }
+  }   
+  /* end of concatenated side set read */
+
+  /* read QA records */
+
+  ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+  for (i=0; i<num_qa_rec; i++)
+    {
+      for (j=0; j<4; j++)
+        {
+          qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+        }
+    }
+
+  error = ex_get_qa (exoid, qa_record); 
+  printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+  printf ("QA records = \n");
+  for (i=0; i<num_qa_rec; i++) 
+    {
+      for (j=0; j<4; j++)
+        {
+          printf (" '%s'\n", qa_record[i][j]);
+          free(qa_record[i][j]);
+        }
+    }
+
+  /* read information records */
+
+  error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+
+  for (i=0; i<num_info; i++)
+    {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_info (exoid, info); 
+  printf ("\nafter ex_get_info, error = %3d\n", error);
+
+  printf ("info records = \n");
+  for (i=0; i<num_info; i++)
+    {
+      printf (" '%s'\n", info[i]);
+      free(info[i]);
+    }
+
+  /* read global variables parameters and names */
+
+  error = ex_get_var_param (exoid, "g", &num_glo_vars);
+  printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+  for (i=0; i<num_glo_vars; i++)
+    {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+  printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+  printf ("There are %2d global variables; their names are :\n", 
+          num_glo_vars);
+  for (i=0; i<num_glo_vars; i++)
+    {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+    }
+
+  /* read nodal variables parameters and names */
+  num_nod_vars = 0;
+  if (num_nodes > 0) {
+    error = ex_get_var_param (exoid, "n", &num_nod_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+    for (i=0; i<num_nod_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+
+    error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+    printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+    for (i=0; i<num_nod_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+  }
+
+  /* read element variables parameters and names */
+
+  num_ele_vars = 0;
+  if (num_elem > 0) {
+    error = ex_get_var_param (exoid, "e", &num_ele_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    for (i=0; i<num_ele_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+    printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+    for (i=0; i<num_ele_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+
+    /* read element variable truth table */
+
+    if (num_ele_vars > 0) {
+      truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+     
+      error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+      printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+     
+      printf ("This is the element variable truth table:\n");
+     
+      k = 0;
+      for (i=0; i<num_elem_blk*num_ele_vars; i++)
+        {
+          printf ("%2d\n", truth_tab[k++]);
+        }
+      free (truth_tab);
+    }
+  }
+
+  /* read nodeset variables parameters and names */
+
+  num_nset_vars = 0;
+  if (num_node_sets > 0) {
+    error = ex_get_var_param (exoid, "m", &num_nset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_nset_vars > 0) {
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "m", num_nset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d nodeset variables; their names are :\n", 
+	      num_nset_vars);
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read nodeset variable truth table */
+
+      if (num_nset_vars > 0) {
+	truth_tab = (int *) calloc ((num_node_sets*num_nset_vars), sizeof(int));
+     
+	error = ex_get_nset_var_tab (exoid, num_node_sets, num_nset_vars, truth_tab);
+	printf ("\nafter ex_get_nset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the nodeset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_node_sets*num_nset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* read sideset variables parameters and names */
+
+  num_sset_vars = 0;
+  if (num_side_sets > 0) {
+    error = ex_get_var_param (exoid, "s", &num_sset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_sset_vars > 0) {
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "s", num_sset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d sideset variables; their names are :\n", 
+	      num_sset_vars);
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read sideset variable truth table */
+
+      if (num_sset_vars > 0) {
+	truth_tab = (int *) calloc ((num_side_sets*num_sset_vars), sizeof(int));
+     
+	error = ex_get_sset_var_tab (exoid, num_side_sets, num_sset_vars, truth_tab);
+	printf ("\nafter ex_get_sset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the sideset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_side_sets*num_sset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* determine how many time steps are stored */
+
+  error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+  printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+  /* read time value at one time step */
+
+  time_step = 3;
+  error = ex_get_time (exoid, time_step, &time_value);
+  printf ("\nafter ex_get_time, error = %3d\n", error);
+
+  printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+  /* read time values at all time steps */
+
+  time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_all_times (exoid, time_values);
+  printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+  printf ("time values at all time steps are:\n");
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+  free (time_values);
+
+  /* read all global variables at one time step */
+
+  var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+  error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+  printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+  printf ("global variable values at time step %2d\n", time_step);
+  for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a single global variable through time */
+
+  var_index = 1;
+  beg_time = 1;
+  end_time = -1;
+
+  var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                var_values);
+  printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+  printf ("global variable %2d values through time:\n", var_index);
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a nodal variable at one time step */
+
+  if (num_nodes > 0) {
+    var_values = (float *) calloc (num_nodes, sizeof(float));
+
+    error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                              var_values);
+    printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+    printf ("nodal variable %2d values at time step %2d\n", var_index, 
+            time_step);
+    for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+
+    /* read a nodal variable through time */
+
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+    node_num = 1;
+    error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                   end_time, var_values);
+    printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+    printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+            node_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+  }
+  /* read an element variable at one time step */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++)
+      {
+	if (num_elem_in_block[i] > 0) {
+	  var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+         
+	  error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+				   num_elem_in_block[i], var_values);
+	  printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+         
+	  if (!error)
+	    {
+	      printf 
+		("element variable %2d values of element block %2d at time step %2d\n",
+		 var_index, ids[i], time_step);
+	      for (j=0; j<num_elem_in_block[i]; j++) 
+		printf ("%5.3f\n", var_values[j]);
+	    }
+         
+	  free (var_values);
+	}
+      }
+    free (num_elem_in_block);
+    free(ids);
+  }
+  /* read an element variable through time */
+
+  if (num_ele_vars > 0) {
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+     
+    var_index = 2;
+    elem_num = 2;
+    error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+    printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+     
+    printf ("element variable %2d values for element %2d through time:\n", 
+            var_index, elem_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+     
+    free (var_values);
+  }
+   
+  /* read a sideset variable at one time step */
+
+  if (num_sset_vars > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+     
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\n after ex_get_side_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_side_sets; i++)
+      {
+        var_values = (float *) calloc (num_elem_per_set[i], sizeof(float));
+         
+        error = ex_get_sset_var (exoid, time_step, var_index, ids[i], 
+                                 num_elem_per_set[i], var_values);
+        printf ("\nafter ex_get_sset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("sideset variable %2d values of sideset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_elem_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free (num_elem_per_set);
+    free(ids);
+  }
+
+  /* read a nodeset variable at one time step */
+
+  if (num_nset_vars > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+     
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\n after ex_get_node_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_node_sets; i++)
+      {
+        var_values = (float *) calloc (num_nodes_per_set[i], sizeof(float));
+         
+        error = ex_get_nset_var (exoid, time_step, var_index, ids[i], 
+                                 num_nodes_per_set[i], var_values);
+        printf ("\nafter ex_get_nset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("nodeset variable %2d values of nodeset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_nodes_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free(ids);
+  }
+  if (num_node_sets > 0)
+    free (num_nodes_per_set);
+  }
+  
+  error = ex_close (root_id);
+  printf ("\nafter ex_close, error = %3d\n", error);
+  return 0;
+}
diff --git a/exodus/cbind/test/testrd-long-name.c b/exodus/cbind/test/testrd-long-name.c
new file mode 100644
index 0000000..081a9ac
--- /dev/null
+++ b/exodus/cbind/test/testrd-long-name.c
@@ -0,0 +1,1210 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test.exo created by testwt
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "netcdf.h"
+#include "exodusII.h"
+/* #include "drmd.h" */
+
+
+int main (int argc, char **argv)
+{
+  int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+  int num_side_sets, error;
+  int i, j, k, node_ctr;
+  int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+  int *ids; 
+  int *num_nodes_per_set = NULL;
+  int *num_elem_per_set = NULL;
+  int *num_df_per_set = NULL;
+  int *node_ind = NULL;
+  int *elem_ind = NULL;
+  int *df_ind = NULL;
+  int num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars;
+  int num_nset_vars, num_sset_vars;
+  int *truth_tab;
+  int num_time_steps;
+  int *num_elem_in_block = NULL;
+  int *num_nodes_per_elem = NULL;
+  int *num_attr = NULL;
+  int num_nodes_in_set, num_elem_in_set;
+  int num_sides_in_set, num_df_in_set;
+  int list_len, elem_list_len, node_list_len, df_list_len;
+  int node_num, time_step, var_index, beg_time, end_time, elem_num;
+  int CPU_word_size,IO_word_size;
+  int num_props, prop_value, *prop_values;
+  int idum;
+  int max_name_length;
+  
+  float time_value, *time_values, *var_values;
+  float *x, *y, *z;
+  float *attrib, *dist_fact;
+  float version, fdum;
+
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+  char *block_names[10], *nset_names[10], *sset_names[10];
+  char *attrib_names[10];
+  char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+  char title_chk[MAX_LINE_LENGTH+1];
+  char *cdum = 0;
+  char *prop_names[3];
+  char *name = NULL;
+
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* open EXODUS II files */
+  exoid = ex_open ("test.exo",  /* filename path */
+                   EX_READ,             /* access mode = READ */
+                   &CPU_word_size,      /* CPU word size */
+                   &IO_word_size,       /* IO word size */
+                   &version);           /* ExodusII library version */
+
+  printf ("\nafter ex_open\n");
+  if (exoid < 0) exit(1);
+
+
+				   
+  printf ("test.exo is an EXODUSII file; version %4.2f\n",
+          version);
+  /*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+  printf ("         I/O word size %1d\n",IO_word_size);
+  ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+  printf ("EXODUSII API; version %4.2f\n", version);
+
+  ex_inquire(exoid,EX_INQ_LIB_VERS, &idum, &version, cdum);
+  printf ("EXODUSII Library API; version %4.2f (%d)\n", version, idum);
+
+  /* Query size of names used in this file */
+  {
+    int max_all_name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);
+    int max_use_name_length = ex_inquire_int(exoid, EX_INQ_DB_MAX_USED_NAME_LENGTH);
+    printf ("This file can use at most %d-character names\n", max_all_name_length);
+    printf ("The maximum name length used is %d-character names\n", max_use_name_length);
+
+    max_name_length = max_use_name_length;
+    ex_set_max_name_length(exoid, max_name_length);
+  }
+  
+  name = (char *) calloc(max_name_length+1, sizeof(char));
+  
+  /* read database parameters */
+  error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                       &num_elem_blk, &num_node_sets, &num_side_sets);
+
+  printf ("after ex_get_init, error = %3d\n", error);
+
+  printf ("database parameters:\n");
+  printf ("title =  '%s'\n",title);
+  printf ("num_dim = %3d\n",num_dim);
+  printf ("num_nodes = %3d\n",num_nodes);
+  printf ("num_elem = %3d\n",num_elem);
+  printf ("num_elem_blk = %3d\n",num_elem_blk);
+  printf ("num_node_sets = %3d\n",num_node_sets);
+  printf ("num_side_sets = %3d\n",num_side_sets);
+
+  /* Check that ex_inquire gives same title */
+  error = ex_inquire (exoid, EX_INQ_TITLE, &idum, &fdum, title_chk);
+  printf ("after ex_inquire, error = %3d\n", error);
+  if (strcmp(title, title_chk) != 0) {
+    printf ("error in ex_inquire for EX_INQ_TITLE\n");
+  }
+  
+  /* read nodal coordinates values and names from database */
+
+  x = (float *) calloc(num_nodes, sizeof(float));
+  y = (float *) calloc(num_nodes, sizeof(float));
+  if (num_dim >= 3)
+    z = (float *) calloc(num_nodes, sizeof(float));
+  else
+    z = 0;
+
+  error = ex_get_coord (exoid, x, y, z);
+  printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+  printf ("x coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", x[i]);
+    }
+
+  printf ("y coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", y[i]);
+    }
+
+  if (num_dim >= 3)
+    {
+      printf ("z coords = \n");
+      for (i=0; i<num_nodes; i++)
+        {
+          printf ("%5.1f\n", z[i]);
+        }
+    }
+
+  /*
+    error = ex_get_1_coord (exoid, 2, x, y, z);
+    printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+    printf ("x coord of node 2 = \n");
+    printf ("%f \n", x[0]);
+
+    printf ("y coord of node 2 = \n");
+    printf ("%f \n", y[0]);
+  */
+  free (x);
+  free (y);
+  if (num_dim >= 3)
+    free (z);
+
+
+  for (i=0; i<num_dim; i++)
+    {
+      coord_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+    }
+
+  error = ex_get_coord_names (exoid, coord_names);
+  printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+  printf ("x coord name = '%s'\n", coord_names[0]);
+  printf ("y coord name = '%s'\n", coord_names[1]);
+  if (num_dim >2)
+    printf ("z coord name = '%s'\n", coord_names[2]);
+
+  for (i=0; i<num_dim; i++)
+    free(coord_names[i]);
+
+  {
+    int num_attrs = 0;
+    error = ex_get_attr_param(exoid, EX_NODAL, 0, &num_attrs);
+    printf (" after ex_get_attr_param, error = %d\n", error);
+    printf ("num nodal attributes = %d\n", num_attrs);
+    if (num_attrs > 0) {
+      for (j=0; j<num_attrs; j++) {
+	attrib_names[j] = (char *)calloc ((max_name_length+1), sizeof(char));
+      }
+      error = ex_get_attr_names (exoid, EX_NODAL, 0, attrib_names);
+      printf (" after ex_get_attr_names, error = %d\n", error);
+      
+      if (error == 0) {
+	attrib = (float *) calloc(num_nodes,sizeof(float));
+	for (j=0; j<num_attrs; j++) {
+	  printf ("nodal attribute %d = '%s'\n", j, attrib_names[j]);
+	  error = ex_get_one_attr(exoid, EX_NODAL, 0, j+1, attrib);
+	  printf (" after ex_get_one_attr, error = %d\n", error);
+	  for (i=0; i < num_nodes; i++) {
+	    printf ("%5.1f\n", attrib[i]);
+	  }
+	  free(attrib_names[j]);
+	}
+	free(attrib);
+      }
+    }
+  }
+  
+  /* read element order map */
+
+  elem_map = (int *) calloc(num_elem, sizeof(int));
+
+  error = ex_get_map (exoid, elem_map);
+  printf ("\nafter ex_get_map, error = %3d\n", error);
+
+  for (i=0; i<num_elem; i++)
+    {
+      printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+    }
+
+  free (elem_map);
+
+  /* read element block parameters */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+    num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++) {
+      block_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_ELEM_BLOCK, block_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+    
+    for (i=0; i<num_elem_blk; i++)
+      {
+	ex_get_name(exoid, EX_ELEM_BLOCK, ids[i], name);
+	if (strcmp(name, block_names[i]) != 0) {
+	  printf ("error in ex_get_name for block id %d\n", ids[i]);
+	}
+        error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                   &(num_elem_in_block[i]), 
+                                   &(num_nodes_per_elem[i]), &(num_attr[i]));
+        printf ("\nafter ex_get_elem_block, error = %d\n", error);
+         
+        printf ("element block id = %2d\n",ids[i]);
+        printf ("element type = '%s'\n", elem_type);
+        printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+        printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+        printf ("num_attr = %2d\n",num_attr[i]);
+        printf ("name = '%s'\n",block_names[i]);
+	free(block_names[i]);
+      }
+     
+    /* read element block properties */
+    error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each element block\n", num_props);
+     
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+      }
+     
+    error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+     
+     
+    for (i=1; i<num_props; i++) /* Prop 1 is id; skip that here */
+      {
+        for (j=0; j<num_elem_blk; j++)
+          {
+            error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+     
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+  }
+   
+  /* read element connectivity */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+				 sizeof(int));
+	
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	
+	for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	    printf ("%3d\n", connect[j]);
+	  }
+	/*
+	  error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+	  printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	  
+	  printf ("node list for first element of element block %d \n ", ids[i]);
+	  for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	  printf ("%d \n", connect[j]);
+	  }
+	*/
+	free (connect);
+      }
+    }
+
+  /* read element block attributes */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	for (j=0; j<num_attr[i]; j++)
+	  attrib_names[j] = (char *) calloc ((max_name_length+1), sizeof(char));
+	
+	attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+	error = ex_get_elem_attr (exoid, ids[i], attrib);
+	printf ("\n after ex_get_elem_attr, error = %d\n", error);
+	
+	if (error == 0) {
+	  error = ex_get_elem_attr_names (exoid, ids[i], attrib_names);
+	  printf (" after ex_get_elem_attr_names, error = %d\n", error);
+	  
+	  if (error == 0) {
+	    printf ("element block %d attribute '%s' = %6.4f\n", ids[i], attrib_names[0], *attrib);
+	  }
+	}
+	free (attrib);
+	for (j=0; j<num_attr[i]; j++)
+	  free (attrib_names[j]);
+      }
+    }
+      
+  if (num_elem_blk > 0) {
+    free (ids);
+    free (num_nodes_per_elem);
+    free (num_attr);
+  }
+
+  /* read individual node sets */
+  if (num_node_sets > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++) {
+      nset_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_NODE_SET, nset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++)
+      {
+	ex_get_name(exoid, EX_NODE_SET, ids[i], name);
+	if (strcmp(name, nset_names[i]) != 0) {
+	  printf ("error in ex_get_name for nodeset id %d\n", ids[i]);
+	}
+
+        error = ex_get_node_set_param (exoid, ids[i], 
+                                       &num_nodes_in_set, &num_df_in_set);
+        printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+        printf ("\nnode set %2d parameters: \n", ids[i]);
+        printf ("num_nodes = %2d\n", num_nodes_in_set);
+	printf ("name = '%s'\n", nset_names[i]);
+	free(nset_names[i]);
+        node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+        dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+        error = ex_get_node_set (exoid, ids[i], node_list);
+        printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+          }
+
+        printf ("\nnode list for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_nodes_in_set; j++)
+          {
+            printf ("%3d\n", node_list[j]);
+          }
+
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for node set %2d\n", ids[i]);
+
+            for (j=0; j<num_df_in_set; j++)
+              {
+                printf ("%5.2f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for node set %2d\n", ids[i]);
+
+        free (node_list);
+        free (dist_fact);
+
+	{
+	  int num_attrs = 0;
+	  error = ex_get_attr_param(exoid, EX_NODE_SET, ids[i], &num_attrs);
+	  printf (" after ex_get_attr_param, error = %d\n", error);
+	  printf ("num nodeset attributes for nodeset %d = %d\n", ids[i], num_attrs);
+	  if (num_attrs > 0) {
+	    for (j=0; j<num_attrs; j++) {
+	      attrib_names[j] = (char *)calloc ((max_name_length+1), sizeof(char));
+	    }
+	    error = ex_get_attr_names (exoid, EX_NODE_SET, ids[i], attrib_names);
+	    printf (" after ex_get_attr_names, error = %d\n", error);
+	    
+	    if (error == 0) {
+	      attrib = (float *) calloc(num_nodes_in_set,sizeof(float));
+	      for (j=0; j<num_attrs; j++) {
+		printf ("nodeset attribute %d = '%s'\n", j, attrib_names[j]);
+		error = ex_get_one_attr(exoid, EX_NODE_SET, ids[i], j+1, attrib);
+		printf (" after ex_get_one_attr, error = %d\n", error);
+		for (k=0; k < num_nodes_in_set; k++) {
+		  printf ("%5.1f\n", attrib[k]);
+		}
+		free(attrib_names[j]);
+	      }
+	      free(attrib);
+	    }
+	  }
+	}
+      }
+    free(ids);
+
+    /* read node set properties */
+    error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each node set\n", num_props);
+
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+      }
+    prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+    error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                                  prop_values);
+        if (error == 0)
+          for (j=0; j<num_node_sets; j++)
+            printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                    j+1, i+1, prop_names[i], prop_values[j]);
+        else
+          printf ("after ex_get_prop_array, error = %d\n", error);
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free(prop_values);
+
+    /* read concatenated node sets; this produces the same information as
+     * the above code which reads individual node sets
+     */
+
+    error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %3d\n",error);
+
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+    num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    node_ind = (int *) calloc(num_node_sets, sizeof(int));
+    df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+    node_list = (int *) calloc(list_len, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+    dist_fact = (float *) calloc(list_len, sizeof(float));
+
+    error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                     node_ind, df_ind, node_list, dist_fact);
+    printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+    printf ("\nconcatenated node set info\n");
+
+    printf ("ids = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+    printf ("num_nodes_per_set = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+    printf ("node_ind = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+    printf ("node_list = \n");
+    for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+    printf ("dist_fact = \n");
+    for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+    free (ids);
+    free (df_ind);
+    free (node_ind);
+    free (num_df_per_set);
+    free (node_list);
+    free (dist_fact);
+  }
+
+  /* read individual side sets */
+
+  if (num_side_sets > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+    
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+    
+    for (i=0; i<num_side_sets; i++) {
+      sset_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_SIDE_SET, sset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_side_sets; i++)
+      {
+	ex_get_name(exoid, EX_SIDE_SET, ids[i], name);
+	if (strcmp(name, sset_names[i]) != 0) {
+	  printf ("error in ex_get_name for sideset id %d\n", ids[i]);
+	}
+
+        error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                       &num_df_in_set);
+        printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+        
+        printf ("side set %2d parameters:\n",ids[i]);
+	printf ("name = '%s'\n", sset_names[i]);
+        printf ("num_sides = %3d\n",num_sides_in_set);
+        printf ("num_dist_factors = %3d\n", num_df_in_set);
+	free(sset_names[i]);
+        
+        
+        /* Note: The # of elements is same as # of sides!  */
+        num_elem_in_set = num_sides_in_set;
+        elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+        node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+        dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+        
+        error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+        printf ("\nafter ex_get_side_set, error = %3d\n", error);
+        
+        error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                           node_list);
+        printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+        
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+          }
+        
+        printf ("element list for side set %2d\n", ids[i]);
+        for (j=0; j<num_elem_in_set; j++)
+          {
+            printf ("%3d\n", elem_list[j]);
+          }
+        
+        printf ("side list for side set %2d\n", ids[i]);
+        for (j=0; j<num_sides_in_set; j++)
+          {
+            printf ("%3d\n", side_list[j]);
+          }
+        
+        node_ctr = 0;
+        printf ("node list for side set %2d\n", ids[i]);
+        for (k=0; k<num_elem_in_set; k++)
+          {
+            for (j=0; j<node_ctr_list[k]; j++)
+              {
+                printf ("%3d\n", node_list[node_ctr+j]);
+              }
+            node_ctr += node_ctr_list[k];
+          }
+        
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for side set %2d\n", ids[i]);
+            
+            for (j=0; j<num_df_in_set; j++)
+              {
+                printf ("%5.3f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for side set %2d\n", ids[i]);
+        
+        free (elem_list);
+        free (side_list);
+        free (node_ctr_list);
+        free (node_list);
+        free (dist_fact);
+        
+      }
+    
+    /* read side set properties */
+    error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each side set\n", num_props);
+    
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+      }
+    
+    error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        for (j=0; j<num_side_sets; j++)
+          {
+            error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free (ids);
+
+    error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+    if (num_side_sets > 0)
+      {
+        error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+                elem_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+                node_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+                df_list_len, error);
+      }
+
+    /* read concatenated side sets; this produces the same information as
+     * the above code which reads individual side sets
+     */
+
+    /* concatenated side set read */
+
+    if (num_side_sets > 0) {
+      ids = (int *) calloc(num_side_sets, sizeof(int));
+      num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+      df_ind = (int *) calloc(num_side_sets, sizeof(int));
+      elem_list = (int *) calloc(elem_list_len, sizeof(int));
+      side_list = (int *) calloc(elem_list_len, sizeof(int));
+      dist_fact = (float *) calloc(df_list_len, sizeof(float));
+     
+      error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                       num_df_per_set, elem_ind, df_ind, 
+                                       elem_list, side_list, dist_fact);
+      printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+     
+      printf ("concatenated side set info\n");
+     
+      printf ("ids = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+     
+      printf ("num_elem_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+     
+      printf ("num_dist_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+     
+      printf ("elem_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+     
+      printf ("dist_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+     
+      printf ("elem_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+     
+      printf ("side_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+     
+      printf ("dist_fact = \n");
+      for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+     
+      free (ids);
+      free (num_df_per_set);
+      free (df_ind);
+      free (elem_ind);
+      free (elem_list);
+      free (side_list);
+      free (dist_fact);
+    }
+  }   
+  /* end of concatenated side set read */
+
+  /* read QA records */
+
+  ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+  for (i=0; i<num_qa_rec; i++)
+    {
+      for (j=0; j<4; j++)
+        {
+          qa_record[i][j] = (char *) calloc ((max_name_length+1), sizeof(char));
+        }
+    }
+
+  error = ex_get_qa (exoid, qa_record); 
+  printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+  printf ("QA records = \n");
+  for (i=0; i<num_qa_rec; i++) 
+    {
+      for (j=0; j<4; j++)
+        {
+          printf (" '%s'\n", qa_record[i][j]);
+          free(qa_record[i][j]);
+        }
+    }
+
+  /* read information records */
+
+  error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+
+  for (i=0; i<num_info; i++)
+    {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_info (exoid, info); 
+  printf ("\nafter ex_get_info, error = %3d\n", error);
+
+  printf ("info records = \n");
+  for (i=0; i<num_info; i++)
+    {
+      printf (" '%s'\n", info[i]);
+      free(info[i]);
+    }
+
+  /* read global variables parameters and names */
+
+  error = ex_get_var_param (exoid, "g", &num_glo_vars);
+  printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+  for (i=0; i<num_glo_vars; i++)
+    {
+      var_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+    }
+
+  error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+  printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+  printf ("There are %2d global variables; their names are :\n", 
+          num_glo_vars);
+  for (i=0; i<num_glo_vars; i++)
+    {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+    }
+
+  /* read nodal variables parameters and names */
+  num_nod_vars = 0;
+  if (num_nodes > 0) {
+    error = ex_get_var_param (exoid, "n", &num_nod_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+    for (i=0; i<num_nod_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+      }
+
+    error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+    printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+    for (i=0; i<num_nod_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+  }
+
+  /* read element variables parameters and names */
+
+  num_ele_vars = 0;
+  if (num_elem > 0) {
+    error = ex_get_var_param (exoid, "e", &num_ele_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    for (i=0; i<num_ele_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+      }
+     
+    error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+    printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+    for (i=0; i<num_ele_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+
+    /* read element variable truth table */
+
+    if (num_ele_vars > 0) {
+      truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+     
+      error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+      printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+     
+      printf ("This is the element variable truth table:\n");
+     
+      k = 0;
+      for (i=0; i<num_elem_blk*num_ele_vars; i++)
+        {
+          printf ("%2d\n", truth_tab[k++]);
+        }
+      free (truth_tab);
+    }
+  }
+
+  /* read nodeset variables parameters and names */
+
+  num_nset_vars = 0;
+  if (num_node_sets > 0) {
+    error = ex_get_var_param (exoid, "m", &num_nset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_nset_vars > 0) {
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "m", num_nset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d nodeset variables; their names are :\n", 
+	      num_nset_vars);
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read nodeset variable truth table */
+
+      if (num_nset_vars > 0) {
+	truth_tab = (int *) calloc ((num_node_sets*num_nset_vars), sizeof(int));
+     
+	error = ex_get_nset_var_tab (exoid, num_node_sets, num_nset_vars, truth_tab);
+	printf ("\nafter ex_get_nset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the nodeset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_node_sets*num_nset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* read sideset variables parameters and names */
+
+  num_sset_vars = 0;
+  if (num_side_sets > 0) {
+    error = ex_get_var_param (exoid, "s", &num_sset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_sset_vars > 0) {
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((max_name_length+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "s", num_sset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d sideset variables; their names are :\n", 
+	      num_sset_vars);
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read sideset variable truth table */
+
+      if (num_sset_vars > 0) {
+	truth_tab = (int *) calloc ((num_side_sets*num_sset_vars), sizeof(int));
+     
+	error = ex_get_sset_var_tab (exoid, num_side_sets, num_sset_vars, truth_tab);
+	printf ("\nafter ex_get_sset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the sideset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_side_sets*num_sset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* determine how many time steps are stored */
+
+  error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+  printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+  /* read time value at one time step */
+
+  time_step = 3;
+  error = ex_get_time (exoid, time_step, &time_value);
+  printf ("\nafter ex_get_time, error = %3d\n", error);
+
+  printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+  /* read time values at all time steps */
+
+  time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_all_times (exoid, time_values);
+  printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+  printf ("time values at all time steps are:\n");
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+  free (time_values);
+
+  /* read all global variables at one time step */
+
+  var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+  error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+  printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+  printf ("global variable values at time step %2d\n", time_step);
+  for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a single global variable through time */
+
+  var_index = 1;
+  beg_time = 1;
+  end_time = -1;
+
+  var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                var_values);
+  printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+  printf ("global variable %2d values through time:\n", var_index);
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a nodal variable at one time step */
+
+  if (num_nodes > 0) {
+    var_values = (float *) calloc (num_nodes, sizeof(float));
+
+    error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                              var_values);
+    printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+    printf ("nodal variable %2d values at time step %2d\n", var_index, 
+            time_step);
+    for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+
+    /* read a nodal variable through time */
+
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+    node_num = 1;
+    error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                   end_time, var_values);
+    printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+    printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+            node_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+  }
+  /* read an element variable at one time step */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++)
+      {
+	if (num_elem_in_block[i] > 0) {
+	  var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+         
+	  error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+				   num_elem_in_block[i], var_values);
+	  printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+         
+	  if (!error)
+	    {
+	      printf 
+		("element variable %2d values of element block %2d at time step %2d\n",
+		 var_index, ids[i], time_step);
+	      for (j=0; j<num_elem_in_block[i]; j++) 
+		printf ("%5.3f\n", var_values[j]);
+	    }
+         
+	  free (var_values);
+	}
+      }
+    free (num_elem_in_block);
+    free(ids);
+  }
+  /* read an element variable through time */
+
+  if (num_ele_vars > 0) {
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+     
+    var_index = 2;
+    elem_num = 2;
+    error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+    printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+     
+    printf ("element variable %2d values for element %2d through time:\n", 
+            var_index, elem_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+     
+    free (var_values);
+  }
+   
+  /* read a sideset variable at one time step */
+
+  if (num_sset_vars > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+     
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\n after ex_get_side_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_side_sets; i++)
+      {
+        var_values = (float *) calloc (num_elem_per_set[i], sizeof(float));
+         
+        error = ex_get_sset_var (exoid, time_step, var_index, ids[i], 
+                                 num_elem_per_set[i], var_values);
+        printf ("\nafter ex_get_sset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("sideset variable %2d values of sideset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_elem_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free (num_elem_per_set);
+    free(ids);
+  }
+
+  /* read a nodeset variable at one time step */
+
+  if (num_nset_vars > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+     
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\n after ex_get_node_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_node_sets; i++)
+      {
+        var_values = (float *) calloc (num_nodes_per_set[i], sizeof(float));
+         
+        error = ex_get_nset_var (exoid, time_step, var_index, ids[i], 
+                                 num_nodes_per_set[i], var_values);
+        printf ("\nafter ex_get_nset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("nodeset variable %2d values of nodeset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_nodes_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free(ids);
+  }
+  if (num_node_sets > 0)
+    free (num_nodes_per_set);
+
+  free (name);
+  error = ex_close (exoid);
+  printf ("\nafter ex_close, error = %3d\n", error);
+  return 0;
+}
diff --git a/exodus/cbind/test/testrd-long-name.dmp b/exodus/cbind/test/testrd-long-name.dmp
new file mode 100644
index 0000000..6187d2a
--- /dev/null
+++ b/exodus/cbind/test/testrd-long-name.dmp
@@ -0,0 +1,1139 @@
+
+after ex_open
+         I/O word size 4
+This file can use at most 127-character names
+The maximum name length used is 64-character names
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   7
+num_elem_blk =   7
+num_node_sets =   2
+num_side_sets =   5
+after ex_inquire, error =   0
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'X coordinate name that is padded to be longer than 32 characters'
+y coord name = 'Y coordinate name that is padded to be longer than 32 characters'
+z coord name = 'Z coordinate name that is padded to be longer than 32 characters'
+ after ex_get_attr_param, error = 0
+num nodal attributes = 2
+ after ex_get_attr_names, error = 0
+nodal attribute 0 = 'Node_attr_1'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+nodal attribute 1 = 'Node_attr_2'
+ after ex_get_one_attr, error = 0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+
+after ex_get_map, error =   0
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+elem_map(5) = 6 
+elem_map(6) = 7 
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'Very long name for block_1 that exceeds 32 characters'
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'Very long name for block_2 that exceeds 32 characters'
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+name = 'Very long name for block_3 that exceeds 32 characters'
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'Very long name for block_4 that exceeds 32 characters'
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+name = 'Very long name for block_5 that exceeds 32 characters'
+
+after ex_get_elem_block, error = 0
+element block id = 15
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+name = 'Very long name for block_6 that exceeds 32 characters'
+
+after ex_get_elem_block, error = 0
+element block id = 16
+element type = 'tri'
+num_elem_in_block =  1
+num_nodes_per_elem =  3
+num_attr =  1
+name = 'Very long name for block_7 that exceeds 32 characters'
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element block
+after ex_get_prop_names, error = 0
+element block  1, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    10
+element block  2, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    20
+element block  3, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    30
+element block  4, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    40
+element block  5, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    50
+element block  6, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    60
+element block  7, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    70
+element block  1, property( 3): 'DENSITY'=     0
+element block  2, property( 3): 'DENSITY'=     0
+element block  3, property( 3): 'DENSITY'=     0
+element block  4, property( 3): 'DENSITY'=     0
+element block  5, property( 3): 'DENSITY'=     0
+element block  6, property( 3): 'DENSITY'=     0
+element block  7, property( 3): 'DENSITY'=     0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 15
+ 17
+ 18
+ 19
+ 20
+ 27
+ 28
+ 30
+ 29
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 16
+ 31
+ 32
+ 33
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 10 attribute 'The name for the attribute representing the shell thickness' = 3.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 11 attribute 'The name for the attribute representing the shell thickness' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 12 attribute 'The name for the attribute representing the shell thickness' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 13 attribute 'The name for the attribute representing the shell thickness' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 14 attribute 'The name for the attribute representing the shell thickness' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 15 attribute 'The name for the attribute representing the shell thickness' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 16 attribute 'The name for the attribute representing the shell thickness' = 6.1416
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+name = 'nset_1'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 20 = 1
+ after ex_get_attr_names, error = 0
+nodeset attribute 0 = 'Nodeset_attribute'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+name = 'nset_2'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 21 = 0
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+name = 'sset_1'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+name = 'sset_2'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+name = 'sset_3'
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+name = 'sset_4'
+num_sides =   8
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 33
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+side list for side set 33
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+ 17
+ 18
+ 20
+ 27
+ 18
+ 19
+ 20
+ 28
+ 17
+ 20
+ 19
+ 29
+ 17
+ 19
+ 18
+ 30
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+name = 'sset_5'
+num_sides =  10
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+node list for side set 34
+ 21
+ 22
+ 25
+ 24
+ 22
+ 23
+ 26
+ 25
+ 21
+ 24
+ 26
+ 23
+ 21
+ 23
+ 22
+ 24
+ 25
+ 26
+ 31
+ 32
+ 33
+ 33
+ 32
+ 31
+ 31
+ 32
+ 32
+ 33
+ 33
+ 31
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 29,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 94,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  8
+ 10
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 19
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'node_variable_a_somewhat_long_name_0'
+ 'node_variable_a_much_longer_name_that_is_not_too_long_name'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'the_stress_on_the_elements_in_this_block_that_are_active_now'
+ 'ele_var1'
+ 'ele_var2'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 nodeset variables; their names are :
+ 'ns_var0'
+ 'ns_var1'
+ 'ns_var2'
+
+after ex_get_nset_var_tab, error =   0
+This is the nodeset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 sideset variables; their names are :
+ 'ss_var0'
+ 'ss_var1'
+ 'ss_var2'
+
+after ex_get_sset_var_tab, error =   0
+This is the sideset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+1.870
+1.900
+1.930
+1.960
+1.990
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 12 at time step  3
+6.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 15 at time step  3
+9.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 16 at time step  3
+10.030
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+ after ex_get_side_set_ids, error =   0
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 30 at time step  3
+7.030
+7.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 31 at time step  3
+8.030
+8.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 32 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+9.180
+9.210
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 33 at time step  3
+10.030
+10.060
+10.090
+10.120
+10.150
+10.180
+10.210
+10.240
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 34 at time step  3
+11.030
+11.060
+11.090
+11.120
+11.150
+11.180
+11.210
+11.240
+11.270
+11.300
+
+ after ex_get_node_set_ids, error =   0
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 20 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 21 at time step  3
+10.030
+10.060
+10.090
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd-nfaced.c b/exodus/cbind/test/testrd-nfaced.c
new file mode 100644
index 0000000..0440e5b
--- /dev/null
+++ b/exodus/cbind/test/testrd-nfaced.c
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2010 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test-nsided.exo created by testwt-nsided
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "netcdf.h"
+#include <assert.h>
+#include <inttypes.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+  int exoid, num_dim, num_nodes, num_elem_blk;
+  int *num_elem_in_block, *num_face_in_block, *num_nodes_per_elem, *num_edges_per_elem, *num_faces_per_elem, *num_attr;
+  int error, nnodes;
+  int i, j, k;
+  int *connect, *fconnect;
+  int *ids, *nnpe, *nnpf; 
+  int num_qa_rec, num_info;
+  int CPU_word_size,IO_word_size;
+  int idum;
+
+  float *x, *y, *z;
+  float version, fdum;
+
+  char *coord_names[3], *qa_record[2][4], *info[3];
+  char *block_names[10];
+  char *elem_type[10];
+  char name[MAX_STR_LENGTH+1];
+  char *cdum = 0;
+
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* open EXODUS II files */
+  exoid = ex_open ("test-nfaced.exo",  /* filename path */
+                   EX_READ,             /* access mode = READ */
+                   &CPU_word_size,      /* CPU word size */
+                   &IO_word_size,       /* IO word size */
+                   &version);           /* ExodusII library version */
+
+  printf ("\nafter ex_open\n");
+  if (exoid < 0) exit(1);
+
+  printf ("test.exo is an EXODUSII file; version %4.2f\n",
+          version);
+  printf ("         I/O word size %1d\n",IO_word_size);
+
+  ex_inquire(exoid,EX_INQ_LIB_VERS, &idum, &version, cdum);
+  printf ("EXODUSII Library API; version %4.2f (%d)\n", version, idum);
+
+  /* read database parameters */
+  {
+    ex_init_params par;
+    error = ex_get_init_ext (exoid, &par);
+
+    printf ("after ex_get_init, error = %3d\n", error);
+
+    printf ("database parameters:\n");
+    printf ("title =  '%s'\n",par.title);
+    printf ("num_dim = %"PRId64"\n",par.num_dim);
+    printf ("num_nodes = %"PRId64"\n",par.num_nodes);
+    printf ("num_edge = %"PRId64"\n",par.num_edge);
+    printf ("num_face = %"PRId64"\n",par.num_face);
+    printf ("num_elem = %"PRId64"\n",par.num_elem);
+    printf ("num_elem_blk = %"PRId64"\n",par.num_elem_blk);
+    printf ("num_node_sets = %"PRId64"\n",par.num_node_sets);
+    printf ("num_side_sets = %"PRId64"\n",par.num_side_sets);
+
+    num_dim = par.num_dim;
+    num_nodes = par.num_nodes;
+    num_elem_blk = par.num_elem_blk;
+  }
+    
+  assert(num_dim == 3);
+
+  /* read nodal coordinates values and names from database */
+
+  x = (float *) calloc(num_nodes, sizeof(float));
+  y = (float *) calloc(num_nodes, sizeof(float));
+  z = (float *) calloc(num_nodes, sizeof(float));
+
+  error = ex_get_coord (exoid, x, y, z);
+  printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+  printf ("x, y, z coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\t%5.1f\t%5.1f\n", x[i], y[i], z[i]);
+    }
+
+  free (x);
+  free (y);
+  free (z);
+
+  for (i=0; i<num_dim; i++) {
+    coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+  }
+  
+  error = ex_get_coord_names (exoid, coord_names);
+  printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+
+  printf ("x coord name = '%s'\n", coord_names[0]);
+  printf ("y coord name = '%s'\n", coord_names[1]);
+  printf ("z coord name = '%s'\n", coord_names[2]);
+
+  for (i=0; i<num_dim; i++)
+    free(coord_names[i]);
+
+  /* read element block parameters */
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+    num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_face_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_edges_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_faces_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    for (i=0; i<num_elem_blk; i++) {
+      elem_type[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      block_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    error = ex_get_names(exoid, EX_ELEM_BLOCK, block_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+    
+    for (i=0; i<num_elem_blk; i++) {
+      ex_get_name(exoid, EX_ELEM_BLOCK, ids[i], name);
+      if (strcmp(name, block_names[i]) != 0) {
+	printf ("error in ex_get_name for block id %d\n", ids[i]);
+      }
+      error = ex_get_block (exoid, EX_ELEM_BLOCK, ids[i], elem_type[i],
+			    &(num_elem_in_block[i]),
+			    &(num_nodes_per_elem[i]),
+			    &(num_edges_per_elem[i]),
+			    &(num_faces_per_elem[i]),
+			    &(num_attr[i]));
+      printf ("\nafter ex_get_elem_block, error = %d\n", error);
+         
+      printf ("element block id = %2d\n",ids[i]);
+      printf ("element block type = '%s'\n", elem_type[i]);
+      printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+      printf ("num_total_nodes_per_block = %2d\n",num_nodes_per_elem[i]);
+      printf ("num_total_edges_per_block = %2d\n",num_edges_per_elem[i]);
+      printf ("num_total_faces_per_block = %2d\n",num_faces_per_elem[i]);
+      printf ("num_attr = %2d\n",num_attr[i]);
+      printf ("name = '%s'\n",block_names[i]);
+    }
+     
+  }
+   
+  /* read connectivity */
+  for (i=0; i<num_elem_blk; i++) {
+    if (num_elem_in_block[i] > 0) {
+      if (strcmp(elem_type[i], "NFACED") == 0 || strcmp(elem_type[i], "nfaced") == 0) {
+	int nfaces = 0;
+	connect = (int *) calloc((num_faces_per_elem[i]), sizeof(int));
+
+	nnpe = (int *) calloc(num_elem_in_block[i], sizeof(int));
+	error = ex_get_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, ids[i], nnpe);
+	printf ("\nafter ex_get_entity_count_per_polyhedra, error = %d\n", error);
+	
+	for (j=0; j < num_elem_in_block[i]; j++) {
+	  nfaces += nnpe[j];
+	}
+	assert(nfaces == num_faces_per_elem[i]);
+	
+	error = ex_get_conn (exoid, EX_ELEM_BLOCK, ids[i], NULL, NULL, connect);
+	printf ("\nafter ex_get_conn, error = %d\n", error);
+	
+	printf ("face connectivity array for elem block %2d\n", ids[i]);
+	nfaces = 0;
+	for (j=0; j < num_elem_in_block[i]; j++) {
+	  printf("Element %d, %d faces:\t", j+1, nnpe[j]);
+	  for (k=0; k < nnpe[j]; k++) {
+	    printf("%3d ", connect[nfaces+k]);
+	  }
+	  printf("\n");
+	  nfaces += nnpe[j];
+	}
+
+	/* Now get the faces and their connectivity... */
+	/*
+	 * Convention is that the faces for an nfaced block are in a
+	 * face block which has the same id as the element block...
+	 * (Or, at least let's try that for awhile and see if it works...)
+	 */
+
+	/* NOTE: We are overwriting the element block data here... */
+	error = ex_get_block (exoid, EX_FACE_BLOCK, ids[i], elem_type[i],
+			      &(num_face_in_block[i]),
+			      &(num_nodes_per_elem[i]),
+			      NULL, NULL,
+			      &(num_attr[i]));
+
+	printf ("\nafter ex_get_block (EX_FACE_BLOCK), error = %d\n", error);
+	
+	error = ex_get_names(exoid, EX_FACE_BLOCK, block_names);
+	printf ("\nafter ex_get_names, error = %3d\n", error);
+
+	printf ("\tface block id = %2d\n",ids[i]);
+	printf ("\tface block type = '%s'\n", elem_type[i]);
+	printf ("\tnum_face_in_block = %2d\n",num_face_in_block[i]);
+	printf ("\tnum_total_nodes_per_block = %2d\n",num_nodes_per_elem[i]);
+	printf ("\tnum_attr = %2d\n",num_attr[i]);
+	printf ("\tname = '%s'\n",block_names[i]);
+
+	fconnect = (int *) calloc((num_nodes_per_elem[i]), sizeof(int));
+	nnpf = (int *) calloc(num_face_in_block[i], sizeof(int));
+	error = ex_get_entity_count_per_polyhedra(exoid, EX_FACE_BLOCK, ids[i], nnpf);
+	printf ("\nafter ex_get_entity_count_per_polyhedra, error = %d\n", error);
+	
+	nnodes = 0;
+	for (j=0; j < num_face_in_block[i]; j++) {
+	  nnodes += nnpf[j];
+	}
+	assert(nnodes == num_nodes_per_elem[i]);
+	
+	error = ex_get_conn (exoid, EX_FACE_BLOCK, ids[i], fconnect, NULL, NULL);
+	printf ("\nafter ex_get_conn, error = %d\n", error);
+	
+	printf ("node connectivity array for face block %2d\n", ids[i]);
+	nnodes = 0;
+	for (j=0; j < num_face_in_block[i]; j++) {
+	  printf("Face %d, %d nodes:\t", j+1, nnpf[j]);
+	  for (k=0; k < nnpf[j]; k++) {
+	    printf("%3d ", fconnect[nnodes+k]);
+	  }
+	  printf("\n");
+	  nnodes += nnpf[j];
+	}
+	free(fconnect);
+	free(nnpe);
+	free(nnpf);
+      } else {
+	connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+				 sizeof(int));
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	
+	for (j=0; j<num_nodes_per_elem[i]; j++) {
+	  printf ("%3d\n", connect[j]);
+	}
+      }
+      free (connect);
+    }
+  }
+
+  for (i=0; i<num_elem_blk; i++) {
+    free(elem_type[i]);
+    free(block_names[i]);
+  }
+  if (num_elem_blk > 0) {
+    free (ids);
+    free (num_nodes_per_elem);
+    free (num_edges_per_elem);
+    free (num_faces_per_elem);
+    free (num_attr);
+  }
+
+  /* read QA records */
+  ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+  for (i=0; i<num_qa_rec; i++)
+    {
+      for (j=0; j<4; j++)
+	{
+	  qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+    }
+
+  error = ex_get_qa (exoid, qa_record); 
+  printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+  printf ("QA records = \n");
+  for (i=0; i<num_qa_rec; i++) 
+    {
+      for (j=0; j<4; j++)
+	{
+	  printf (" '%s'\n", qa_record[i][j]);
+	  free(qa_record[i][j]);
+	}
+    }
+
+  /* read information records */
+
+  error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+
+  for (i=0; i<num_info; i++)
+    {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_info (exoid, info); 
+  printf ("\nafter ex_get_info, error = %3d\n", error);
+
+  printf ("info records = \n");
+  for (i=0; i<num_info; i++)
+    {
+      printf (" '%s'\n", info[i]);
+      free(info[i]);
+    }
+
+  error = ex_close (exoid);
+  printf ("\nafter ex_close, error = %3d\n", error);
+  return 0;
+}
diff --git a/exodus/cbind/test/testrd-nfaced.dmp b/exodus/cbind/test/testrd-nfaced.dmp
new file mode 100644
index 0000000..933936b
--- /dev/null
+++ b/exodus/cbind/test/testrd-nfaced.dmp
@@ -0,0 +1,109 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim = 3
+num_nodes = 14
+num_edge = 0
+num_face = 15
+num_elem = 3
+num_elem_blk = 1
+num_node_sets = 0
+num_side_sets = 0
+
+after ex_get_coord, error =   0
+x, y, z coords = 
+  0.0	  0.0	  0.0
+  2.0	  0.0	  0.0
+  0.0	  2.0	  0.0
+  2.0	  2.0	  0.0
+  0.0	  0.0	  2.0
+  2.0	  0.0	  2.0
+  0.0	  2.0	  2.0
+  2.0	  2.0	  2.0
+  0.0	  3.5	  1.0
+  2.0	  3.5	  1.0
+  0.0	  3.0	  1.5
+  2.0	  3.0	  1.5
+  0.0	  3.0	  0.5
+  2.0	  3.0	  0.5
+
+after ex_get_coord_names, error =   0
+x coord name = 'x'
+y coord name = 'y'
+z coord name = 'z'
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element block type = 'nfaced'
+num_elem_in_block =  3
+num_total_nodes_per_block =  0
+num_total_edges_per_block =  0
+num_total_faces_per_block = 17
+num_attr =  0
+name = 'nfaced_1'
+
+after ex_get_entity_count_per_polyhedra, error = 0
+
+after ex_get_conn, error = 0
+face connectivity array for elem block 10
+Element 1, 5 faces:	  1   2   3   4   5 
+Element 2, 5 faces:	  4   6   7   8   9 
+Element 3, 7 faces:	  8  10  11  12  13  14  15 
+
+after ex_get_block (EX_FACE_BLOCK), error = 0
+
+after ex_get_names, error =   0
+	face block id = 10
+	face block type = 'nsided'
+	num_face_in_block = 15
+	num_total_nodes_per_block = 58
+	num_attr =  0
+	name = 'face_block_1'
+
+after ex_get_entity_count_per_polyhedra, error = 0
+
+after ex_get_conn, error = 0
+node connectivity array for face block 10
+Face 1, 3 nodes:	  5   6   8 
+Face 2, 3 nodes:	  2   1   4 
+Face 3, 4 nodes:	  6   2   4   8 
+Face 4, 4 nodes:	  8   4   1   5 
+Face 5, 4 nodes:	  1   2   6   5 
+Face 6, 3 nodes:	  5   8   7 
+Face 7, 3 nodes:	  1   3   4 
+Face 8, 4 nodes:	  7   8   4   3 
+Face 9, 4 nodes:	  7   3   1   5 
+Face 10, 5 nodes:	  8   4  14  10  12 
+Face 11, 5 nodes:	  7  11   9  13   3 
+Face 12, 4 nodes:	  7   8  12  11 
+Face 13, 4 nodes:	 11  12  10   9 
+Face 14, 4 nodes:	  9  10  14  13 
+Face 15, 4 nodes:	 13  14   4   3 
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT-NFACED'
+ 'testwt-nfaced'
+ '2010/02/15'
+ '06:35:15'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd-nm32.dmp b/exodus/cbind/test/testrd-nm32.dmp
new file mode 100644
index 0000000..356c32d
--- /dev/null
+++ b/exodus/cbind/test/testrd-nm32.dmp
@@ -0,0 +1,1137 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   7
+num_elem_blk =   7
+num_node_sets =   2
+num_side_sets =   5
+ after ex_inquire, error = 0
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'X coordinate name that is padded'
+y coord name = 'Y coordinate name that is padded'
+z coord name = 'Z coordinate name that is padded'
+ after ex_get_attr_param, error = 0
+num nodal attributes = 2
+ after ex_get_attr_names, error = 0
+nodal attribute 0 = 'Node_attr_1'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+nodal attribute 1 = 'Node_attr_2'
+ after ex_get_one_attr, error = 0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+
+after ex_get_map, error =   0
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+elem_map(5) = 6 
+elem_map(6) = 7 
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'Very long name for block_1 that'
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'Very long name for block_2 that'
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+name = 'Very long name for block_3 that'
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'Very long name for block_4 that'
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+name = 'Very long name for block_5 that'
+
+after ex_get_elem_block, error = 0
+element block id = 15
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+name = 'Very long name for block_6 that'
+
+after ex_get_elem_block, error = 0
+element block id = 16
+element type = 'tri'
+num_elem_in_block =  1
+num_nodes_per_elem =  3
+num_attr =  1
+name = 'Very long name for block_7 that'
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element block
+after ex_get_prop_names, error = 0
+element block  1, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    10
+element block  2, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    20
+element block  3, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    30
+element block  4, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    40
+element block  5, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    50
+element block  6, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    60
+element block  7, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    70
+element block  1, property( 3): 'DENSITY'=     0
+element block  2, property( 3): 'DENSITY'=     0
+element block  3, property( 3): 'DENSITY'=     0
+element block  4, property( 3): 'DENSITY'=     0
+element block  5, property( 3): 'DENSITY'=     0
+element block  6, property( 3): 'DENSITY'=     0
+element block  7, property( 3): 'DENSITY'=     0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 15
+ 17
+ 18
+ 19
+ 20
+ 27
+ 28
+ 30
+ 29
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 16
+ 31
+ 32
+ 33
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 10 attribute 'The name for the attribute repre' = 3.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 11 attribute 'The name for the attribute repre' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 12 attribute 'The name for the attribute repre' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 13 attribute 'The name for the attribute repre' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 14 attribute 'The name for the attribute repre' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 15 attribute 'The name for the attribute repre' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 16 attribute 'The name for the attribute repre' = 6.1416
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+name = 'nset_1'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 20 = 1
+ after ex_get_attr_names, error = 0
+nodeset attribute 0 = 'Nodeset_attribute'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+name = 'nset_2'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 21 = 0
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+name = 'sset_1'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+name = 'sset_2'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+name = 'sset_3'
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+name = 'sset_4'
+num_sides =   8
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 33
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+side list for side set 33
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+ 17
+ 18
+ 20
+ 27
+ 18
+ 19
+ 20
+ 28
+ 17
+ 20
+ 19
+ 29
+ 17
+ 19
+ 18
+ 30
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+name = 'sset_5'
+num_sides =  10
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+node list for side set 34
+ 21
+ 22
+ 25
+ 24
+ 22
+ 23
+ 26
+ 25
+ 21
+ 24
+ 26
+ 23
+ 21
+ 23
+ 22
+ 24
+ 25
+ 26
+ 31
+ 32
+ 33
+ 33
+ 32
+ 31
+ 31
+ 32
+ 32
+ 33
+ 33
+ 31
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 29,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 94,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  8
+ 10
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 19
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'node_variable_a_somewhat_long_na'
+ 'node_variable_a_much_longer_name'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'the_stress_on_the_elements_in_th'
+ 'ele_var1'
+ 'ele_var2'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 nodeset variables; their names are :
+ 'ns_var0'
+ 'ns_var1'
+ 'ns_var2'
+
+after ex_get_nset_var_tab, error =   0
+This is the nodeset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 sideset variables; their names are :
+ 'ss_var0'
+ 'ss_var1'
+ 'ss_var2'
+
+after ex_get_sset_var_tab, error =   0
+This is the sideset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+1.870
+1.900
+1.930
+1.960
+1.990
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 12 at time step  3
+6.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 15 at time step  3
+9.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 16 at time step  3
+10.030
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+ after ex_get_side_set_ids, error =   0
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 30 at time step  3
+7.030
+7.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 31 at time step  3
+8.030
+8.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 32 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+9.180
+9.210
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 33 at time step  3
+10.030
+10.060
+10.090
+10.120
+10.150
+10.180
+10.210
+10.240
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 34 at time step  3
+11.030
+11.060
+11.090
+11.120
+11.150
+11.180
+11.210
+11.240
+11.270
+11.300
+
+ after ex_get_node_set_ids, error =   0
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 20 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 21 at time step  3
+10.030
+10.060
+10.090
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd-nsided.c b/exodus/cbind/test/testrd-nsided.c
new file mode 100644
index 0000000..b9be200
--- /dev/null
+++ b/exodus/cbind/test/testrd-nsided.c
@@ -0,0 +1,1153 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test-nsided.exo created by testwt-nsided
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "netcdf.h"
+#include <assert.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+  int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+  int num_side_sets, error, nnodes;
+  int i, j, k;
+  int *elem_map = NULL;
+  int *connect = NULL;
+  int *node_list = NULL;
+  int *node_ctr_list = NULL;
+  int *elem_list = NULL;
+  int *side_list = NULL;
+  int *ids = NULL;
+  int *nnpe = NULL;
+  int *num_nodes_per_set = NULL;
+  int *num_elem_per_set = NULL;
+  int *num_df_per_set = NULL;
+  int *node_ind = NULL;
+  int *elem_ind = NULL;
+  int *df_ind = NULL;
+  int num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars;
+  int num_nset_vars, num_sset_vars;
+  int *truth_tab = NULL;
+  int num_time_steps;
+  int *num_elem_in_block = NULL;
+  int *num_nodes_per_elem = NULL;
+  int *num_attr = NULL;
+  int num_nodes_in_set, num_elem_in_set;
+  int num_sides_in_set, num_df_in_set;
+  int list_len, elem_list_len, df_list_len;
+  int node_num, time_step, var_index, beg_time, end_time, elem_num;
+  int CPU_word_size,IO_word_size;
+  int num_props, prop_value, *prop_values;
+  int idum;
+
+  float time_value, *time_values, *var_values;
+  float *x, *y, *z;
+  float *attrib, *dist_fact;
+  float version, fdum;
+
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+  char *block_names[10], *nset_names[10], *sset_names[10];
+  char *attrib_names[10];
+  char *elem_type[10];
+  char name[MAX_STR_LENGTH+1];
+  char title[MAX_LINE_LENGTH+1];
+  char *cdum = 0;
+  char *prop_names[3];
+
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* open EXODUS II files */
+  exoid = ex_open ("test-nsided.exo",  /* filename path */
+                   EX_READ,             /* access mode = READ */
+                   &CPU_word_size,      /* CPU word size */
+                   &IO_word_size,       /* IO word size */
+                   &version);           /* ExodusII library version */
+
+  printf ("\nafter ex_open\n");
+  if (exoid < 0) exit(1);
+
+  printf ("test.exo is an EXODUSII file; version %4.2f\n",
+          version);
+  printf ("         I/O word size %1d\n",IO_word_size);
+
+  ex_inquire(exoid,EX_INQ_LIB_VERS, &idum, &version, cdum);
+  printf ("EXODUSII Library API; version %4.2f (%d)\n", version, idum);
+
+  /* read database parameters */
+  error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                       &num_elem_blk, &num_node_sets, &num_side_sets);
+
+  printf ("after ex_get_init, error = %3d\n", error);
+
+  printf ("database parameters:\n");
+  printf ("title =  '%s'\n",title);
+  printf ("num_dim = %3d\n",num_dim);
+  printf ("num_nodes = %3d\n",num_nodes);
+  printf ("num_elem = %3d\n",num_elem);
+  printf ("num_elem_blk = %3d\n",num_elem_blk);
+  printf ("num_node_sets = %3d\n",num_node_sets);
+  printf ("num_side_sets = %3d\n",num_side_sets);
+
+  /* read nodal coordinates values and names from database */
+
+  x = (float *) calloc(num_nodes, sizeof(float));
+  y = (float *) calloc(num_nodes, sizeof(float));
+  if (num_dim >= 3)
+    z = (float *) calloc(num_nodes, sizeof(float));
+  else
+    z = 0;
+
+  error = ex_get_coord (exoid, x, y, z);
+  printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+  printf ("x coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", x[i]);
+    }
+
+  printf ("y coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", y[i]);
+    }
+
+  if (num_dim >= 3)
+    {
+      printf ("z coords = \n");
+      for (i=0; i<num_nodes; i++)
+        {
+          printf ("%5.1f\n", z[i]);
+        }
+    }
+
+  free (x);
+  free (y);
+  if (num_dim >= 3)
+    free (z);
+
+
+  for (i=0; i<num_dim; i++)
+    {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_coord_names (exoid, coord_names);
+  printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+
+  printf ("x coord name = '%s'\n", coord_names[0]);
+  printf ("y coord name = '%s'\n", coord_names[1]);
+
+  for (i=0; i<num_dim; i++)
+    free(coord_names[i]);
+
+  {
+    int num_attrs = 0;
+    error = ex_get_attr_param(exoid, EX_NODAL, 0, &num_attrs);
+    printf (" after ex_get_attr_param, error = %d\n", error);
+    printf ("num nodal attributes = %d\n", num_attrs);
+    if (num_attrs > 0) {
+      for (j=0; j<num_attrs; j++) {
+	attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+      error = ex_get_attr_names (exoid, EX_NODAL, 0, attrib_names);
+      printf (" after ex_get_attr_names, error = %d\n", error);
+      
+      if (error == 0) {
+	attrib = (float *) calloc(num_nodes,sizeof(float));
+	for (j=0; j<num_attrs; j++) {
+	  printf ("nodal attribute %d = '%s'\n", j, attrib_names[j]);
+	  error = ex_get_one_attr(exoid, EX_NODAL, 0, j+1, attrib);
+	  printf (" after ex_get_one_attr, error = %d\n", error);
+	  for (i=0; i < num_nodes; i++) {
+	    printf ("%5.1f\n", attrib[i]);
+	  }
+	  free(attrib_names[j]);
+	}
+	free(attrib);
+      }
+    }
+  }
+  
+  /* read element order map */
+  elem_map = (int *) calloc(num_elem, sizeof(int));
+
+  error = ex_get_map (exoid, elem_map);
+  printf ("\nafter ex_get_map, error = %3d\n", error);
+
+  for (i=0; i<num_elem; i++) {
+    printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+  }
+
+  free (elem_map);
+
+  /* read element block parameters */
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+    num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    for (i=0; i<num_elem_blk; i++) {
+      elem_type[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++) {
+      block_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_ELEM_BLOCK, block_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+    
+    for (i=0; i<num_elem_blk; i++) {
+      ex_get_name(exoid, EX_ELEM_BLOCK, ids[i], name);
+      if (strcmp(name, block_names[i]) != 0) {
+	printf ("error in ex_get_name for block id %d\n", ids[i]);
+      }
+      error = ex_get_elem_block (exoid, ids[i], elem_type[i],
+				 &(num_elem_in_block[i]), 
+				 &(num_nodes_per_elem[i]), &(num_attr[i]));
+      printf ("\nafter ex_get_elem_block, error = %d\n", error);
+         
+      printf ("element block id = %2d\n",ids[i]);
+      printf ("element type = '%s'\n", elem_type[i]);
+      printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+      printf ("num_total_nodes_per_block = %2d\n",num_nodes_per_elem[i]);
+      printf ("num_attr = %2d\n",num_attr[i]);
+      printf ("name = '%s'\n",block_names[i]);
+      free(block_names[i]);
+    }
+     
+    /* read element block properties */
+    error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each element block\n", num_props);
+     
+    for (i=0; i<num_props; i++) {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+     
+    error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+     
+     
+    for (i=1; i<num_props; i++) {/* Prop 1 is id; skip that here */
+      for (j=0; j<num_elem_blk; j++) {
+	error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+			    &prop_value);
+	printf (" after ex_get_prop, error = %d\n", error);
+	if (error == 0)
+	  printf ("element block %2d, property(%2d): '%s'= %5d\n",
+		  j+1, i+1, prop_names[i], prop_value);
+	else
+	  printf ("after ex_get_prop, error = %d\n", error);
+      }
+    }
+    
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+  }
+   
+  /* read element connectivity */
+  for (i=0; i<num_elem_blk; i++) {
+    if (num_elem_in_block[i] > 0) {
+      if (strcmp(elem_type[i], "NSIDED") == 0 || strcmp(elem_type[i], "nsided") == 0) {
+	connect = (int *) calloc((num_nodes_per_elem[i]), sizeof(int));
+
+	nnpe = (int *) calloc(num_elem_in_block[i], sizeof(int));
+	error = ex_get_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, ids[i], nnpe);
+	printf ("\nafter ex_get_entity_count_per_polyhedra, error = %d\n", error);
+	
+	nnodes = 0;
+	for (j=0; j < num_elem_in_block[i]; j++) {
+	  nnodes += nnpe[j];
+	}
+	assert(nnodes == num_nodes_per_elem[i]);
+	
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	nnodes = 0;
+	for (j=0; j < num_elem_in_block[i]; j++) {
+	  printf("Element %d, %d nodes:\t", j+1, nnpe[j]);
+	  for (k=0; k < nnpe[j]; k++) {
+	    printf("%3d ", connect[nnodes+k]);
+	  }
+	  printf("\n");
+	  nnodes += nnpe[j];
+	}
+	free(nnpe);
+      } else {
+	connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+				 sizeof(int));
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	
+	for (j=0; j<num_nodes_per_elem[i]; j++) {
+	  printf ("%3d\n", connect[j]);
+	}
+      }
+      free (connect);
+    }
+  }
+
+  /* read element block attributes */
+  for (i=0; i<num_elem_blk; i++) {
+    if (num_attr[i] > 0) {
+      for (j=0; j<num_attr[i]; j++)
+	attrib_names[j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      
+      attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+      error = ex_get_elem_attr (exoid, ids[i], attrib);
+      printf ("\n after ex_get_elem_attr, error = %d\n", error);
+      
+      if (error == 0) {
+	error = ex_get_elem_attr_names (exoid, ids[i], attrib_names);
+	printf (" after ex_get_elem_attr_names, error = %d\n", error);
+	
+	if (error == 0) {
+	  printf ("element block %d attribute '%s' = %6.4f\n", ids[i], attrib_names[0], *attrib);
+	}
+      }
+      free (attrib);
+      for (j=0; j<num_attr[i]; j++)
+	free (attrib_names[j]);
+    }
+  }
+  
+  if (num_elem_blk > 0) {
+    free (ids);
+    free (num_nodes_per_elem);
+    free (num_attr);
+  }
+
+  /* read individual node sets */
+  if (num_node_sets > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++) {
+      nset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_NODE_SET, nset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++)
+      {
+	ex_get_name(exoid, EX_NODE_SET, ids[i], name);
+	if (strcmp(name, nset_names[i]) != 0) {
+	  printf ("error in ex_get_name for nodeset id %d\n", ids[i]);
+	}
+
+	error = ex_get_node_set_param (exoid, ids[i], 
+				       &num_nodes_in_set, &num_df_in_set);
+	printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+	printf ("\nnode set %2d parameters: \n", ids[i]);
+	printf ("num_nodes = %2d\n", num_nodes_in_set);
+	printf ("name = '%s'\n", nset_names[i]);
+	free(nset_names[i]);
+	node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+	dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+	error = ex_get_node_set (exoid, ids[i], node_list);
+	printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+	if (num_df_in_set > 0)
+	  {
+	    error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+	    printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+	  }
+
+	printf ("\nnode list for node set %2d\n", ids[i]);
+
+	for (j=0; j<num_nodes_in_set; j++)
+	  {
+	    printf ("%3d\n", node_list[j]);
+	  }
+
+	if (num_df_in_set > 0)
+	  {
+	    printf ("dist factors for node set %2d\n", ids[i]);
+
+	    for (j=0; j<num_df_in_set; j++)
+	      {
+		printf ("%5.2f\n", dist_fact[j]);
+	      }
+	  }
+	else
+	  printf ("no dist factors for node set %2d\n", ids[i]);
+
+	free (node_list);
+	free (dist_fact);
+
+	{
+	  int num_attrs = 0;
+	  error = ex_get_attr_param(exoid, EX_NODE_SET, ids[i], &num_attrs);
+	  printf (" after ex_get_attr_param, error = %d\n", error);
+	  printf ("num nodeset attributes for nodeset %d = %d\n", ids[i], num_attrs);
+	  if (num_attrs > 0) {
+	    for (j=0; j<num_attrs; j++) {
+	      attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	    }
+	    error = ex_get_attr_names (exoid, EX_NODE_SET, ids[i], attrib_names);
+	    printf (" after ex_get_attr_names, error = %d\n", error);
+	    
+	    if (error == 0) {
+	      attrib = (float *) calloc(num_nodes_in_set,sizeof(float));
+	      for (j=0; j<num_attrs; j++) {
+		printf ("nodeset attribute %d = '%s'\n", j, attrib_names[j]);
+		error = ex_get_one_attr(exoid, EX_NODE_SET, ids[i], j+1, attrib);
+		printf (" after ex_get_one_attr, error = %d\n", error);
+		for (k=0; k < num_nodes_in_set; k++) {
+		  printf ("%5.1f\n", attrib[k]);
+		}
+		free(attrib_names[j]);
+	      }
+	      free(attrib);
+	    }
+	  }
+	}
+      }
+    free(ids);
+
+    /* read node set properties */
+    error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each node set\n", num_props);
+
+    for (i=0; i<num_props; i++)
+      {
+	prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+    error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+	error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+				  prop_values);
+	if (error == 0)
+	  for (j=0; j<num_node_sets; j++)
+	    printf ("node set %2d, property(%2d): '%s'= %5d\n",
+		    j+1, i+1, prop_names[i], prop_values[j]);
+	else
+	  printf ("after ex_get_prop_array, error = %d\n", error);
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free(prop_values);
+
+    /* read concatenated node sets; this produces the same information as
+     * the above code which reads individual node sets
+     */
+
+    error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %3d\n",error);
+
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+    num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    node_ind = (int *) calloc(num_node_sets, sizeof(int));
+    df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+	    list_len, error);
+    node_list = (int *) calloc(list_len, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+	    list_len, error);
+    dist_fact = (float *) calloc(list_len, sizeof(float));
+
+    error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+				     node_ind, df_ind, node_list, dist_fact);
+    printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+    printf ("\nconcatenated node set info\n");
+
+    printf ("ids = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+    printf ("num_nodes_per_set = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+    printf ("node_ind = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+    printf ("node_list = \n");
+    for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+    printf ("dist_fact = \n");
+    for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+    free (ids);
+    free (df_ind);
+    free (node_ind);
+    free (num_df_per_set);
+    free (node_list);
+    free (dist_fact);
+  }
+
+  /* read individual side sets */
+
+  if (num_side_sets > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+    
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+    
+    for (i=0; i<num_side_sets; i++) {
+      sset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_SIDE_SET, sset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_side_sets; i++)
+      {
+	ex_get_name(exoid, EX_SIDE_SET, ids[i], name);
+	if (strcmp(name, sset_names[i]) != 0) {
+	  printf ("error in ex_get_name for sideset id %d\n", ids[i]);
+	}
+
+	error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+				       &num_df_in_set);
+	printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+        
+	printf ("side set %2d parameters:\n",ids[i]);
+	printf ("name = '%s'\n", sset_names[i]);
+	printf ("num_sides = %3d\n",num_sides_in_set);
+	printf ("num_dist_factors = %3d\n", num_df_in_set);
+	free(sset_names[i]);
+        
+        
+	/* Note: The # of elements is same as # of sides!  */
+	num_elem_in_set = num_sides_in_set;
+	elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+	side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+	node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+	node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+	dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+        
+	error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+	printf ("\nafter ex_get_side_set, error = %3d\n", error);
+        
+	if (num_df_in_set > 0) {
+	  error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+	  printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+	}
+        
+	printf ("element list for side set %2d\n", ids[i]);
+	for (j=0; j<num_elem_in_set; j++)
+	  {
+	    printf ("%3d\n", elem_list[j]);
+	  }
+        
+	printf ("side list for side set %2d\n", ids[i]);
+	for (j=0; j<num_sides_in_set; j++)
+	  {
+	    printf ("%3d\n", side_list[j]);
+	  }
+        
+	if (num_df_in_set > 0)
+	  {
+	    printf ("dist factors for side set %2d\n", ids[i]);
+            
+	    for (j=0; j<num_df_in_set; j++)
+	      {
+		printf ("%5.3f\n", dist_fact[j]);
+	      }
+	  }
+	else
+	  printf ("no dist factors for side set %2d\n", ids[i]);
+        
+	free (elem_list);
+	free (side_list);
+	free (node_ctr_list);
+	free (node_list);
+	free (dist_fact);
+        
+      }
+    
+    /* read side set properties */
+    error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each side set\n", num_props);
+    
+    for (i=0; i<num_props; i++) {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+    
+    error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++) {
+      for (j=0; j<num_side_sets; j++)
+	{
+	  error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+			      &prop_value);
+	  if (error == 0)
+	    printf ("side set %2d, property(%2d): '%s'= %5d\n",
+		    j+1, i+1, prop_names[i], prop_value);
+	  else
+	    printf ("after ex_get_prop, error = %d\n", error);
+	}
+    }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free (ids);
+
+    error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+	    num_side_sets, error);
+
+    if (num_side_sets > 0) {
+      error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+      printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+	      elem_list_len, error);
+
+      error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+      printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+	      df_list_len, error);
+    }
+
+    /* read concatenated side sets; this produces the same information as
+     * the above code which reads individual side sets
+     */
+
+    /* concatenated side set read */
+
+    if (num_side_sets > 0) {
+      ids = (int *) calloc(num_side_sets, sizeof(int));
+      num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+      df_ind = (int *) calloc(num_side_sets, sizeof(int));
+      elem_list = (int *) calloc(elem_list_len, sizeof(int));
+      side_list = (int *) calloc(elem_list_len, sizeof(int));
+      dist_fact = (float *) calloc(df_list_len, sizeof(float));
+     
+      error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+				       num_df_per_set, elem_ind, df_ind, 
+				       elem_list, side_list, dist_fact);
+      printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+     
+      printf ("concatenated side set info\n");
+     
+      printf ("ids = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+     
+      printf ("num_elem_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+     
+      printf ("num_dist_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+     
+      printf ("elem_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+     
+      printf ("dist_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+     
+      printf ("elem_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+     
+      printf ("side_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+     
+      printf ("dist_fact = \n");
+      for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+     
+      free (ids);
+      free (num_df_per_set);
+      free (df_ind);
+      free (elem_ind);
+      free (elem_list);
+      free (side_list);
+      free (dist_fact);
+    }
+  }   
+  /* end of concatenated side set read */
+
+  /* read QA records */
+
+  ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+  for (i=0; i<num_qa_rec; i++)
+    {
+      for (j=0; j<4; j++)
+	{
+	  qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+    }
+
+  error = ex_get_qa (exoid, qa_record); 
+  printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+  printf ("QA records = \n");
+  for (i=0; i<num_qa_rec; i++) 
+    {
+      for (j=0; j<4; j++)
+	{
+	  printf (" '%s'\n", qa_record[i][j]);
+	  free(qa_record[i][j]);
+	}
+    }
+
+  /* read information records */
+
+  error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+
+  for (i=0; i<num_info; i++)
+    {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_info (exoid, info); 
+  printf ("\nafter ex_get_info, error = %3d\n", error);
+
+  printf ("info records = \n");
+  for (i=0; i<num_info; i++)
+    {
+      printf (" '%s'\n", info[i]);
+      free(info[i]);
+    }
+
+  /* read global variables parameters and names */
+
+  error = ex_get_var_param (exoid, "g", &num_glo_vars);
+  printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+  for (i=0; i<num_glo_vars; i++)
+    {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+  printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+  printf ("There are %2d global variables; their names are :\n", 
+	  num_glo_vars);
+  for (i=0; i<num_glo_vars; i++)
+    {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+    }
+
+  /* read nodal variables parameters and names */
+  num_nod_vars = 0;
+  if (num_nodes > 0) {
+    error = ex_get_var_param (exoid, "n", &num_nod_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+    for (i=0; i<num_nod_vars; i++)
+      {
+	var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+
+    error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+    printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+    for (i=0; i<num_nod_vars; i++)
+      {
+	printf (" '%s'\n", var_names[i]);
+	free(var_names[i]);
+      }
+  }
+
+  /* read element variables parameters and names */
+
+  num_ele_vars = 0;
+  if (num_elem > 0) {
+    error = ex_get_var_param (exoid, "e", &num_ele_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    for (i=0; i<num_ele_vars; i++)
+      {
+	var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+    printf ("There are %2d element variables; their names are :\n", 
+	    num_ele_vars);
+    for (i=0; i<num_ele_vars; i++)
+      {
+	printf (" '%s'\n", var_names[i]);
+	free(var_names[i]);
+      }
+
+    /* read element variable truth table */
+
+    if (num_ele_vars > 0) {
+      truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+     
+      error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+      printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+     
+      printf ("This is the element variable truth table:\n");
+     
+      k = 0;
+      for (i=0; i<num_elem_blk*num_ele_vars; i++)
+	{
+	  printf ("%2d\n", truth_tab[k++]);
+	}
+      free (truth_tab);
+    }
+  }
+
+  /* read nodeset variables parameters and names */
+
+  num_nset_vars = 0;
+  if (num_node_sets > 0) {
+    error = ex_get_var_param (exoid, "m", &num_nset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_nset_vars > 0) {
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "m", num_nset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d nodeset variables; their names are :\n", 
+	      num_nset_vars);
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read nodeset variable truth table */
+
+      if (num_nset_vars > 0) {
+	truth_tab = (int *) calloc ((num_node_sets*num_nset_vars), sizeof(int));
+     
+	error = ex_get_nset_var_tab (exoid, num_node_sets, num_nset_vars, truth_tab);
+	printf ("\nafter ex_get_nset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the nodeset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_node_sets*num_nset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* read sideset variables parameters and names */
+
+  num_sset_vars = 0;
+  if (num_side_sets > 0) {
+    error = ex_get_var_param (exoid, "s", &num_sset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_sset_vars > 0) {
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "s", num_sset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d sideset variables; their names are :\n", 
+	      num_sset_vars);
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read sideset variable truth table */
+
+      if (num_sset_vars > 0) {
+	truth_tab = (int *) calloc ((num_side_sets*num_sset_vars), sizeof(int));
+     
+	error = ex_get_sset_var_tab (exoid, num_side_sets, num_sset_vars, truth_tab);
+	printf ("\nafter ex_get_sset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the sideset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_side_sets*num_sset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* determine how many time steps are stored */
+
+  error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+  printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+  /* read time value at one time step */
+
+  time_step = 3;
+  error = ex_get_time (exoid, time_step, &time_value);
+  printf ("\nafter ex_get_time, error = %3d\n", error);
+
+  printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+  /* read time values at all time steps */
+
+  time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_all_times (exoid, time_values);
+  printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+  printf ("time values at all time steps are:\n");
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+  free (time_values);
+
+  /* read all global variables at one time step */
+
+  var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+  error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+  printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+  printf ("global variable values at time step %2d\n", time_step);
+  for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a single global variable through time */
+
+  var_index = 1;
+  beg_time = 1;
+  end_time = -1;
+
+  var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+				var_values);
+  printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+  printf ("global variable %2d values through time:\n", var_index);
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a nodal variable at one time step */
+
+  if (num_nodes > 0) {
+    var_values = (float *) calloc (num_nodes, sizeof(float));
+
+    error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+			      var_values);
+    printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+    printf ("nodal variable %2d values at time step %2d\n", var_index, 
+	    time_step);
+    for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+
+    /* read a nodal variable through time */
+
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+    node_num = 1;
+    error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+				   end_time, var_values);
+    printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+    printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+	    node_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+  }
+  /* read an element variable at one time step */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++)
+      {
+	if (num_elem_in_block[i] > 0) {
+	  var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+         
+	  error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+				   num_elem_in_block[i], var_values);
+	  printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+         
+	  if (!error)
+	    {
+	      printf 
+		("element variable %2d values of element block %2d at time step %2d\n",
+		 var_index, ids[i], time_step);
+	      for (j=0; j<num_elem_in_block[i]; j++) 
+		printf ("%5.3f\n", var_values[j]);
+	    }
+         
+	  free (var_values);
+	}
+      }
+    free (num_elem_in_block);
+    free(ids);
+  }
+  /* read an element variable through time */
+
+  if (num_ele_vars > 0) {
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+     
+    var_index = 2;
+    elem_num = 2;
+    error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+				  end_time, var_values);
+    printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+     
+    printf ("element variable %2d values for element %2d through time:\n", 
+	    var_index, elem_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+     
+    free (var_values);
+  }
+   
+  /* read a sideset variable at one time step */
+
+  if (num_sset_vars > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+     
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\n after ex_get_side_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_side_sets; i++)
+      {
+	var_values = (float *) calloc (num_elem_per_set[i], sizeof(float));
+         
+	error = ex_get_sset_var (exoid, time_step, var_index, ids[i], 
+				 num_elem_per_set[i], var_values);
+	printf ("\nafter ex_get_sset_var, error = %3d\n", error);
+         
+	if (!error)
+	  {
+	    printf 
+	      ("sideset variable %2d values of sideset %2d at time step %2d\n",
+	       var_index, ids[i], time_step);
+	    for (j=0; j<num_elem_per_set[i]; j++) 
+	      printf ("%5.3f\n", var_values[j]);
+	  }
+         
+	free (var_values); 
+      }
+    free (num_elem_per_set);
+    free(ids);
+  }
+
+  /* read a nodeset variable at one time step */
+
+  if (num_nset_vars > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+     
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\n after ex_get_node_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_node_sets; i++)
+      {
+	var_values = (float *) calloc (num_nodes_per_set[i], sizeof(float));
+         
+	error = ex_get_nset_var (exoid, time_step, var_index, ids[i], 
+				 num_nodes_per_set[i], var_values);
+	printf ("\nafter ex_get_nset_var, error = %3d\n", error);
+         
+	if (!error)
+	  {
+	    printf 
+	      ("nodeset variable %2d values of nodeset %2d at time step %2d\n",
+	       var_index, ids[i], time_step);
+	    for (j=0; j<num_nodes_per_set[i]; j++) 
+	      printf ("%5.3f\n", var_values[j]);
+	  }
+         
+	free (var_values); 
+      }
+    free(ids);
+  }
+  if (num_node_sets > 0)
+    free (num_nodes_per_set);
+
+  for (i=0; i<num_elem_blk; i++) {
+    free(elem_type[i]);
+  }
+
+  error = ex_close (exoid);
+  printf ("\nafter ex_close, error = %3d\n", error);
+  return 0;
+}
diff --git a/exodus/cbind/test/testrd-nsided.dmp b/exodus/cbind/test/testrd-nsided.dmp
new file mode 100644
index 0000000..61a2004
--- /dev/null
+++ b/exodus/cbind/test/testrd-nsided.dmp
@@ -0,0 +1,852 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   7
+num_elem_blk =   1
+num_node_sets =   2
+num_side_sets =   5
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+y coord name = 'ycoor'
+ after ex_get_attr_param, error = 0
+num nodal attributes = 2
+ after ex_get_attr_names, error = 0
+nodal attribute 0 = 'Node_attr_1'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+nodal attribute 1 = 'Node_attr_2'
+ after ex_get_one_attr, error = 0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+
+after ex_get_map, error =   0
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+elem_map(5) = 6 
+elem_map(6) = 7 
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'nsided'
+num_elem_in_block =  7
+num_total_nodes_per_block = 37
+num_attr =  0
+name = 'nsided_1'
+
+after ex_inquire, error = 0
+
+There are  1 properties for each element block
+after ex_get_prop_names, error = 0
+
+after ex_get_entity_count_per_polyhedra, error = 0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+Element 1, 4 nodes:	  1   2   3   4 
+Element 2, 4 nodes:	  5   6   7   8 
+Element 3, 8 nodes:	  9  10  11  12  13  14  15  16 
+Element 4, 4 nodes:	 17  18  19  20 
+Element 5, 6 nodes:	 21  22  23  24  25  26 
+Element 6, 8 nodes:	 17  18  19  20  27  28  30  29 
+Element 7, 3 nodes:	 31  32  33 
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+name = 'nset_1'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 20 = 1
+ after ex_get_attr_names, error = 0
+nodeset attribute 0 = 'Nodeset_attribute'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+name = 'nset_2'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 21 = 0
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+name = 'sset_1'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+name = 'sset_2'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+name = 'sset_3'
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+name = 'sset_4'
+num_sides =   8
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+element list for side set 33
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+side list for side set 33
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+name = 'sset_5'
+num_sides =  10
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 29,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  8
+ 10
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 19
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'node_variable_a_very_long_name_0'
+ 'nod_var1'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'ele_var0'
+ 'ele_var1'
+ 'ele_var2'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 nodeset variables; their names are :
+ 'ns_var0'
+ 'ns_var1'
+ 'ns_var2'
+
+after ex_get_nset_var_tab, error =   0
+This is the nodeset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 sideset variables; their names are :
+ 'ss_var0'
+ 'ss_var1'
+ 'ss_var2'
+
+after ex_get_sset_var_tab, error =   0
+This is the sideset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+1.870
+1.900
+1.930
+1.960
+1.990
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+4.060
+4.090
+4.120
+4.150
+4.180
+4.210
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+5.020
+5.040
+5.060
+5.080
+5.100
+5.120
+5.140
+5.160
+5.180
+5.200
+
+ after ex_get_side_set_ids, error =   0
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 30 at time step  3
+7.030
+7.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 31 at time step  3
+8.030
+8.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 32 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+9.180
+9.210
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 33 at time step  3
+10.030
+10.060
+10.090
+10.120
+10.150
+10.180
+10.210
+10.240
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 34 at time step  3
+11.030
+11.060
+11.090
+11.120
+11.150
+11.180
+11.210
+11.240
+11.270
+11.300
+
+ after ex_get_node_set_ids, error =   0
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 20 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 21 at time step  3
+10.030
+10.060
+10.090
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd.c b/exodus/cbind/test/testrd.c
new file mode 100644
index 0000000..0c37d94
--- /dev/null
+++ b/exodus/cbind/test/testrd.c
@@ -0,0 +1,1203 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test.exo created by testwt
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "netcdf.h"
+#include "exodusII.h"
+/* #include "drmd.h" */
+
+
+int main (int argc, char **argv)
+{
+  int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+  int num_side_sets, error;
+  int i, j, k, node_ctr;
+  int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+  int *ids; 
+  int *num_nodes_per_set = NULL;
+  int *num_elem_per_set = NULL;
+  int *num_df_per_set = NULL;
+  int *node_ind = NULL;
+  int *elem_ind = NULL;
+  int *df_ind = NULL;
+  int num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars;
+  int num_nset_vars, num_sset_vars;
+  int *truth_tab;
+  int num_time_steps;
+  int *num_elem_in_block = NULL;
+  int *num_nodes_per_elem = NULL;
+  int *num_attr = NULL;
+  int num_nodes_in_set, num_elem_in_set;
+  int num_sides_in_set, num_df_in_set;
+  int list_len, elem_list_len, node_list_len, df_list_len;
+  int node_num, time_step, var_index, beg_time, end_time, elem_num;
+  int CPU_word_size,IO_word_size;
+  int num_props, prop_value, *prop_values;
+  int idum;
+
+  float time_value, *time_values, *var_values;
+  float *x, *y, *z;
+  float *attrib, *dist_fact;
+  float version, fdum;
+
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+  char *block_names[10], *nset_names[10], *sset_names[10];
+  char *attrib_names[10];
+  char name[MAX_STR_LENGTH+1];
+  char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+  char title_chk[MAX_LINE_LENGTH+1];
+  char *cdum = 0;
+  char *prop_names[3];
+
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* open EXODUS II files */
+  exoid = ex_open ("test.exo",  /* filename path */
+                   EX_READ,             /* access mode = READ */
+                   &CPU_word_size,      /* CPU word size */
+                   &IO_word_size,       /* IO word size */
+                   &version);           /* ExodusII library version */
+
+  printf ("\nafter ex_open\n");
+  if (exoid < 0) exit(1);
+
+  printf ("test.exo is an EXODUSII file; version %4.2f\n",
+          version);
+  /*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+  printf ("         I/O word size %1d\n",IO_word_size);
+  ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+  printf ("EXODUSII API; version %4.2f\n", version);
+
+  ex_inquire(exoid,EX_INQ_LIB_VERS, &idum, &version, cdum);
+  printf ("EXODUSII Library API; version %4.2f (%d)\n", version, idum);
+
+  /* ncopts = NC_VERBOSE; */
+
+  /* read database parameters */
+
+  error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                       &num_elem_blk, &num_node_sets, &num_side_sets);
+
+  printf ("after ex_get_init, error = %3d\n", error);
+
+  printf ("database parameters:\n");
+  printf ("title =  '%s'\n",title);
+  printf ("num_dim = %3d\n",num_dim);
+  printf ("num_nodes = %3d\n",num_nodes);
+  printf ("num_elem = %3d\n",num_elem);
+  printf ("num_elem_blk = %3d\n",num_elem_blk);
+  printf ("num_node_sets = %3d\n",num_node_sets);
+  printf ("num_side_sets = %3d\n",num_side_sets);
+
+  /* Check that ex_inquire gives same title */
+  error = ex_inquire (exoid, EX_INQ_TITLE, &idum, &fdum, title_chk);
+  printf (" after ex_inquire, error = %d\n", error);
+  if (strcmp(title, title_chk) != 0) {
+    printf ("error in ex_inquire for EX_INQ_TITLE\n");
+  }
+  
+  /* read nodal coordinates values and names from database */
+
+  x = (float *) calloc(num_nodes, sizeof(float));
+  if (num_dim >= 2)
+    y = (float *) calloc(num_nodes, sizeof(float));
+  else
+    y = 0;
+  
+  if (num_dim >= 3)
+    z = (float *) calloc(num_nodes, sizeof(float));
+  else
+    z = 0;
+
+  error = ex_get_coord (exoid, x, y, z);
+  printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+  printf ("x coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", x[i]);
+    }
+
+  if (num_dim >= 2) {
+    printf ("y coords = \n");
+    for (i=0; i<num_nodes; i++)
+      {
+	printf ("%5.1f\n", y[i]);
+      }
+  }
+  if (num_dim >= 3)
+    {
+      printf ("z coords = \n");
+      for (i=0; i<num_nodes; i++)
+        {
+          printf ("%5.1f\n", z[i]);
+        }
+    }
+
+  /*
+    error = ex_get_1_coord (exoid, 2, x, y, z);
+    printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+    printf ("x coord of node 2 = \n");
+    printf ("%f \n", x[0]);
+
+    printf ("y coord of node 2 = \n");
+    printf ("%f \n", y[0]);
+  */
+  free (x);
+  if (num_dim >= 2)
+    free (y);
+  if (num_dim >= 3)
+    free (z);
+
+
+  for (i=0; i<num_dim; i++)
+    {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_coord_names (exoid, coord_names);
+  printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+  printf ("x coord name = '%s'\n", coord_names[0]);
+  if (num_dim >1)
+    printf ("y coord name = '%s'\n", coord_names[1]);
+  if (num_dim >2)
+    printf ("z coord name = '%s'\n", coord_names[2]);
+
+  for (i=0; i<num_dim; i++)
+    free(coord_names[i]);
+
+  {
+    int num_attrs = 0;
+    error = ex_get_attr_param(exoid, EX_NODAL, 0, &num_attrs);
+    printf (" after ex_get_attr_param, error = %d\n", error);
+    printf ("num nodal attributes = %d\n", num_attrs);
+    if (num_attrs > 0) {
+      for (j=0; j<num_attrs; j++) {
+	attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+      error = ex_get_attr_names (exoid, EX_NODAL, 0, attrib_names);
+      printf (" after ex_get_attr_names, error = %d\n", error);
+      
+      if (error == 0) {
+	attrib = (float *) calloc(num_nodes,sizeof(float));
+	for (j=0; j<num_attrs; j++) {
+	  printf ("nodal attribute %d = '%s'\n", j, attrib_names[j]);
+	  error = ex_get_one_attr(exoid, EX_NODAL, 0, j+1, attrib);
+	  printf (" after ex_get_one_attr, error = %d\n", error);
+	  for (i=0; i < num_nodes; i++) {
+	    printf ("%5.1f\n", attrib[i]);
+	  }
+	  free(attrib_names[j]);
+	}
+	free(attrib);
+      }
+    }
+  }
+  
+  /* read element order map */
+
+  elem_map = (int *) calloc(num_elem, sizeof(int));
+
+  error = ex_get_map (exoid, elem_map);
+  printf ("\nafter ex_get_map, error = %3d\n", error);
+
+  for (i=0; i<num_elem; i++)
+    {
+      printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+    }
+
+  free (elem_map);
+
+  /* read element block parameters */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+    num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++) {
+      block_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_ELEM_BLOCK, block_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+    
+    for (i=0; i<num_elem_blk; i++)
+      {
+	ex_get_name(exoid, EX_ELEM_BLOCK, ids[i], name);
+	if (strcmp(name, block_names[i]) != 0) {
+	  printf ("error in ex_get_name for block id %d\n", ids[i]);
+	}
+        error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                   &(num_elem_in_block[i]), 
+                                   &(num_nodes_per_elem[i]), &(num_attr[i]));
+        printf ("\nafter ex_get_elem_block, error = %d\n", error);
+         
+        printf ("element block id = %2d\n",ids[i]);
+        printf ("element type = '%s'\n", elem_type);
+        printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+        printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+        printf ("num_attr = %2d\n",num_attr[i]);
+        printf ("name = '%s'\n",block_names[i]);
+	free(block_names[i]);
+      }
+     
+    /* read element block properties */
+    error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each element block\n", num_props);
+     
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+     
+     
+    for (i=1; i<num_props; i++) /* Prop 1 is id; skip that here */
+      {
+        for (j=0; j<num_elem_blk; j++)
+          {
+            error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+     
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+  }
+   
+  /* read element connectivity */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+				 sizeof(int));
+	
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	
+	for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	    printf ("%3d\n", connect[j]);
+	  }
+	/*
+	  error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+	  printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	  
+	  printf ("node list for first element of element block %d \n ", ids[i]);
+	  for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	  printf ("%d \n", connect[j]);
+	  }
+	*/
+	free (connect);
+      }
+    }
+
+  /* read element block attributes */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	for (j=0; j<num_attr[i]; j++)
+	  attrib_names[j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	
+	attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+	error = ex_get_elem_attr (exoid, ids[i], attrib);
+	printf ("\n after ex_get_elem_attr, error = %d\n", error);
+	
+	if (error == 0) {
+	  error = ex_get_elem_attr_names (exoid, ids[i], attrib_names);
+	  printf (" after ex_get_elem_attr_names, error = %d\n", error);
+	  
+	  if (error == 0) {
+	    printf ("element block %d attribute '%s' = %6.4f\n", ids[i], attrib_names[0], *attrib);
+	  }
+	}
+	free (attrib);
+	for (j=0; j<num_attr[i]; j++)
+	  free (attrib_names[j]);
+      }
+    }
+      
+  if (num_elem_blk > 0) {
+    free (ids);
+    free (num_nodes_per_elem);
+    free (num_attr);
+  }
+
+  /* read individual node sets */
+  if (num_node_sets > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++) {
+      nset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_NODE_SET, nset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++)
+      {
+	ex_get_name(exoid, EX_NODE_SET, ids[i], name);
+	if (strcmp(name, nset_names[i]) != 0) {
+	  printf ("error in ex_get_name for nodeset id %d\n", ids[i]);
+	}
+
+        error = ex_get_node_set_param (exoid, ids[i], 
+                                       &num_nodes_in_set, &num_df_in_set);
+        printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+        printf ("\nnode set %2d parameters: \n", ids[i]);
+        printf ("num_nodes = %2d\n", num_nodes_in_set);
+	printf ("name = '%s'\n", nset_names[i]);
+	free(nset_names[i]);
+        node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+        dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+        error = ex_get_node_set (exoid, ids[i], node_list);
+        printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+          }
+
+        printf ("\nnode list for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_nodes_in_set; j++)
+          {
+            printf ("%3d\n", node_list[j]);
+          }
+
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for node set %2d\n", ids[i]);
+
+            for (j=0; j<num_df_in_set; j++)
+              {
+                printf ("%5.2f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for node set %2d\n", ids[i]);
+
+        free (node_list);
+        free (dist_fact);
+
+	{
+	  int num_attrs = 0;
+	  error = ex_get_attr_param(exoid, EX_NODE_SET, ids[i], &num_attrs);
+	  printf (" after ex_get_attr_param, error = %d\n", error);
+	  printf ("num nodeset attributes for nodeset %d = %d\n", ids[i], num_attrs);
+	  if (num_attrs > 0) {
+	    for (j=0; j<num_attrs; j++) {
+	      attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	    }
+	    error = ex_get_attr_names (exoid, EX_NODE_SET, ids[i], attrib_names);
+	    printf (" after ex_get_attr_names, error = %d\n", error);
+	    
+	    if (error == 0) {
+	      attrib = (float *) calloc(num_nodes_in_set,sizeof(float));
+	      for (j=0; j<num_attrs; j++) {
+		printf ("nodeset attribute %d = '%s'\n", j, attrib_names[j]);
+		error = ex_get_one_attr(exoid, EX_NODE_SET, ids[i], j+1, attrib);
+		printf (" after ex_get_one_attr, error = %d\n", error);
+		for (k=0; k < num_nodes_in_set; k++) {
+		  printf ("%5.1f\n", attrib[k]);
+		}
+		free(attrib_names[j]);
+	      }
+	      free(attrib);
+	    }
+	  }
+	}
+      }
+    free(ids);
+
+    /* read node set properties */
+    error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each node set\n", num_props);
+
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+    error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                                  prop_values);
+        if (error == 0)
+          for (j=0; j<num_node_sets; j++)
+            printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                    j+1, i+1, prop_names[i], prop_values[j]);
+        else
+          printf ("after ex_get_prop_array, error = %d\n", error);
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free(prop_values);
+
+    /* read concatenated node sets; this produces the same information as
+     * the above code which reads individual node sets
+     */
+
+    error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %3d\n",error);
+
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+    num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    node_ind = (int *) calloc(num_node_sets, sizeof(int));
+    df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+    node_list = (int *) calloc(list_len, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+    dist_fact = (float *) calloc(list_len, sizeof(float));
+
+    error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                     node_ind, df_ind, node_list, dist_fact);
+    printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+    printf ("\nconcatenated node set info\n");
+
+    printf ("ids = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+    printf ("num_nodes_per_set = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+    printf ("node_ind = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+    printf ("node_list = \n");
+    for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+    printf ("dist_fact = \n");
+    for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+    free (ids);
+    free (df_ind);
+    free (node_ind);
+    free (num_df_per_set);
+    free (node_list);
+    free (dist_fact);
+  }
+
+  /* read individual side sets */
+
+  if (num_side_sets > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+    
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+    
+    for (i=0; i<num_side_sets; i++) {
+      sset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_SIDE_SET, sset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_side_sets; i++)
+      {
+	ex_get_name(exoid, EX_SIDE_SET, ids[i], name);
+	if (strcmp(name, sset_names[i]) != 0) {
+	  printf ("error in ex_get_name for sideset id %d\n", ids[i]);
+	}
+
+        error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                       &num_df_in_set);
+        printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+        
+        printf ("side set %2d parameters:\n",ids[i]);
+	printf ("name = '%s'\n", sset_names[i]);
+        printf ("num_sides = %3d\n",num_sides_in_set);
+        printf ("num_dist_factors = %3d\n", num_df_in_set);
+	free(sset_names[i]);
+        
+        
+        /* Note: The # of elements is same as # of sides!  */
+        num_elem_in_set = num_sides_in_set;
+        elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+        node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+        dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+        
+        error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+        printf ("\nafter ex_get_side_set, error = %3d\n", error);
+        
+        error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                           node_list);
+        printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+        
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+          }
+        
+        printf ("element list for side set %2d\n", ids[i]);
+        for (j=0; j<num_elem_in_set; j++)
+          {
+            printf ("%3d\n", elem_list[j]);
+          }
+        
+        printf ("side list for side set %2d\n", ids[i]);
+        for (j=0; j<num_sides_in_set; j++)
+          {
+            printf ("%3d\n", side_list[j]);
+          }
+        
+        node_ctr = 0;
+        printf ("node list for side set %2d\n", ids[i]);
+        for (k=0; k<num_elem_in_set; k++)
+          {
+            for (j=0; j<node_ctr_list[k]; j++)
+              {
+                printf ("%3d\n", node_list[node_ctr+j]);
+              }
+            node_ctr += node_ctr_list[k];
+          }
+        
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for side set %2d\n", ids[i]);
+            
+            for (j=0; j<num_df_in_set; j++)
+              {
+                printf ("%5.3f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for side set %2d\n", ids[i]);
+        
+        free (elem_list);
+        free (side_list);
+        free (node_ctr_list);
+        free (node_list);
+        free (dist_fact);
+        
+      }
+    
+    /* read side set properties */
+    error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each side set\n", num_props);
+    
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    
+    error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        for (j=0; j<num_side_sets; j++)
+          {
+            error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free (ids);
+
+    error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+    if (num_side_sets > 0)
+      {
+        error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+                elem_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+                node_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+                df_list_len, error);
+      }
+
+    /* read concatenated side sets; this produces the same information as
+     * the above code which reads individual side sets
+     */
+
+    /* concatenated side set read */
+
+    if (num_side_sets > 0) {
+      ids = (int *) calloc(num_side_sets, sizeof(int));
+      num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+      df_ind = (int *) calloc(num_side_sets, sizeof(int));
+      elem_list = (int *) calloc(elem_list_len, sizeof(int));
+      side_list = (int *) calloc(elem_list_len, sizeof(int));
+      dist_fact = (float *) calloc(df_list_len, sizeof(float));
+     
+      error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                       num_df_per_set, elem_ind, df_ind, 
+                                       elem_list, side_list, dist_fact);
+      printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+     
+      printf ("concatenated side set info\n");
+     
+      printf ("ids = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+     
+      printf ("num_elem_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+     
+      printf ("num_dist_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+     
+      printf ("elem_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+     
+      printf ("dist_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+     
+      printf ("elem_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+     
+      printf ("side_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+     
+      printf ("dist_fact = \n");
+      for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+     
+      free (ids);
+      free (num_df_per_set);
+      free (df_ind);
+      free (elem_ind);
+      free (elem_list);
+      free (side_list);
+      free (dist_fact);
+    }
+  }   
+  /* end of concatenated side set read */
+
+  /* read QA records */
+
+  ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+  for (i=0; i<num_qa_rec; i++)
+    {
+      for (j=0; j<4; j++)
+        {
+          qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+        }
+    }
+
+  error = ex_get_qa (exoid, qa_record); 
+  printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+  printf ("QA records = \n");
+  for (i=0; i<num_qa_rec; i++) 
+    {
+      for (j=0; j<4; j++)
+        {
+          printf (" '%s'\n", qa_record[i][j]);
+          free(qa_record[i][j]);
+        }
+    }
+
+  /* read information records */
+
+  error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+
+  for (i=0; i<num_info; i++)
+    {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_info (exoid, info); 
+  printf ("\nafter ex_get_info, error = %3d\n", error);
+
+  printf ("info records = \n");
+  for (i=0; i<num_info; i++)
+    {
+      printf (" '%s'\n", info[i]);
+      free(info[i]);
+    }
+
+  /* read global variables parameters and names */
+
+  error = ex_get_var_param (exoid, "g", &num_glo_vars);
+  printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+  for (i=0; i<num_glo_vars; i++)
+    {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+  printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+  printf ("There are %2d global variables; their names are :\n", 
+          num_glo_vars);
+  for (i=0; i<num_glo_vars; i++)
+    {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+    }
+
+  /* read nodal variables parameters and names */
+  num_nod_vars = 0;
+  if (num_nodes > 0) {
+    error = ex_get_var_param (exoid, "n", &num_nod_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+    for (i=0; i<num_nod_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+
+    error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+    printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+    for (i=0; i<num_nod_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+  }
+
+  /* read element variables parameters and names */
+
+  num_ele_vars = 0;
+  if (num_elem > 0) {
+    error = ex_get_var_param (exoid, "e", &num_ele_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    for (i=0; i<num_ele_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+    printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+    for (i=0; i<num_ele_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+
+    /* read element variable truth table */
+
+    if (num_ele_vars > 0) {
+      truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+     
+      error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+      printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+     
+      printf ("This is the element variable truth table:\n");
+     
+      k = 0;
+      for (i=0; i<num_elem_blk*num_ele_vars; i++)
+        {
+          printf ("%2d\n", truth_tab[k++]);
+        }
+      free (truth_tab);
+    }
+  }
+
+  /* read nodeset variables parameters and names */
+
+  num_nset_vars = 0;
+  if (num_node_sets > 0) {
+    error = ex_get_var_param (exoid, "m", &num_nset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_nset_vars > 0) {
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "m", num_nset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d nodeset variables; their names are :\n", 
+	      num_nset_vars);
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read nodeset variable truth table */
+
+      if (num_nset_vars > 0) {
+	truth_tab = (int *) calloc ((num_node_sets*num_nset_vars), sizeof(int));
+     
+	error = ex_get_nset_var_tab (exoid, num_node_sets, num_nset_vars, truth_tab);
+	printf ("\nafter ex_get_nset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the nodeset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_node_sets*num_nset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* read sideset variables parameters and names */
+
+  num_sset_vars = 0;
+  if (num_side_sets > 0) {
+    error = ex_get_var_param (exoid, "s", &num_sset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_sset_vars > 0) {
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "s", num_sset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d sideset variables; their names are :\n", 
+	      num_sset_vars);
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read sideset variable truth table */
+
+      if (num_sset_vars > 0) {
+	truth_tab = (int *) calloc ((num_side_sets*num_sset_vars), sizeof(int));
+     
+	error = ex_get_sset_var_tab (exoid, num_side_sets, num_sset_vars, truth_tab);
+	printf ("\nafter ex_get_sset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the sideset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_side_sets*num_sset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* determine how many time steps are stored */
+
+  error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+  printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+  /* read time value at one time step */
+
+  time_step = 3;
+  error = ex_get_time (exoid, time_step, &time_value);
+  printf ("\nafter ex_get_time, error = %3d\n", error);
+
+  printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+  /* read time values at all time steps */
+
+  time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_all_times (exoid, time_values);
+  printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+  printf ("time values at all time steps are:\n");
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+  free (time_values);
+
+  /* read all global variables at one time step */
+
+  var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+  error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+  printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+  printf ("global variable values at time step %2d\n", time_step);
+  for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a single global variable through time */
+
+  var_index = 1;
+  beg_time = 1;
+  end_time = -1;
+
+  var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                var_values);
+  printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+  printf ("global variable %2d values through time:\n", var_index);
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a nodal variable at one time step */
+
+  if (num_nodes > 0) {
+    var_values = (float *) calloc (num_nodes, sizeof(float));
+
+    error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                              var_values);
+    printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+    printf ("nodal variable %2d values at time step %2d\n", var_index, 
+            time_step);
+    for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+
+    /* read a nodal variable through time */
+
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+    node_num = 1;
+    error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                   end_time, var_values);
+    printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+    printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+            node_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+  }
+  /* read an element variable at one time step */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++)
+      {
+	if (num_elem_in_block[i] > 0) {
+	  var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+         
+	  error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+				   num_elem_in_block[i], var_values);
+	  printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+         
+	  if (!error)
+	    {
+	      printf 
+		("element variable %2d values of element block %2d at time step %2d\n",
+		 var_index, ids[i], time_step);
+	      for (j=0; j<num_elem_in_block[i]; j++) 
+		printf ("%5.3f\n", var_values[j]);
+	    }
+         
+	  free (var_values);
+	}
+      }
+    free (num_elem_in_block);
+    free(ids);
+  }
+  /* read an element variable through time */
+
+  if (num_ele_vars > 0) {
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+     
+    var_index = 2;
+    elem_num = 2;
+    error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+    printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+     
+    printf ("element variable %2d values for element %2d through time:\n", 
+            var_index, elem_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+     
+    free (var_values);
+  }
+   
+  /* read a sideset variable at one time step */
+
+  if (num_sset_vars > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+     
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\n after ex_get_side_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_side_sets; i++)
+      {
+        var_values = (float *) calloc (num_elem_per_set[i], sizeof(float));
+         
+        error = ex_get_sset_var (exoid, time_step, var_index, ids[i], 
+                                 num_elem_per_set[i], var_values);
+        printf ("\nafter ex_get_sset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("sideset variable %2d values of sideset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_elem_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free (num_elem_per_set);
+    free(ids);
+  }
+
+  /* read a nodeset variable at one time step */
+
+  if (num_nset_vars > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+     
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\n after ex_get_node_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_node_sets; i++)
+      {
+        var_values = (float *) calloc (num_nodes_per_set[i], sizeof(float));
+         
+        error = ex_get_nset_var (exoid, time_step, var_index, ids[i], 
+                                 num_nodes_per_set[i], var_values);
+        printf ("\nafter ex_get_nset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("nodeset variable %2d values of nodeset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_nodes_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free(ids);
+  }
+  if (num_node_sets > 0)
+    free (num_nodes_per_set);
+
+  error = ex_close (exoid);
+  printf ("\nafter ex_close, error = %3d\n", error);
+  return 0;
+}
diff --git a/exodus/cbind/test/testrd.dmp b/exodus/cbind/test/testrd.dmp
new file mode 100644
index 0000000..5f3b0b4
--- /dev/null
+++ b/exodus/cbind/test/testrd.dmp
@@ -0,0 +1,1137 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   7
+num_elem_blk =   7
+num_node_sets =   2
+num_side_sets =   5
+ after ex_inquire, error = 0
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+y coord name = 'ycoor'
+z coord name = 'zcoor'
+ after ex_get_attr_param, error = 0
+num nodal attributes = 2
+ after ex_get_attr_names, error = 0
+nodal attribute 0 = 'Node_attr_1'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+nodal attribute 1 = 'Node_attr_2'
+ after ex_get_one_attr, error = 0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+
+after ex_get_map, error =   0
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+elem_map(5) = 6 
+elem_map(6) = 7 
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'block_1'
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'block_2'
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+name = 'block_3'
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+name = 'block_4'
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+name = 'block_5'
+
+after ex_get_elem_block, error = 0
+element block id = 15
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+name = 'block_6'
+
+after ex_get_elem_block, error = 0
+element block id = 16
+element type = 'tri'
+num_elem_in_block =  1
+num_nodes_per_elem =  3
+num_attr =  1
+name = 'block_7'
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element block
+after ex_get_prop_names, error = 0
+element block  1, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    10
+element block  2, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    20
+element block  3, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    30
+element block  4, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    40
+element block  5, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    50
+element block  6, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    60
+element block  7, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    70
+element block  1, property( 3): 'DENSITY'=     0
+element block  2, property( 3): 'DENSITY'=     0
+element block  3, property( 3): 'DENSITY'=     0
+element block  4, property( 3): 'DENSITY'=     0
+element block  5, property( 3): 'DENSITY'=     0
+element block  6, property( 3): 'DENSITY'=     0
+element block  7, property( 3): 'DENSITY'=     0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 15
+ 17
+ 18
+ 19
+ 20
+ 27
+ 28
+ 30
+ 29
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 16
+ 31
+ 32
+ 33
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 10 attribute 'THICKNESS' = 3.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 11 attribute 'THICKNESS' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 12 attribute 'THICKNESS' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 13 attribute 'THICKNESS' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 14 attribute 'THICKNESS' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 15 attribute 'THICKNESS' = 6.1416
+
+ after ex_get_elem_attr, error = 0
+ after ex_get_elem_attr_names, error = 0
+element block 16 attribute 'THICKNESS' = 6.1416
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+name = 'nset_1'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 20 = 1
+ after ex_get_attr_names, error = 0
+nodeset attribute 0 = 'Nodeset_attribute'
+ after ex_get_one_attr, error = 0
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+name = 'nset_2'
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 21 = 0
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+name = 'sset_1'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+name = 'sset_2'
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+name = 'sset_3'
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+name = 'sset_4'
+num_sides =   8
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 33
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+side list for side set 33
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+ 17
+ 18
+ 20
+ 27
+ 18
+ 19
+ 20
+ 28
+ 17
+ 20
+ 19
+ 29
+ 17
+ 19
+ 18
+ 30
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+name = 'sset_5'
+num_sides =  10
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+node list for side set 34
+ 21
+ 22
+ 25
+ 24
+ 22
+ 23
+ 26
+ 25
+ 21
+ 24
+ 26
+ 23
+ 21
+ 23
+ 22
+ 24
+ 25
+ 26
+ 31
+ 32
+ 33
+ 33
+ 32
+ 31
+ 31
+ 32
+ 32
+ 33
+ 33
+ 31
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 29,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 94,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  8
+ 10
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 19
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'node_variable_a_very_long_name_0'
+ 'nod_var1'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'this_variable_name_is_short'
+ 'this_variable_name_is_just_right'
+ 'this_variable_name_is_tooooo_lon'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 nodeset variables; their names are :
+ 'ns_var0'
+ 'ns_var1'
+ 'ns_var2'
+
+after ex_get_nset_var_tab, error =   0
+This is the nodeset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 sideset variables; their names are :
+ 'ss_var0'
+ 'ss_var1'
+ 'ss_var2'
+
+after ex_get_sset_var_tab, error =   0
+This is the sideset variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+1.870
+1.900
+1.930
+1.960
+1.990
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 12 at time step  3
+6.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 15 at time step  3
+9.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 16 at time step  3
+10.030
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+ after ex_get_side_set_ids, error =   0
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 30 at time step  3
+7.030
+7.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 31 at time step  3
+8.030
+8.060
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 32 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+9.180
+9.210
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 33 at time step  3
+10.030
+10.060
+10.090
+10.120
+10.150
+10.180
+10.210
+10.240
+
+after ex_get_sset_var, error =   0
+sideset variable  2 values of sideset 34 at time step  3
+11.030
+11.060
+11.090
+11.120
+11.150
+11.180
+11.210
+11.240
+11.270
+11.300
+
+ after ex_get_node_set_ids, error =   0
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 20 at time step  3
+9.030
+9.060
+9.090
+9.120
+9.150
+
+after ex_get_nset_var, error =   0
+nodeset variable  2 values of nodeset 21 at time step  3
+10.030
+10.060
+10.090
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd1.c b/exodus/cbind/test/testrd1.c
new file mode 100644
index 0000000..e34ba4c
--- /dev/null
+++ b/exodus/cbind/test/testrd1.c
@@ -0,0 +1,1050 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd1 - read exodus file test.exo created by testwt1
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+   int num_side_sets, num_node_maps, num_elem_maps, error;
+   int i, j, k, node_ctr;
+   int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+   int *ids, *node_map; 
+   int *num_nodes_per_set, *num_elem_per_set;
+   int *num_df_per_set;
+   int *node_ind, *elem_ind, *df_ind, num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int num_time_steps;
+   int *num_elem_in_block, *num_nodes_per_elem, *num_attr;
+   int num_nodes_in_set, num_elem_in_set;
+   int num_sides_in_set, num_df_in_set;
+   int list_len = 0;
+   int elem_list_len = 0;
+   int node_list_len = 0;
+   int df_list_len = 0;
+   int node_num, time_step, var_index, beg_time, end_time, elem_num;
+   int CPU_word_size,IO_word_size;
+   int num_props, prop_value, *prop_values;
+   int idum;
+
+   float time_value, *time_values, *var_values;
+   float *x, *y, *z;
+   float *attrib, *dist_fact;
+   float version, fdum;
+
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[10];
+   char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+   char *cdum = 0;
+   char *prop_names[3];
+   char *map_names[3];
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use what is stored in file */
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+  /* Test the NOCLOBBER option to ex_create.  Should fail to create file */
+  exoid = ex_create("test.exo",
+		    EX_NOCLOBBER,
+		    &CPU_word_size,
+		    &IO_word_size);
+  printf ("\nafter ex_create (NO_CLOBBER), error = %3d\n", exoid);
+  
+  /* open EXODUS II files */
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+/*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+
+/*   ncopts = NC_VERBOSE; */
+/*   ex_opts (EX_VERBOSE); */
+
+/* read database parameters */
+
+   error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                        &num_elem_blk, &num_node_sets, &num_side_sets);
+
+   printf ("after ex_get_init, error = %3d\n", error);
+
+   printf ("database parameters:\n");
+   printf ("title =  '%s'\n",title);
+   printf ("num_dim = %3d\n",num_dim);
+   printf ("num_nodes = %3d\n",num_nodes);
+   printf ("num_elem = %3d\n",num_elem);
+   printf ("num_elem_blk = %3d\n",num_elem_blk);
+   printf ("num_node_sets = %3d\n",num_node_sets);
+   printf ("num_side_sets = %3d\n",num_side_sets);
+
+/* read nodal coordinates values and names from database */
+
+   x = (float *) calloc(num_nodes, sizeof(float));
+   y = (float *) calloc(num_nodes, sizeof(float));
+   if (num_dim >= 3)
+     z = (float *) calloc(num_nodes, sizeof(float));
+   else
+     z = 0;
+
+   error = ex_get_coord (exoid, x, y, z);
+   printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+   printf ("x coords = \n");
+   for (i=0; i<num_nodes; i++)
+   {
+      printf ("%5.1f\n", x[i]);
+   }
+
+   printf ("y coords = \n");
+   for (i=0; i<num_nodes; i++)
+   {
+      printf ("%5.1f\n", y[i]);
+   }
+
+   if (num_dim >= 3)
+   {
+     printf ("z coords = \n");
+     for (i=0; i<num_nodes; i++)
+     {
+        printf ("%5.1f\n", z[i]);
+     }
+   }
+
+/*
+   error = ex_get_1_coord (exoid, 2, x, y, z);
+   printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+   printf ("x coord of node 2 = \n");
+   printf ("%f \n", x[0]);
+
+   printf ("y coord of node 2 = \n");
+   printf ("%f \n", y[0]);
+*/
+   free (x);
+   free (y);
+   if (num_dim >= 3)
+     free (z);
+
+
+   for (i=0; i<num_dim; i++)
+   {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_coord_names (exoid, coord_names);
+   printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+
+   printf ("x coord name = '%s'\n", coord_names[0]);
+   printf ("y coord name = '%s'\n", coord_names[1]);
+
+   for (i=0; i<num_dim; i++)
+     free(coord_names[i]);
+
+/* read map parameters */
+
+   error = ex_get_map_param (exoid, &num_node_maps, &num_elem_maps);
+   printf ("\nafter ex_get_map_param, error = %3d\n", error);
+
+/* read element maps */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   ids = (int *) calloc(num_elem_maps, sizeof(int));
+
+   error = ex_get_prop_array (exoid, EX_ELEM_MAP, "ID", ids);
+   printf ("\nafter ex_get_prop_array, error = %3d\n", error);
+
+   for (j=0; j<num_elem_maps; j++) {
+     error = ex_get_elem_map (exoid, ids[j], elem_map);
+     printf ("\nafter ex_get_elem_map, error = %3d\n", error);
+     
+     printf ("element map id = %2d\n",ids[j]);
+     if (!error) {
+       for (i=0; i<num_elem; i++) {
+	 int value;
+	 printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+	 /* Read element map 1 element at a time... */
+	 error = ex_get_partial_elem_map(exoid, ids[j], i+1, 1, &value);
+	 if (error != 0 || value != elem_map[i])
+	   printf ("invalid value in ex_get_partial_elem_map, map %d, element %d\n", j, i);
+       }
+     }
+   }
+	    
+   free (elem_map);
+
+/* read element map properties */
+
+   error = ex_inquire (exoid, EX_INQ_EM_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each element map\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_ELEM_MAP,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_elem_maps; j++)
+     {
+       error = ex_get_prop(exoid, EX_ELEM_MAP, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("element map %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+
+
+/* read element map names */
+
+   for (i=0; i<num_elem_maps; i++) {
+     map_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_names(exoid,EX_ELEM_MAP,map_names);
+   printf ("after ex_get_names, error = %d\n", error);
+
+   for (j=0; j<num_elem_maps; j++) {
+     printf ("element map %2d, id = %d, name: '%s'\n",
+	     j+1, ids[j], map_names[j]);
+     free(map_names[j]);
+   }
+   free(ids);
+
+/* read node maps */
+
+   node_map = (int *) calloc(num_nodes, sizeof(int));
+   
+   ids = (int *) calloc(num_node_maps, sizeof(int));
+
+   error = ex_get_prop_array (exoid, EX_NODE_MAP, "ID", ids);
+   printf ("\nafter ex_get_prop_array, error = %3d\n", error);
+
+   for (j=0; j<num_node_maps; j++) {
+      error = ex_get_node_map (exoid, ids[j], node_map);
+      printf ("\nafter ex_get_node_map, error = %3d\n", error);
+
+      printf ("node map id = %2d\n",ids[j]);
+      if (!error)
+         for (i=0; i<num_nodes; i++)
+            printf ("node_map(%d) = %d \n", i, node_map[i]);
+
+   }
+
+   free (node_map);
+
+/* read node map properties */
+
+   error = ex_inquire (exoid, EX_INQ_NM_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each node map\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_NODE_MAP,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_node_maps; j++)
+     {
+       error = ex_get_prop(exoid, EX_NODE_MAP, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("node map %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+
+/* read node map names */
+
+   for (i=0; i<num_node_maps; i++) {
+     map_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+
+   for (j=0; j<num_node_maps; j++) {
+     error = ex_get_name(exoid,EX_NODE_MAP,ids[j], map_names[j]);
+     printf ("after ex_get_name, error = %d\n", error);
+     printf ("node map %2d, id = %d, name: '%s'\n",
+	     j+1, ids[j], map_names[j]);
+     free(map_names[j]);
+   }
+   free(ids);
+   
+/* read element block parameters */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+   num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+   num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+   num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+   
+   for (i=0; i<num_elem_blk; i++)
+   {
+     error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                &(num_elem_in_block[i]), 
+                                &(num_nodes_per_elem[i]), &(num_attr[i]));
+     printf ("\nafter ex_get_elem_block, error = %d\n", error);
+
+     printf ("element block id = %2d\n",ids[i]);
+     printf ("element type = '%s'\n", elem_type);
+     printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+     printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+     printf ("num_attr = %2d\n",num_attr[i]);
+   }
+
+   /* read element block properties */
+   error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each element block\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_elem_blk; j++)
+     {
+       error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+
+/* read element connectivity */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+                                sizeof(int));
+
+      error = ex_get_elem_conn (exoid, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+
+      printf ("connect array for elem block %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%3d\n", connect[j]);
+      }
+/*
+      error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+      printf ("node list for first element of element block %d \n ", ids[i]);
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%d \n", connect[j]);
+      }
+*/
+      free (connect);
+
+   }
+
+/* read element block attributes */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+      error = ex_get_elem_attr (exoid, ids[i], attrib);
+      printf ("\nafter ex_get_elem_attr, error = %d\n", error);
+
+      if (error == 0) {
+         printf ("element block %d attributes:\n", ids[i]);
+         for (j=0; j<num_attr[i]*num_elem_in_block[i]; j++)
+           printf ("%6.4f\n", attrib[j]);
+      }
+      free (attrib);
+   }
+
+   free (ids);
+   free (num_nodes_per_elem);
+   free (num_attr);
+
+/* read individual node sets */
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+
+   error = ex_get_node_set_ids (exoid, ids);
+   printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_node_sets; i++)
+   {
+      error = ex_get_node_set_param (exoid, ids[i], 
+                                        &num_nodes_in_set, &num_df_in_set);
+      printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+      printf ("\nnode set %2d parameters: \n", ids[i]);
+      printf ("num_nodes = %2d\n", num_nodes_in_set);
+
+      node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+      dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+      error = ex_get_node_set (exoid, ids[i], node_list);
+      printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("\nnode list for node set %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_in_set; j++)
+      {
+         printf ("%3d\n", node_list[j]);
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+          printf ("%5.2f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for node set %2d\n", ids[i]);
+
+      free (node_list);
+      free (dist_fact);
+   }
+   free(ids);
+
+   /* read node set properties */
+   error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each node set\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+   prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+   error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                         prop_values);
+     if (error == 0) {
+       for (j=0; j<num_node_sets; j++)
+         printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_values[j]);
+     }
+     else
+       printf ("after ex_get_prop_array, error = %d\n", error);
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free(prop_values);
+
+
+/* read concatenated node sets; this produces the same information as
+ * the above code which reads individual node sets
+ */
+
+   error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n",error);
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+   num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+   node_ind = (int *) calloc(num_node_sets, sizeof(int));
+   df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+   error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+   node_list = (int *) calloc(list_len, sizeof(int));
+
+   error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+   dist_fact = (float *) calloc(list_len, sizeof(float));
+
+   error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                    node_ind, df_ind, node_list, dist_fact);
+   printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+   printf ("\nconcatenated node set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_nodes_per_set = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+   printf ("node_ind = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+   printf ("node_list = \n");
+   for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_nodes_per_set);
+   free (df_ind);
+   free (node_ind);
+   free (num_df_per_set);
+   free (node_list);
+   free (dist_fact);
+
+
+/* read individual side sets */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+
+   error = ex_get_side_set_ids (exoid, ids);
+   printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_side_sets; i++)
+   {
+      error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                     &num_df_in_set);
+      printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+
+      printf ("side set %2d parameters:\n",ids[i]);
+      printf ("num_sides = %3d\n",num_sides_in_set);
+      printf ("num_dist_factors = %3d\n", num_df_in_set);
+
+
+      /* Note: The # of elements is same as # of sides!  */
+      num_elem_in_set = num_sides_in_set;
+      elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+      node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+      dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+
+      error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+      printf ("\nafter ex_get_side_set, error = %3d\n", error);
+
+      error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list, 
+                                         node_list);
+      printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("element list for side set %2d\n", ids[i]);
+      for (j=0; j<num_elem_in_set; j++)
+      {
+         printf ("%3d\n", elem_list[j]);
+      }
+
+      printf ("side list for side set %2d\n", ids[i]);
+      for (j=0; j<num_sides_in_set; j++)
+      {
+         printf ("%3d\n", side_list[j]);
+      }
+
+      node_ctr = 0;
+      printf ("node list for side set %2d\n", ids[i]);
+      for (k=0; k<num_elem_in_set; k++)
+      {
+        for (j=0; j<node_ctr_list[k]; j++)
+        {
+          printf ("%3d\n", node_list[node_ctr+j]);
+        }
+        node_ctr += node_ctr_list[k];
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for side set %2d\n", ids[i]);
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+           printf ("%5.3f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for side set %2d\n", ids[i]);
+
+      free (elem_list);
+      free (side_list);
+      free (dist_fact);
+      free (node_ctr_list);
+      free (node_list);
+
+   }
+
+   /* read side set properties */
+   error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each side set\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_side_sets; j++)
+     {
+       error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0) {
+         printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       }
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free (ids);
+
+   error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+   if (num_side_sets > 0)
+   {
+     error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+              elem_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+              node_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+              df_list_len, error);
+   }
+
+/* read concatenated side sets; this produces the same information as
+ * the above code which reads individual side sets
+ */
+
+/* concatenated side set read */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+   num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+   df_ind = (int *) calloc(num_side_sets, sizeof(int));
+   elem_list = (int *) calloc(elem_list_len, sizeof(int));
+   side_list = (int *) calloc(elem_list_len, sizeof(int));
+   dist_fact = (float *) calloc(df_list_len, sizeof(float));
+
+   error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                    num_df_per_set, elem_ind, df_ind, 
+                                    elem_list, side_list, dist_fact);
+   printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+
+   printf ("concatenated side set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_elem_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+
+   printf ("num_dist_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+
+   printf ("elem_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+
+   printf ("dist_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+
+   printf ("elem_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+
+   printf ("side_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_elem_per_set);
+   free (num_df_per_set);
+   free (df_ind);
+   free (elem_ind);
+   free (elem_list);
+   free (side_list);
+   free (dist_fact);
+
+/* end of concatenated side set read */
+
+/* read QA records */
+
+   ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+   for (i=0; i<num_qa_rec; i++)
+   {
+      for (j=0; j<4; j++)
+      {
+         qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+   }
+
+   error = ex_get_qa (exoid, qa_record); 
+   printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+   printf ("QA records = \n");
+   for (i=0; i<num_qa_rec; i++) 
+   {
+     for (j=0; j<4; j++)
+     {
+        printf (" '%s'\n", qa_record[i][j]);
+       free(qa_record[i][j]);
+     }
+   }
+
+
+/* read information records */
+
+   error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+
+   for (i=0; i<num_info; i++)
+   {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_info (exoid, info); 
+   printf ("\nafter ex_get_info, error = %3d\n", error);
+
+   printf ("info records = \n");
+   for (i=0; i<num_info; i++)
+   {
+     printf (" '%s'\n", info[i]);
+     free(info[i]);
+   }
+
+/* read global variables parameters and names */
+
+   error = ex_get_var_param (exoid, "g", &num_glo_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_glo_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_name(exoid, "g", 1, var_names[0]);
+   printf ("\nafter ex_get_var_name, error = %3d\n", error);
+
+   printf ("There are %2d global variables; their names are :\n", num_glo_vars);
+   for (i=0; i<num_glo_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+/* read nodal variables parameters and names */
+
+   error = ex_get_var_param (exoid, "n", &num_nod_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_nod_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+   for (i=0; i<num_nod_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+
+/* read element variables parameters and names */
+
+   error = ex_get_var_param (exoid, "e", &num_ele_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_ele_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+   for (i=0; i<num_ele_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+
+/* read element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+
+   printf ("This is the element variable truth table:\n");
+
+   k = 0;
+   for (i=0; i<num_elem_blk*num_ele_vars; i++)
+   {
+      printf ("%2d\n", truth_tab[k++]);
+   }
+   free (truth_tab);
+
+/* determine how many time steps are stored */
+
+   error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+   printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+/* read time value at one time step */
+
+   time_step = 3;
+   error = ex_get_time (exoid, time_step, &time_value);
+   printf ("\nafter ex_get_time, error = %3d\n", error);
+
+   printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+/* read time values at all time steps */
+
+   time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   error = ex_get_all_times (exoid, time_values);
+   printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+   printf ("time values at all time steps are:\n");
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+   free (time_values);
+
+/* read all global variables at one time step */
+
+   var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+   error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+   printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+   printf ("global variable values at time step %2d\n", time_step);
+   for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a single global variable through time */
+
+   var_index = 1;
+   beg_time = 1;
+   end_time = -1;
+
+   var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                 var_values);
+   printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+   printf ("global variable %2d values through time:\n", var_index);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a nodal variable at one time step */
+
+   var_values = (float *) calloc (num_nodes, sizeof(float));
+
+   error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                             var_values);
+   printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+   printf ("nodal variable %2d values at time step %2d\n", var_index, 
+           time_step);
+   for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a nodal variable through time */
+
+   var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   node_num = 1;
+   error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                  end_time, var_values);
+   printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+   printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+           node_num);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read an element variable at one time step */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+
+      error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+                               num_elem_in_block[i], var_values);
+      printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+
+      if (!error)
+      {
+         printf 
+    ("element variable %2d values of element block %2d at time step %2d\n",
+            var_index, ids[i], time_step);
+         for (j=0; j<num_elem_in_block[i]; j++) 
+            printf ("%5.3f\n", var_values[j]);
+      }
+
+      free (var_values); 
+   }
+   free (num_elem_in_block);
+   free(ids);
+
+/* read an element variable through time */
+
+   var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   var_index = 2;
+   elem_num = 2;
+   error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+   printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+
+   printf ("element variable %2d values for element %2d through time:\n", 
+           var_index, elem_num);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testrd1.dmp b/exodus/cbind/test/testrd1.dmp
new file mode 100644
index 0000000..cd74b16
--- /dev/null
+++ b/exodus/cbind/test/testrd1.dmp
@@ -0,0 +1,902 @@
+
+after ex_create (NO_CLOBBER), error =  -1
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is testwt1'
+num_dim =   3
+num_nodes =  28
+num_elem =   8
+num_elem_blk =   7
+num_node_sets =   2
+num_side_sets =   5
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+100.0
+ 50.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+100.0
+ 50.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  0.0
+ 20.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+y coord name = 'ycoor'
+
+after ex_get_map_param, error =   0
+
+after ex_get_prop_array, error =   0
+
+after ex_get_elem_map, error =   0
+element map id = 111
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+elem_map(5) = 6 
+elem_map(6) = 7 
+elem_map(7) = 8 
+
+after ex_get_elem_map, error =   0
+element map id = 222
+elem_map(0) = 2 
+elem_map(1) = 4 
+elem_map(2) = 6 
+elem_map(3) = 8 
+elem_map(4) = 10 
+elem_map(5) = 12 
+elem_map(6) = 14 
+elem_map(7) = 16 
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element map
+after ex_get_prop_names, error = 0
+element map  1, property( 1): 'ID'=   111
+element map  2, property( 1): 'ID'=   222
+element map  1, property( 2): 'ORDER'=     1
+element map  2, property( 2): 'ORDER'=     0
+element map  1, property( 3): 'NUMBER'=     0
+element map  2, property( 3): 'NUMBER'=     1
+after ex_get_names, error = 0
+element map  1, id = 111, name: 'Element_Map_111'
+element map  2, id = 222, name: 'Element_Map_222'
+
+after ex_get_prop_array, error =   0
+
+after ex_get_node_map, error =   0
+node map id = 333
+node_map(0) = 3 
+node_map(1) = 6 
+node_map(2) = 9 
+node_map(3) = 12 
+node_map(4) = 15 
+node_map(5) = 18 
+node_map(6) = 21 
+node_map(7) = 24 
+node_map(8) = 27 
+node_map(9) = 30 
+node_map(10) = 33 
+node_map(11) = 36 
+node_map(12) = 39 
+node_map(13) = 42 
+node_map(14) = 45 
+node_map(15) = 48 
+node_map(16) = 51 
+node_map(17) = 54 
+node_map(18) = 57 
+node_map(19) = 60 
+node_map(20) = 63 
+node_map(21) = 66 
+node_map(22) = 69 
+node_map(23) = 72 
+node_map(24) = 75 
+node_map(25) = 78 
+node_map(26) = 81 
+node_map(27) = 84 
+
+after ex_inquire, error = 0
+
+There are  2 properties for each node map
+after ex_get_prop_names, error = 0
+node map  1, property( 1): 'ID'=   333
+node map  1, property( 2): 'NUMBER'=     1
+after ex_get_name, error = 0
+node map  1, id = 333, name: 'Node_Map_111'
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  3
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  2
+num_nodes_per_elem =  4
+num_attr =  3
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  3
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  3
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'circle'
+num_elem_in_block =  1
+num_nodes_per_elem =  1
+num_attr =  3
+
+after ex_get_elem_block, error = 0
+element block id = 15
+element type = 'sphere'
+num_elem_in_block =  1
+num_nodes_per_elem =  1
+num_attr =  3
+
+after ex_get_elem_block, error = 0
+element block id = 16
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  3
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element block
+after ex_get_prop_names, error = 0
+element block  1, property( 1): 'ID'=    10
+element block  2, property( 1): 'ID'=    11
+element block  3, property( 1): 'ID'=    12
+element block  4, property( 1): 'ID'=    13
+element block  5, property( 1): 'ID'=    14
+element block  6, property( 1): 'ID'=    15
+element block  7, property( 1): 'ID'=    16
+element block  1, property( 2): 'MATL'=    10
+element block  2, property( 2): 'MATL'=    20
+element block  3, property( 2): 'MATL'=    30
+element block  4, property( 2): 'MATL'=    40
+element block  5, property( 2): 'MATL'=    50
+element block  6, property( 2): 'MATL'=    60
+element block  7, property( 2): 'MATL'=    70
+element block  1, property( 3): 'DENSITY'=     0
+element block  2, property( 3): 'DENSITY'=     0
+element block  3, property( 3): 'DENSITY'=     0
+element block  4, property( 3): 'DENSITY'=     0
+element block  5, property( 3): 'DENSITY'=     0
+element block  6, property( 3): 'DENSITY'=     0
+element block  7, property( 3): 'DENSITY'=     0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 15
+ 22
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 16
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+
+after ex_get_elem_attr, error = 0
+element block 10 attributes:
+1.0000
+2.0000
+3.0000
+
+after ex_get_elem_attr, error = 0
+element block 11 attributes:
+1.1100
+2.1100
+3.1100
+1.1200
+2.1200
+3.1200
+
+after ex_get_elem_attr, error = 0
+element block 12 attributes:
+1.2000
+2.2000
+3.2000
+
+after ex_get_elem_attr, error = 0
+element block 13 attributes:
+1.3000
+2.3000
+3.3000
+
+after ex_get_elem_attr, error = 0
+element block 14 attributes:
+1.4000
+2.4000
+3.4000
+
+after ex_get_elem_attr, error = 0
+element block 15 attributes:
+1.5000
+2.5000
+3.5000
+
+after ex_get_elem_attr, error = 0
+element block 16 attributes:
+1.6000
+2.6000
+3.6000
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  3
+  3
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  3
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 32
+  4
+  4
+  4
+  4
+  4
+  4
+  4
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+num_sides =   4
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 33
+  5
+  5
+  5
+  5
+side list for side set 33
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+num_sides =   2
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  6
+  7
+side list for side set 34
+  1
+  1
+node list for side set 34
+ 21
+ 22
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 17,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 50,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  4
+  2
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 15
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  3
+  3
+  1
+  3
+  4
+  4
+  4
+  4
+  4
+  4
+  4
+  5
+  5
+  5
+  5
+  6
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  1
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT1'
+ 'testwt1'
+ '03/16/94'
+ '15:41:33'
+ 'FASTQ'
+ 'fastq'
+ '07/07/93'
+ '16:41:33'
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ 'This is the second information record.'
+ 'This is the third information record.'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_name, error =   0
+There are  1 global variables; their names are :
+ 'glo vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'nod_var0'
+ 'nod_var1'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'ele_var0'
+ 'ele_var1'
+ 'ele_var2'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+5.060
+
+after ex_get_elem_var, error =  -1
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 15 at time step  3
+9.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 16 at time step  3
+10.030
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd_nc.c b/exodus/cbind/test/testrd_nc.c
new file mode 100644
index 0000000..ce49a03
--- /dev/null
+++ b/exodus/cbind/test/testrd_nc.c
@@ -0,0 +1,897 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test.exo created by testwt
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+/* #include "drmd.h" */
+
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+   int num_side_sets, error;
+   int i, j, k, node_ctr;
+   int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+   int *ids; 
+   int *num_nodes_per_set, *num_elem_per_set;
+   int *num_df_per_set;
+   int *node_ind, *elem_ind, *df_ind, num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int num_time_steps;
+   int *num_elem_in_block, *num_nodes_per_elem, *num_attr;
+   int num_nodes_in_set, num_elem_in_set;
+   int num_sides_in_set, num_df_in_set;
+   int list_len = 0;
+   int elem_list_len = 0;
+   int node_list_len = 0;
+   int df_list_len = 0;
+   int node_num, time_step, var_index, beg_time, end_time, elem_num;
+   int CPU_word_size,IO_word_size;
+   int num_props, prop_value, *prop_values;
+   int idum;
+
+   float time_value, *time_values, *var_values;
+   float *xyz;
+   float *attrib, *dist_fact;
+   float version, fdum;
+
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+   char *cdum = 0;
+   char *prop_names[3];
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use what is stored in file */
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* open EXODUS II files */
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+/*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* read database parameters */
+
+   error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                        &num_elem_blk, &num_node_sets, &num_side_sets);
+
+   printf ("after ex_get_init, error = %3d\n", error);
+
+   printf ("database parameters:\n");
+   printf ("title =  '%s'\n",title);
+   printf ("num_dim = %3d\n",num_dim);
+   printf ("num_nodes = %3d\n",num_nodes);
+   printf ("num_elem = %3d\n",num_elem);
+   printf ("num_elem_blk = %3d\n",num_elem_blk);
+   printf ("num_node_sets = %3d\n",num_node_sets);
+   printf ("num_side_sets = %3d\n",num_side_sets);
+
+/* read nodal coordinates values and names from database */
+
+   xyz = (float *) calloc(num_nodes, sizeof(float));
+
+   printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+   error = ex_get_coord (exoid, xyz, NULL, NULL);
+   printf ("\nafter ex_get_coord (x), error = %3d\n", error);
+   printf ("x coords = \n");
+   for (i=0; i<num_nodes; i++)
+   {
+     printf ("%5.1f\n", xyz[i]);
+   }
+
+   error = ex_get_coord (exoid, NULL, xyz, NULL);
+   printf ("\nafter ex_get_coord (y), error = %3d\n", error);
+   printf ("y coords = \n");
+   for (i=0; i<num_nodes; i++)
+   {
+     printf ("%5.1f\n", xyz[i]);
+   }
+
+   error = ex_get_coord (exoid, NULL, NULL, xyz);
+   printf ("\nafter ex_get_coord (z), error = %3d\n", error);
+   if (num_dim >= 3)
+   {
+     printf ("z coords = \n");
+     for (i=0; i<num_nodes; i++)
+     {
+        printf ("%5.1f\n", xyz[i]);
+     }
+   }
+
+/*
+   error = ex_get_1_coord (exoid, 2, x, y, z);
+   printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+   printf ("x coord of node 2 = \n");
+   printf ("%f \n", x[0]);
+
+   printf ("y coord of node 2 = \n");
+   printf ("%f \n", y[0]);
+*/
+   free (xyz);
+
+   for (i=0; i<num_dim; i++)
+   {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_coord_names (exoid, coord_names);
+   printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+
+   printf ("x coord name = '%s'\n", coord_names[0]);
+   printf ("y coord name = '%s'\n", coord_names[1]);
+
+   for (i=0; i<num_dim; i++)
+     free(coord_names[i]);
+
+
+/* read element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   error = ex_get_map (exoid, elem_map);
+   printf ("\nafter ex_get_map, error = %3d\n", error);
+
+   for (i=0; i<num_elem; i++)
+   {
+      printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+   }
+
+   free (elem_map);
+
+/* read element block parameters */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+   num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+   num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+   num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+   
+   for (i=0; i<num_elem_blk; i++)
+   {
+     error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                &(num_elem_in_block[i]), 
+                                &(num_nodes_per_elem[i]), &(num_attr[i]));
+     printf ("\nafter ex_get_elem_block, error = %d\n", error);
+
+     printf ("element block id = %2d\n",ids[i]);
+     printf ("element type = '%s'\n", elem_type);
+     printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+     printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+     printf ("num_attr = %2d\n",num_attr[i]);
+   }
+
+   /* read element block properties */
+   error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each element block\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_elem_blk; j++)
+     {
+       error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+
+/* read element connectivity */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+                                sizeof(int));
+
+      error = ex_get_elem_conn (exoid, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+
+      printf ("connect array for elem block %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%3d\n", connect[j]);
+      }
+/*
+      error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+      printf ("node list for first element of element block %d \n ", ids[i]);
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%d \n", connect[j]);
+      }
+*/
+      free (connect);
+
+   }
+
+/* read element block attributes */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+      error = ex_get_elem_attr (exoid, ids[i], attrib);
+      printf ("\n after ex_get_elem_attr, error = %d\n", error);
+
+      if (error == 0)
+         printf ("element block %d attributes = %6.4f\n", ids[i], *attrib);
+      free (attrib);
+   }
+
+   free (ids);
+   free (num_nodes_per_elem);
+   free (num_attr);
+
+/* read individual node sets */
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+
+   error = ex_get_node_set_ids (exoid, ids);
+   printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_node_sets; i++)
+   {
+      error = ex_get_node_set_param (exoid, ids[i], 
+                                        &num_nodes_in_set, &num_df_in_set);
+      printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+      printf ("\nnode set %2d parameters: \n", ids[i]);
+      printf ("num_nodes = %2d\n", num_nodes_in_set);
+
+      node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+      dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+      error = ex_get_node_set (exoid, ids[i], node_list);
+      printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("\nnode list for node set %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_in_set; j++)
+      {
+         printf ("%3d\n", node_list[j]);
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+          printf ("%5.2f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for node set %2d\n", ids[i]);
+
+      free (node_list);
+      free (dist_fact);
+   }
+   free(ids);
+
+   /* read node set properties */
+   error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each node set\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+   prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+   error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                         prop_values);
+     if (error == 0)
+       for (j=0; j<num_node_sets; j++)
+         printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_values[j]);
+     else
+       printf ("after ex_get_prop_array, error = %d\n", error);
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free(prop_values);
+
+/* read concatenated node sets; this produces the same information as
+ * the above code which reads individual node sets
+ */
+
+   error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n",error);
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+   num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+   node_ind = (int *) calloc(num_node_sets, sizeof(int));
+   df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+   error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+   node_list = (int *) calloc(list_len, sizeof(int));
+
+   error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+   dist_fact = (float *) calloc(list_len, sizeof(float));
+
+   error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                    node_ind, df_ind, node_list, dist_fact);
+   printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+   printf ("\nconcatenated node set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_nodes_per_set = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+   printf ("node_ind = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+   printf ("node_list = \n");
+   for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_nodes_per_set);
+   free (df_ind);
+   free (node_ind);
+   free (num_df_per_set);
+   free (node_list);
+   free (dist_fact);
+
+
+/* read individual side sets */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+
+   error = ex_get_side_set_ids (exoid, ids);
+   printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_side_sets; i++)
+   {
+      error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                     &num_df_in_set);
+      printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+
+      printf ("side set %2d parameters:\n",ids[i]);
+      printf ("num_sides = %3d\n",num_sides_in_set);
+      printf ("num_dist_factors = %3d\n", num_df_in_set);
+
+
+      /* Note: The # of elements is same as # of sides!  */
+      num_elem_in_set = num_sides_in_set;
+      elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+      node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+      dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+
+      error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+      printf ("\nafter ex_get_side_set, error = %3d\n", error);
+
+      error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                         node_list);
+      printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("element list for side set %2d\n", ids[i]);
+      for (j=0; j<num_elem_in_set; j++)
+      {
+         printf ("%3d\n", elem_list[j]);
+      }
+
+      printf ("side list for side set %2d\n", ids[i]);
+      for (j=0; j<num_sides_in_set; j++)
+      {
+         printf ("%3d\n", side_list[j]);
+      }
+
+      node_ctr = 0;
+      printf ("node list for side set %2d\n", ids[i]);
+      for (k=0; k<num_elem_in_set; k++)
+      {
+        for (j=0; j<node_ctr_list[k]; j++)
+        {
+          printf ("%3d\n", node_list[node_ctr+j]);
+        }
+        node_ctr += node_ctr_list[k];
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for side set %2d\n", ids[i]);
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+           printf ("%5.3f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for side set %2d\n", ids[i]);
+
+      free (elem_list);
+      free (side_list);
+      free (node_ctr_list);
+      free (node_list);
+      free (dist_fact);
+
+   }
+
+   /* read side set properties */
+   error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each side set\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_side_sets; j++)
+     {
+       error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free (ids);
+
+   error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+   if (num_side_sets > 0)
+   {
+     error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+              elem_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+              node_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+              df_list_len, error);
+   }
+
+/* read concatenated side sets; this produces the same information as
+ * the above code which reads individual side sets
+ */
+
+/* concatenated side set read */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+   num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+   df_ind = (int *) calloc(num_side_sets, sizeof(int));
+   elem_list = (int *) calloc(elem_list_len, sizeof(int));
+   side_list = (int *) calloc(elem_list_len, sizeof(int));
+   dist_fact = (float *) calloc(df_list_len, sizeof(float));
+
+   error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                    num_df_per_set, elem_ind, df_ind, 
+                                    elem_list, side_list, dist_fact);
+   printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+
+   printf ("concatenated side set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_elem_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+
+   printf ("num_dist_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+
+   printf ("elem_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+
+   printf ("dist_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+
+   printf ("elem_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+
+   printf ("side_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_elem_per_set);
+   free (num_df_per_set);
+   free (df_ind);
+   free (elem_ind);
+   free (elem_list);
+   free (side_list);
+   free (dist_fact);
+
+/* end of concatenated side set read */
+
+/* read QA records */
+
+   ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+   for (i=0; i<num_qa_rec; i++)
+   {
+      for (j=0; j<4; j++)
+      {
+         qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+   }
+
+   error = ex_get_qa (exoid, qa_record); 
+   printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+   printf ("QA records = \n");
+   for (i=0; i<num_qa_rec; i++) 
+   {
+     for (j=0; j<4; j++)
+     {
+       printf (" '%s'\n", qa_record[i][j]);
+       free(qa_record[i][j]);
+     }
+   }
+
+/* read information records */
+
+   error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+
+   for (i=0; i<num_info; i++)
+   {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_info (exoid, info); 
+   printf ("\nafter ex_get_info, error = %3d\n", error);
+
+   printf ("info records = \n");
+   for (i=0; i<num_info; i++)
+   {
+     printf (" '%s'\n", info[i]);
+     free(info[i]);
+   }
+
+/* read global variables parameters and names */
+
+   error = ex_get_var_param (exoid, "g", &num_glo_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_glo_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d global variables; their names are :\n", 
+           num_glo_vars);
+   for (i=0; i<num_glo_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+/* read nodal variables parameters and names */
+
+   error = ex_get_var_param (exoid, "n", &num_nod_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_nod_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+   for (i=0; i<num_nod_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+
+/* read element variables parameters and names */
+
+   error = ex_get_var_param (exoid, "e", &num_ele_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_ele_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+   for (i=0; i<num_ele_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+
+/* read element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+
+   printf ("This is the element variable truth table:\n");
+
+   k = 0;
+   for (i=0; i<num_elem_blk*num_ele_vars; i++)
+   {
+      printf ("%2d\n", truth_tab[k++]);
+   }
+   free (truth_tab);
+
+/* determine how many time steps are stored */
+
+   error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+   printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+/* read time value at one time step */
+
+   time_step = 3;
+   error = ex_get_time (exoid, time_step, &time_value);
+   printf ("\nafter ex_get_time, error = %3d\n", error);
+
+   printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+/* read time values at all time steps */
+
+   time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   error = ex_get_all_times (exoid, time_values);
+   printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+   printf ("time values at all time steps are:\n");
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+   free (time_values);
+
+/* read all global variables at one time step */
+
+   var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+   error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+   printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+   printf ("global variable values at time step %2d\n", time_step);
+   for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a single global variable through time */
+
+   var_index = 1;
+   beg_time = 1;
+   end_time = -1;
+
+   var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                 var_values);
+   printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+   printf ("global variable %2d values through time:\n", var_index);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a nodal variable at one time step */
+
+   var_values = (float *) calloc (num_nodes, sizeof(float));
+
+   error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                             var_values);
+   printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+   printf ("nodal variable %2d values at time step %2d\n", var_index, 
+           time_step);
+   for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a nodal variable through time */
+
+   var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   node_num = 1;
+   error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                  end_time, var_values);
+   printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+   printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+           node_num);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read an element variable at one time step */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+
+      error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+                               num_elem_in_block[i], var_values);
+      printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+
+      if (!error)
+      {
+         printf 
+    ("element variable %2d values of element block %2d at time step %2d\n",
+            var_index, ids[i], time_step);
+         for (j=0; j<num_elem_in_block[i]; j++) 
+            printf ("%5.3f\n", var_values[j]);
+      }
+
+      free (var_values); 
+   }
+   free (num_elem_in_block);
+   free(ids);
+
+/* read an element variable through time */
+
+   var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+   var_index = 2;
+   elem_num = 2;
+   error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+   printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+
+   printf ("element variable %2d values for element %2d through time:\n", 
+           var_index, elem_num);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testrd_nc.dmp b/exodus/cbind/test/testrd_nc.dmp
new file mode 100644
index 0000000..ae30d7c
--- /dev/null
+++ b/exodus/cbind/test/testrd_nc.dmp
@@ -0,0 +1,931 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   7
+num_elem_blk =   7
+num_node_sets =   2
+num_side_sets =   5
+
+after ex_get_coord, error =   0
+
+after ex_get_coord (x), error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+
+after ex_get_coord (y), error =   0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord (z), error =   0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+y coord name = 'ycoor'
+
+after ex_get_map, error =   0
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+elem_map(5) = 6 
+elem_map(6) = 7 
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 15
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 16
+element type = 'tri'
+num_elem_in_block =  1
+num_nodes_per_elem =  3
+num_attr =  1
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element block
+after ex_get_prop_names, error = 0
+element block  1, property( 1): 'ID'=    10
+element block  2, property( 1): 'ID'=    11
+element block  3, property( 1): 'ID'=    12
+element block  4, property( 1): 'ID'=    13
+element block  5, property( 1): 'ID'=    14
+element block  6, property( 1): 'ID'=    15
+element block  7, property( 1): 'ID'=    16
+element block  1, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    10
+element block  2, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    20
+element block  3, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    30
+element block  4, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    40
+element block  5, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    50
+element block  6, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    60
+element block  7, property( 2): 'MATERIAL_PROPERTY_LONG_NAME_32CH'=    70
+element block  1, property( 3): 'DENSITY'=     0
+element block  2, property( 3): 'DENSITY'=     0
+element block  3, property( 3): 'DENSITY'=     0
+element block  4, property( 3): 'DENSITY'=     0
+element block  5, property( 3): 'DENSITY'=     0
+element block  6, property( 3): 'DENSITY'=     0
+element block  7, property( 3): 'DENSITY'=     0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 15
+ 17
+ 18
+ 19
+ 20
+ 27
+ 28
+ 30
+ 29
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 16
+ 31
+ 32
+ 33
+
+ after ex_get_elem_attr, error = 0
+element block 10 attributes = 3.1416
+
+ after ex_get_elem_attr, error = 0
+element block 11 attributes = 6.1416
+
+ after ex_get_elem_attr, error = 0
+element block 12 attributes = 6.1416
+
+ after ex_get_elem_attr, error = 0
+element block 13 attributes = 6.1416
+
+ after ex_get_elem_attr, error = 0
+element block 14 attributes = 6.1416
+
+ after ex_get_elem_attr, error = 0
+element block 15 attributes = 6.1416
+
+ after ex_get_elem_attr, error = 0
+element block 16 attributes = 6.1416
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+num_sides =   8
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 33
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+side list for side set 33
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+ 17
+ 18
+ 20
+ 27
+ 18
+ 19
+ 20
+ 28
+ 17
+ 20
+ 19
+ 29
+ 17
+ 19
+ 18
+ 30
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+num_sides =  10
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+node list for side set 34
+ 21
+ 22
+ 25
+ 24
+ 22
+ 23
+ 26
+ 25
+ 21
+ 24
+ 26
+ 23
+ 21
+ 23
+ 22
+ 24
+ 25
+ 26
+ 31
+ 32
+ 33
+ 33
+ 32
+ 31
+ 31
+ 32
+ 32
+ 33
+ 33
+ 31
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 29,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 94,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  8
+ 10
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 19
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  6
+  6
+  6
+  6
+  5
+  5
+  5
+  5
+  5
+  7
+  7
+  7
+  7
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'node_variable_a_very_long_name_0'
+ 'nod_var1'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'this_variable_name_is_short'
+ 'this_variable_name_is_just_right'
+ 'this_variable_name_is_tooooo_lon'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+1.870
+1.900
+1.930
+1.960
+1.990
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 12 at time step  3
+6.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 15 at time step  3
+9.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 16 at time step  3
+10.030
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd_par.c b/exodus/cbind/test/testrd_par.c
new file mode 100644
index 0000000..5a79079
--- /dev/null
+++ b/exodus/cbind/test/testrd_par.c
@@ -0,0 +1,1210 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd - read exodus file test.exo created by testwt
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+
+#include <mpi.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "exodusII_par.h"
+
+int main (int argc, char **argv)
+{
+  MPI_Comm mpi_comm = MPI_COMM_WORLD;
+  MPI_Info mpi_info = MPI_INFO_NULL;
+  
+  int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+  int num_side_sets, error;
+  int i, j, k, node_ctr;
+  int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+  int *ids; 
+  int *num_nodes_per_set = NULL;
+  int *num_elem_per_set = NULL;
+  int *num_df_per_set = NULL;
+  int *node_ind = NULL;
+  int *elem_ind = NULL;
+  int *df_ind = NULL;
+  int num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars;
+  int num_nset_vars, num_sset_vars;
+  int *truth_tab;
+  int num_time_steps;
+  int *num_elem_in_block = NULL;
+  int *num_nodes_per_elem = NULL;
+  int *num_attr = NULL;
+  int num_nodes_in_set, num_elem_in_set;
+  int num_sides_in_set, num_df_in_set;
+  int list_len, elem_list_len, node_list_len, df_list_len;
+  int node_num, time_step, var_index, beg_time, end_time, elem_num;
+  int CPU_word_size,IO_word_size;
+  int num_props, prop_value, *prop_values;
+  int idum;
+
+  float time_value, *time_values, *var_values;
+  float *x, *y, *z;
+  float *attrib, *dist_fact;
+  float version, fdum;
+
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+  char *block_names[10], *nset_names[10], *sset_names[10];
+  char *attrib_names[10];
+  char name[MAX_STR_LENGTH+1];
+  char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+  char title_chk[MAX_LINE_LENGTH+1];
+  char *cdum = 0;
+  char *prop_names[3];
+
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* Initialize MPI. */
+  MPI_Init(&argc,&argv);
+
+  /* open EXODUS II files */
+  exoid = ex_open_par ("test.exo",      /* filename path */
+		       EX_READ,         /* access mode = READ */
+		       &CPU_word_size,  /* CPU word size */
+		       &IO_word_size,   /* IO word size */
+		       &version,        /* ExodusII library version */
+		       mpi_comm, mpi_info); 
+
+  printf ("\nafter ex_open\n");
+  if (exoid < 0) exit(1);
+
+  printf ("test.exo is an EXODUSII file; version %4.2f\n",
+          version);
+  /*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+  printf ("         I/O word size %1d\n",IO_word_size);
+  ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+  printf ("EXODUSII API; version %4.2f\n", version);
+
+  ex_inquire(exoid,EX_INQ_LIB_VERS, &idum, &version, cdum);
+  printf ("EXODUSII Library API; version %4.2f (%d)\n", version, idum);
+
+  /* ncopts = NC_VERBOSE; */
+
+  /* read database parameters */
+
+  error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                       &num_elem_blk, &num_node_sets, &num_side_sets);
+
+  printf ("after ex_get_init, error = %3d\n", error);
+
+  printf ("database parameters:\n");
+  printf ("title =  '%s'\n",title);
+  printf ("num_dim = %3d\n",num_dim);
+  printf ("num_nodes = %3d\n",num_nodes);
+  printf ("num_elem = %3d\n",num_elem);
+  printf ("num_elem_blk = %3d\n",num_elem_blk);
+  printf ("num_node_sets = %3d\n",num_node_sets);
+  printf ("num_side_sets = %3d\n",num_side_sets);
+
+  /* Check that ex_inquire gives same title */
+  error = ex_inquire (exoid, EX_INQ_TITLE, &idum, &fdum, title_chk);
+  printf (" after ex_inquire, error = %d\n", error);
+  if (strcmp(title, title_chk) != 0) {
+    printf ("error in ex_inquire for EX_INQ_TITLE\n");
+  }
+  
+  /* read nodal coordinates values and names from database */
+
+  x = (float *) calloc(num_nodes, sizeof(float));
+  if (num_dim >= 2)
+    y = (float *) calloc(num_nodes, sizeof(float));
+  else
+    y = 0;
+  
+  if (num_dim >= 3)
+    z = (float *) calloc(num_nodes, sizeof(float));
+  else
+    z = 0;
+
+  error = ex_get_coord (exoid, x, y, z);
+  printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+  printf ("x coords = \n");
+  for (i=0; i<num_nodes; i++)
+    {
+      printf ("%5.1f\n", x[i]);
+    }
+
+  if (num_dim >= 2) {
+    printf ("y coords = \n");
+    for (i=0; i<num_nodes; i++)
+      {
+	printf ("%5.1f\n", y[i]);
+      }
+  }
+  if (num_dim >= 3)
+    {
+      printf ("z coords = \n");
+      for (i=0; i<num_nodes; i++)
+        {
+          printf ("%5.1f\n", z[i]);
+        }
+    }
+
+  /*
+    error = ex_get_1_coord (exoid, 2, x, y, z);
+    printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+    printf ("x coord of node 2 = \n");
+    printf ("%f \n", x[0]);
+
+    printf ("y coord of node 2 = \n");
+    printf ("%f \n", y[0]);
+  */
+  free (x);
+  if (num_dim >= 2)
+    free (y);
+  if (num_dim >= 3)
+    free (z);
+
+
+  for (i=0; i<num_dim; i++)
+    {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_coord_names (exoid, coord_names);
+  printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+  printf ("x coord name = '%s'\n", coord_names[0]);
+  if (num_dim >1)
+    printf ("y coord name = '%s'\n", coord_names[1]);
+  if (num_dim >2)
+    printf ("z coord name = '%s'\n", coord_names[2]);
+
+  for (i=0; i<num_dim; i++)
+    free(coord_names[i]);
+
+  {
+    int num_attrs = 0;
+    error = ex_get_attr_param(exoid, EX_NODAL, 0, &num_attrs);
+    printf (" after ex_get_attr_param, error = %d\n", error);
+    printf ("num nodal attributes = %d\n", num_attrs);
+    if (num_attrs > 0) {
+      for (j=0; j<num_attrs; j++) {
+	attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+      error = ex_get_attr_names (exoid, EX_NODAL, 0, attrib_names);
+      printf (" after ex_get_attr_names, error = %d\n", error);
+      
+      if (error == 0) {
+	attrib = (float *) calloc(num_nodes,sizeof(float));
+	for (j=0; j<num_attrs; j++) {
+	  printf ("nodal attribute %d = '%s'\n", j, attrib_names[j]);
+	  error = ex_get_one_attr(exoid, EX_NODAL, 0, j+1, attrib);
+	  printf (" after ex_get_one_attr, error = %d\n", error);
+	  for (i=0; i < num_nodes; i++) {
+	    printf ("%5.1f\n", attrib[i]);
+	  }
+	  free(attrib_names[j]);
+	}
+	free(attrib);
+      }
+    }
+  }
+  
+  /* read element order map */
+
+  elem_map = (int *) calloc(num_elem, sizeof(int));
+
+  error = ex_get_map (exoid, elem_map);
+  printf ("\nafter ex_get_map, error = %3d\n", error);
+
+  for (i=0; i<num_elem; i++)
+    {
+      printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+    }
+
+  free (elem_map);
+
+  /* read element block parameters */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+    num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+    num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+    num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++) {
+      printf("Block # %d is id %d\n", i, ids[i]);
+      block_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_ELEM_BLOCK, block_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+    
+    for (i=0; i<num_elem_blk; i++)
+      {
+	ex_get_name(exoid, EX_ELEM_BLOCK, ids[i], name);
+	if (strcmp(name, block_names[i]) != 0) {
+	  printf ("error in ex_get_name for block id %d\n", ids[i]);
+	}
+        error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                   &(num_elem_in_block[i]), 
+                                   &(num_nodes_per_elem[i]), &(num_attr[i]));
+        printf ("\nafter ex_get_elem_block, id = %d, error = %d\n", ids[i], error);
+         
+        printf ("element block id = %2d\n",ids[i]);
+        printf ("element type = '%s'\n", elem_type);
+        printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+        printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+        printf ("num_attr = %2d\n",num_attr[i]);
+        printf ("name = '%s'\n",block_names[i]);
+	free(block_names[i]);
+      }
+     
+    /* read element block properties */
+    error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each element block\n", num_props);
+     
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+     
+     
+    for (i=1; i<num_props; i++) /* Prop 1 is id; skip that here */
+      {
+        for (j=0; j<num_elem_blk; j++)
+          {
+            error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+     
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+  }
+   
+  /* read element connectivity */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+				 sizeof(int));
+	
+	error = ex_get_elem_conn (exoid, ids[i], connect);
+	printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	
+	
+	printf ("connect array for elem block %2d\n", ids[i]);
+	
+	for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	    printf ("%3d\n", connect[j]);
+	  }
+	/*
+	  error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+	  printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+	  
+	  printf ("node list for first element of element block %d \n ", ids[i]);
+	  for (j=0; j<num_nodes_per_elem[i]; j++)
+	  {
+	  printf ("%d \n", connect[j]);
+	  }
+	*/
+	free (connect);
+      }
+    }
+
+  /* read element block attributes */
+
+  for (i=0; i<num_elem_blk; i++)
+    {
+      if (num_elem_in_block[i] > 0) {
+	for (j=0; j<num_attr[i]; j++)
+	  attrib_names[j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	
+	attrib = (float *) calloc(num_attr[i]*num_elem_in_block[i],sizeof(float));
+	error = ex_get_elem_attr (exoid, ids[i], attrib);
+	printf ("\n after ex_get_elem_attr, error = %d\n", error);
+	
+	if (error == 0) {
+	  error = ex_get_elem_attr_names (exoid, ids[i], attrib_names);
+	  printf (" after ex_get_elem_attr_names, error = %d\n", error);
+	  
+	  if (error == 0) {
+	    printf ("element block %d attribute '%s' = %6.4f\n", ids[i], attrib_names[0], *attrib);
+	  }
+	}
+	free (attrib);
+	for (j=0; j<num_attr[i]; j++)
+	  free (attrib_names[j]);
+      }
+    }
+      
+  if (num_elem_blk > 0) {
+    free (ids);
+    free (num_nodes_per_elem);
+    free (num_attr);
+  }
+
+  /* read individual node sets */
+  if (num_node_sets > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++) {
+      nset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_NODE_SET, nset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_node_sets; i++)
+      {
+	ex_get_name(exoid, EX_NODE_SET, ids[i], name);
+	if (strcmp(name, nset_names[i]) != 0) {
+	  printf ("error in ex_get_name for nodeset id %d\n", ids[i]);
+	}
+
+        error = ex_get_node_set_param (exoid, ids[i], 
+                                       &num_nodes_in_set, &num_df_in_set);
+        printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+        printf ("\nnode set %2d parameters: \n", ids[i]);
+        printf ("num_nodes = %2d\n", num_nodes_in_set);
+	printf ("name = '%s'\n", nset_names[i]);
+	free(nset_names[i]);
+        node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+        dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+
+        error = ex_get_node_set (exoid, ids[i], node_list);
+        printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+          }
+
+        printf ("\nnode list for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_nodes_in_set; j++)
+          {
+            printf ("%3d\n", node_list[j]);
+          }
+
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for node set %2d\n", ids[i]);
+
+            for (j=0; j<num_nodes_in_set; j++)
+              {
+                printf ("%5.2f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for node set %2d\n", ids[i]);
+
+        free (node_list);
+        free (dist_fact);
+
+	{
+	  int num_attrs = 0;
+	  error = ex_get_attr_param(exoid, EX_NODE_SET, ids[i], &num_attrs);
+	  printf (" after ex_get_attr_param, error = %d\n", error);
+	  printf ("num nodeset attributes for nodeset %d = %d\n", ids[i], num_attrs);
+	  if (num_attrs > 0) {
+	    for (j=0; j<num_attrs; j++) {
+	      attrib_names[j] = (char *)calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	    }
+	    error = ex_get_attr_names (exoid, EX_NODE_SET, ids[i], attrib_names);
+	    printf (" after ex_get_attr_names, error = %d\n", error);
+	    
+	    if (error == 0) {
+	      attrib = (float *) calloc(num_nodes_in_set,sizeof(float));
+	      for (j=0; j<num_attrs; j++) {
+		printf ("nodeset attribute %d = '%s'\n", j, attrib_names[j]);
+		error = ex_get_one_attr(exoid, EX_NODE_SET, ids[i], j+1, attrib);
+		printf (" after ex_get_one_attr, error = %d\n", error);
+		for (k=0; k < num_nodes_in_set; k++) {
+		  printf ("%5.1f\n", attrib[k]);
+		}
+		free(attrib_names[j]);
+	      }
+	      free(attrib);
+	    }
+	  }
+	}
+      }
+    free(ids);
+
+    /* read node set properties */
+    error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each node set\n", num_props);
+
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+    error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                                  prop_values);
+        if (error == 0)
+          for (j=0; j<num_node_sets; j++)
+            printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                    j+1, i+1, prop_names[i], prop_values[j]);
+        else
+          printf ("after ex_get_prop_array, error = %d\n", error);
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free(prop_values);
+
+    /* read concatenated node sets; this produces the same information as
+     * the above code which reads individual node sets
+     */
+
+    error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %3d\n",error);
+
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+    num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+    node_ind = (int *) calloc(num_node_sets, sizeof(int));
+    df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+    node_list = (int *) calloc(list_len, sizeof(int));
+
+    error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+    dist_fact = (float *) calloc(list_len, sizeof(float));
+
+    error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                     node_ind, df_ind, node_list, dist_fact);
+    printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+    printf ("\nconcatenated node set info\n");
+
+    printf ("ids = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+    printf ("num_nodes_per_set = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+    printf ("node_ind = \n");
+    for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+    printf ("node_list = \n");
+    for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+    printf ("dist_fact = \n");
+    for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+    free (ids);
+    free (df_ind);
+    free (node_ind);
+    free (num_df_per_set);
+    free (node_list);
+    free (dist_fact);
+  }
+
+  /* read individual side sets */
+
+  if (num_side_sets > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+    
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+    
+    for (i=0; i<num_side_sets; i++) {
+      sset_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+    error = ex_get_names(exoid, EX_SIDE_SET, sset_names);
+    printf ("\nafter ex_get_names, error = %3d\n", error);
+
+    for (i=0; i<num_side_sets; i++)
+      {
+	ex_get_name(exoid, EX_SIDE_SET, ids[i], name);
+	if (strcmp(name, sset_names[i]) != 0) {
+	  printf ("error in ex_get_name for sideset id %d\n", ids[i]);
+	}
+
+        error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                       &num_df_in_set);
+        printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+        
+        printf ("side set %2d parameters:\n",ids[i]);
+	printf ("name = '%s'\n", sset_names[i]);
+        printf ("num_sides = %3d\n",num_sides_in_set);
+        printf ("num_dist_factors = %3d\n", num_df_in_set);
+	free(sset_names[i]);
+        
+        
+        /* Note: The # of elements is same as # of sides!  */
+        num_elem_in_set = num_sides_in_set;
+        elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+        node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+        node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+        dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+        
+        error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+        printf ("\nafter ex_get_side_set, error = %3d\n", error);
+        
+        error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                           node_list);
+        printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+        
+        if (num_df_in_set > 0)
+          {
+            error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+            printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+          }
+        
+        printf ("element list for side set %2d\n", ids[i]);
+        for (j=0; j<num_elem_in_set; j++)
+          {
+            printf ("%3d\n", elem_list[j]);
+          }
+        
+        printf ("side list for side set %2d\n", ids[i]);
+        for (j=0; j<num_sides_in_set; j++)
+          {
+            printf ("%3d\n", side_list[j]);
+          }
+        
+        node_ctr = 0;
+        printf ("node list for side set %2d\n", ids[i]);
+        for (k=0; k<num_elem_in_set; k++)
+          {
+            for (j=0; j<node_ctr_list[k]; j++)
+              {
+                printf ("%3d\n", node_list[node_ctr+j]);
+              }
+            node_ctr += node_ctr_list[k];
+          }
+        
+        if (num_df_in_set > 0)
+          {
+            printf ("dist factors for side set %2d\n", ids[i]);
+            
+            for (j=0; j<num_df_in_set; j++)
+              {
+                printf ("%5.3f\n", dist_fact[j]);
+              }
+          }
+        else
+          printf ("no dist factors for side set %2d\n", ids[i]);
+        
+        free (elem_list);
+        free (side_list);
+        free (node_ctr_list);
+        free (node_list);
+        free (dist_fact);
+        
+      }
+    
+    /* read side set properties */
+    error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+    printf ("\nafter ex_inquire, error = %d\n", error);
+    printf ("\nThere are %2d properties for each side set\n", num_props);
+    
+    for (i=0; i<num_props; i++)
+      {
+        prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+    
+    error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+    printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+    for (i=0; i<num_props; i++)
+      {
+        for (j=0; j<num_side_sets; j++)
+          {
+            error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                                &prop_value);
+            if (error == 0)
+              printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                      j+1, i+1, prop_names[i], prop_value);
+            else
+              printf ("after ex_get_prop, error = %d\n", error);
+          }
+      }
+    for (i=0; i<num_props; i++)
+      free(prop_names[i]);
+    free (ids);
+
+    error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+    printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+    if (num_side_sets > 0)
+      {
+        error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+                elem_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+                node_list_len, error);
+
+        error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+        printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+                df_list_len, error);
+      }
+
+    /* read concatenated side sets; this produces the same information as
+     * the above code which reads individual side sets
+     */
+
+    /* concatenated side set read */
+
+    if (num_side_sets > 0) {
+      ids = (int *) calloc(num_side_sets, sizeof(int));
+      num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+      elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+      df_ind = (int *) calloc(num_side_sets, sizeof(int));
+      elem_list = (int *) calloc(elem_list_len, sizeof(int));
+      side_list = (int *) calloc(elem_list_len, sizeof(int));
+      dist_fact = (float *) calloc(df_list_len, sizeof(float));
+     
+      error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                       num_df_per_set, elem_ind, df_ind, 
+                                       elem_list, side_list, dist_fact);
+      printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+     
+      printf ("concatenated side set info\n");
+     
+      printf ("ids = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+     
+      printf ("num_elem_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+     
+      printf ("num_dist_per_set = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+     
+      printf ("elem_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+     
+      printf ("dist_ind = \n");
+      for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+     
+      printf ("elem_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+     
+      printf ("side_list = \n");
+      for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+     
+      printf ("dist_fact = \n");
+      for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+     
+      free (ids);
+      free (num_df_per_set);
+      free (df_ind);
+      free (elem_ind);
+      free (elem_list);
+      free (side_list);
+      free (dist_fact);
+    }
+  }   
+  /* end of concatenated side set read */
+
+  /* read QA records */
+
+  ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+  for (i=0; i<num_qa_rec; i++)
+    {
+      for (j=0; j<4; j++)
+        {
+          qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+        }
+    }
+
+  error = ex_get_qa (exoid, qa_record); 
+  printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+  printf ("QA records = \n");
+  for (i=0; i<num_qa_rec; i++) 
+    {
+      for (j=0; j<4; j++)
+        {
+          printf (" '%s'\n", qa_record[i][j]);
+          free(qa_record[i][j]);
+        }
+    }
+
+  /* read information records */
+
+  error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+
+  for (i=0; i<num_info; i++)
+    {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_info (exoid, info); 
+  printf ("\nafter ex_get_info, error = %3d\n", error);
+
+  printf ("info records = \n");
+  for (i=0; i<num_info; i++)
+    {
+      printf (" '%s'\n", info[i]);
+      free(info[i]);
+    }
+
+  /* read global variables parameters and names */
+
+  error = ex_get_var_param (exoid, "g", &num_glo_vars);
+  printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+  for (i=0; i<num_glo_vars; i++)
+    {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+    }
+
+  error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+  printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+  printf ("There are %2d global variables; their names are :\n", 
+          num_glo_vars);
+  for (i=0; i<num_glo_vars; i++)
+    {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+    }
+
+  /* read nodal variables parameters and names */
+  num_nod_vars = 0;
+  if (num_nodes > 0) {
+    error = ex_get_var_param (exoid, "n", &num_nod_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+    for (i=0; i<num_nod_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+
+    error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+    printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+    for (i=0; i<num_nod_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+  }
+
+  /* read element variables parameters and names */
+
+  num_ele_vars = 0;
+  if (num_elem > 0) {
+    error = ex_get_var_param (exoid, "e", &num_ele_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    for (i=0; i<num_ele_vars; i++)
+      {
+        var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+     
+    error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+    printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+    printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+    for (i=0; i<num_ele_vars; i++)
+      {
+        printf (" '%s'\n", var_names[i]);
+        free(var_names[i]);
+      }
+
+    /* read element variable truth table */
+
+    if (num_ele_vars > 0) {
+      truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+     
+      error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+      printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+     
+      printf ("This is the element variable truth table:\n");
+     
+      k = 0;
+      for (i=0; i<num_elem_blk*num_ele_vars; i++)
+        {
+          printf ("%2d\n", truth_tab[k++]);
+        }
+      free (truth_tab);
+    }
+  }
+
+  /* read nodeset variables parameters and names */
+
+  num_nset_vars = 0;
+  if (num_node_sets > 0) {
+    error = ex_get_var_param (exoid, "m", &num_nset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_nset_vars > 0) {
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "m", num_nset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d nodeset variables; their names are :\n", 
+	      num_nset_vars);
+      for (i=0; i<num_nset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read nodeset variable truth table */
+
+      if (num_nset_vars > 0) {
+	truth_tab = (int *) calloc ((num_node_sets*num_nset_vars), sizeof(int));
+     
+	error = ex_get_nset_var_tab (exoid, num_node_sets, num_nset_vars, truth_tab);
+	printf ("\nafter ex_get_nset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the nodeset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_node_sets*num_nset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* read sideset variables parameters and names */
+
+  num_sset_vars = 0;
+  if (num_side_sets > 0) {
+    error = ex_get_var_param (exoid, "s", &num_sset_vars);
+    printf ("\nafter ex_get_var_param, error = %3d\n", error);
+     
+    if (num_sset_vars > 0) {
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+	}
+     
+      error = ex_get_var_names (exoid, "s", num_sset_vars, var_names);
+      printf ("\nafter ex_get_var_names, error = %3d\n", error);
+     
+      printf ("There are %2d sideset variables; their names are :\n", 
+	      num_sset_vars);
+      for (i=0; i<num_sset_vars; i++)
+	{
+	  printf (" '%s'\n", var_names[i]);
+	  free(var_names[i]);
+	}
+
+      /* read sideset variable truth table */
+
+      if (num_sset_vars > 0) {
+	truth_tab = (int *) calloc ((num_side_sets*num_sset_vars), sizeof(int));
+     
+	error = ex_get_sset_var_tab (exoid, num_side_sets, num_sset_vars, truth_tab);
+	printf ("\nafter ex_get_sset_var_tab, error = %3d\n", error);
+     
+	printf ("This is the sideset variable truth table:\n");
+     
+	k = 0;
+	for (i=0; i<num_side_sets*num_sset_vars; i++)
+	  {
+	    printf ("%2d\n", truth_tab[k++]);
+	  }
+	free (truth_tab);
+      }
+    }
+  }
+
+  /* determine how many time steps are stored */
+
+  error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+  printf ("\nafter ex_inquire, error = %3d\n", error);
+  printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+  /* read time value at one time step */
+
+  time_step = 3;
+  error = ex_get_time (exoid, time_step, &time_value);
+  printf ("\nafter ex_get_time, error = %3d\n", error);
+
+  printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+  /* read time values at all time steps */
+
+  time_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_all_times (exoid, time_values);
+  printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+  printf ("time values at all time steps are:\n");
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+  free (time_values);
+
+  /* read all global variables at one time step */
+
+  var_values = (float *) calloc (num_glo_vars, sizeof(float));
+
+  error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+  printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+  printf ("global variable values at time step %2d\n", time_step);
+  for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a single global variable through time */
+
+  var_index = 1;
+  beg_time = 1;
+  end_time = -1;
+
+  var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+  error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                var_values);
+  printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+  printf ("global variable %2d values through time:\n", var_index);
+  for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+  free (var_values); 
+
+  /* read a nodal variable at one time step */
+
+  if (num_nodes > 0) {
+    var_values = (float *) calloc (num_nodes, sizeof(float));
+
+    error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                              var_values);
+    printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+    printf ("nodal variable %2d values at time step %2d\n", var_index, 
+            time_step);
+    for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+
+    /* read a nodal variable through time */
+
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+
+    node_num = 1;
+    error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                   end_time, var_values);
+    printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+    printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+            node_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+    free (var_values); 
+  }
+  /* read an element variable at one time step */
+
+  if (num_elem_blk > 0) {
+    ids = (int *) calloc(num_elem_blk, sizeof(int));
+     
+    error = ex_get_elem_blk_ids (exoid, ids);
+    printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_elem_blk; i++)
+      {
+	if (num_elem_in_block[i] > 0) {
+	  var_values = (float *) calloc (num_elem_in_block[i], sizeof(float));
+         
+	  error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+				   num_elem_in_block[i], var_values);
+	  printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+         
+	  if (!error)
+	    {
+	      printf 
+		("element variable %2d values of element block %2d at time step %2d\n",
+		 var_index, ids[i], time_step);
+	      for (j=0; j<num_elem_in_block[i]; j++) 
+		printf ("%5.3f\n", var_values[j]);
+	    }
+         
+	  free (var_values);
+	}
+      }
+    free (num_elem_in_block);
+    free(ids);
+  }
+  /* read an element variable through time */
+
+  if (num_ele_vars > 0) {
+    var_values = (float *) calloc (num_time_steps, sizeof(float));
+     
+    var_index = 2;
+    elem_num = 2;
+    error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+    printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+     
+    printf ("element variable %2d values for element %2d through time:\n", 
+            var_index, elem_num);
+    for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+     
+    free (var_values);
+  }
+   
+  /* read a sideset variable at one time step */
+
+  if (num_sset_vars > 0) {
+    ids = (int *) calloc(num_side_sets, sizeof(int));
+     
+    error = ex_get_side_set_ids (exoid, ids);
+    printf ("\n after ex_get_side_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_side_sets; i++)
+      {
+        var_values = (float *) calloc (num_elem_per_set[i], sizeof(float));
+         
+        error = ex_get_sset_var (exoid, time_step, var_index, ids[i], 
+                                 num_elem_per_set[i], var_values);
+        printf ("\nafter ex_get_sset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("sideset variable %2d values of sideset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_elem_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free (num_elem_per_set);
+    free(ids);
+  }
+
+  /* read a nodeset variable at one time step */
+
+  if (num_nset_vars > 0) {
+    ids = (int *) calloc(num_node_sets, sizeof(int));
+     
+    error = ex_get_node_set_ids (exoid, ids);
+    printf ("\n after ex_get_node_set_ids, error = %3d\n", error);
+     
+    for (i=0; i<num_node_sets; i++)
+      {
+        var_values = (float *) calloc (num_nodes_per_set[i], sizeof(float));
+         
+        error = ex_get_nset_var (exoid, time_step, var_index, ids[i], 
+                                 num_nodes_per_set[i], var_values);
+        printf ("\nafter ex_get_nset_var, error = %3d\n", error);
+         
+        if (!error)
+          {
+            printf 
+              ("nodeset variable %2d values of nodeset %2d at time step %2d\n",
+               var_index, ids[i], time_step);
+            for (j=0; j<num_nodes_per_set[i]; j++) 
+              printf ("%5.3f\n", var_values[j]);
+          }
+         
+        free (var_values); 
+      }
+    free(ids);
+  }
+  if (num_node_sets > 0)
+    free (num_nodes_per_set);
+
+  error = ex_close (exoid);
+  printf ("\nafter ex_close, error = %3d\n", error);
+  MPI_Finalize();
+  return 0;
+}
diff --git a/exodus/cbind/test/testrd_ss.c b/exodus/cbind/test/testrd_ss.c
new file mode 100644
index 0000000..d386e23
--- /dev/null
+++ b/exodus/cbind/test/testrd_ss.c
@@ -0,0 +1,340 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrd_ss - read exodus file test.exo created by testwt_ss
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*   Original L. A. Schoof
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+   int num_side_sets, error;
+   int i, j, k, node_ctr;
+   int *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+   int *ids; 
+   int *num_elem_per_set;
+   int *num_df_per_set;
+   int *elem_ind, *df_ind;
+   int *num_elem_in_block, *num_nodes_per_elem, *num_attr;
+   int num_elem_in_set;
+   int num_sides_in_set, num_df_in_set;
+   int elem_list_len = 0;
+   int node_list_len = 0;
+   int df_list_len = 0;
+   int CPU_word_size,IO_word_size;
+   int idum;
+
+   float *dist_fact;
+   float version, fdum;
+
+   char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+   char *cdum = 0;
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 0;                    /* use what is stored in file */
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+
+/* open EXODUS II files */
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+/*   printf ("         CPU word size %1d\n",CPU_word_size);  */
+   printf ("         I/O word size %1d\n",IO_word_size);
+   ex_inquire(exoid,EX_INQ_API_VERS, &idum, &version, cdum);
+   printf ("EXODUSII API; version %4.2f\n", version);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* read database parameters */
+
+   error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                        &num_elem_blk, &num_node_sets, &num_side_sets);
+
+   printf ("after ex_get_init, error = %3d\n", error);
+
+   printf ("database parameters:\n");
+   printf ("title =  '%s'\n",title);
+   printf ("num_dim = %3d\n",num_dim);
+   printf ("num_nodes = %3d\n",num_nodes);
+   printf ("num_elem = %3d\n",num_elem);
+   printf ("num_elem_blk = %3d\n",num_elem_blk);
+   printf ("num_node_sets = %3d\n",num_node_sets);
+   printf ("num_side_sets = %3d\n",num_side_sets);
+
+
+/* read element block parameters */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+   num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+   num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+   num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+   
+   for (i=0; i<num_elem_blk; i++)
+   {
+     error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                &(num_elem_in_block[i]), 
+                                &(num_nodes_per_elem[i]), &(num_attr[i]));
+     printf ("\nafter ex_get_elem_block, error = %d\n", error);
+
+     printf ("element block id = %2d\n",ids[i]);
+     printf ("element type = '%s'\n", elem_type);
+     printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+     printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+     printf ("num_attr = %2d\n",num_attr[i]);
+   }
+   
+/* read element connectivity */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+                                sizeof(int));
+
+      error = ex_get_elem_conn (exoid, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+
+      printf ("connect array for elem block %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%3d\n", connect[j]);
+      }
+      free (connect);
+
+   }
+   free(ids);
+   free(num_elem_in_block);
+   free(num_nodes_per_elem);
+   free(num_attr);
+
+/* read individual side sets */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+
+   error = ex_get_side_set_ids (exoid, ids);
+   printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_side_sets; i++)
+   {
+      error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                     &num_df_in_set);
+      printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+
+      printf ("side set %2d parameters:\n",ids[i]);
+      printf ("num_sides = %3d\n",num_sides_in_set);
+      printf ("num_dist_factors = %3d\n", num_df_in_set);
+
+
+      /* Note: The # of elements is same as # of sides!  */
+      num_elem_in_set = num_sides_in_set;
+      elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+      node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+      dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+
+      error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+      printf ("\nafter ex_get_side_set, error = %3d\n", error);
+      
+      error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                         node_list);
+      printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("element list for side set %2d\n", ids[i]);
+      for (j=0; j<num_elem_in_set; j++)
+      {
+         printf ("%3d\n", elem_list[j]);
+      }
+
+      printf ("side list for side set %2d\n", ids[i]);
+      for (j=0; j<num_sides_in_set; j++)
+      {
+         printf ("%3d\n", side_list[j]);
+      }
+
+      node_ctr = 0;
+      printf ("node list for side set %2d\n", ids[i]);
+      for (k=0; k<num_elem_in_set; k++)
+      {
+        printf ("%3d nodes for side %3d\n", node_ctr_list[k], k);
+        for (j=0; j<node_ctr_list[k]; j++)
+        {
+          printf ("%3d\n", node_list[node_ctr+j]);
+        }
+        node_ctr += node_ctr_list[k];
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for side set %2d\n", ids[i]);
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+           printf ("%5.3f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for side set %2d\n", ids[i]);
+
+      free (elem_list);
+      free (side_list);
+      free (node_ctr_list);
+      free (node_list);
+      free (dist_fact);
+
+   }
+   free(ids);
+
+   if (num_side_sets > 0)
+   {
+     error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+              elem_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+              node_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+              df_list_len, error);
+   }
+
+/* read concatenated side sets; this produces the same information as
+ * the above code which reads individual side sets
+ */
+
+/* concatenated side set read */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+   num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+   df_ind = (int *) calloc(num_side_sets, sizeof(int));
+   elem_list = (int *) calloc(elem_list_len, sizeof(int));
+   side_list = (int *) calloc(elem_list_len, sizeof(int));
+   dist_fact = (float *) calloc(df_list_len, sizeof(float));
+
+   error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                    num_df_per_set, elem_ind, df_ind, 
+                                    elem_list, side_list, dist_fact);
+   printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+
+   printf ("concatenated side set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_elem_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+
+   printf ("num_dist_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+
+   printf ("elem_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+
+   printf ("dist_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+
+   printf ("elem_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+
+   printf ("side_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_elem_per_set);
+   free (num_df_per_set);
+   free (df_ind);
+   free (elem_ind);
+   free (elem_list);
+   free (side_list);
+   free (dist_fact);
+
+/* end of concatenated side set read */
+
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testrd_ss.dmp b/exodus/cbind/test/testrd_ss.dmp
new file mode 100644
index 0000000..e0bb5ec
--- /dev/null
+++ b/exodus/cbind/test/testrd_ss.dmp
@@ -0,0 +1,523 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   8
+num_elem_blk =   8
+num_node_sets =   2
+num_side_sets =   9
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 15
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 16
+element type = 'shell'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 17
+element type = 'triangle'
+num_elem_in_block =  1
+num_nodes_per_elem =  3
+num_attr =  1
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 15
+ 17
+ 18
+ 19
+ 20
+ 27
+ 28
+ 30
+ 29
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 16
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 17
+ 30
+ 31
+ 32
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+num_sides =   0
+num_dist_factors =   0
+
+after ex_get_side_set, error =   1
+
+after ex_get_side_set_node_list, error =   1
+element list for side set 30
+side list for side set 30
+node list for side set 30
+no dist factors for side set 30
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+num_sides =   0
+num_dist_factors =   0
+
+after ex_get_side_set, error =   1
+
+after ex_get_side_set_node_list, error =   1
+element list for side set 31
+side list for side set 31
+node list for side set 31
+no dist factors for side set 31
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 32
+  2
+  2
+side list for side set 32
+  4
+  2
+node list for side set 32
+  2 nodes for side   0
+  8
+  5
+  2 nodes for side   1
+  6
+  7
+dist factors for side set 32
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 33
+  1
+  2
+side list for side set 33
+  2
+  3
+node list for side set 33
+  2 nodes for side   0
+  2
+  3
+  2 nodes for side   1
+  7
+  8
+dist factors for side set 33
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 34
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 34
+  4 nodes for side   0
+  9
+ 12
+ 11
+ 10
+  4 nodes for side   1
+ 11
+ 12
+ 16
+ 15
+  4 nodes for side   2
+ 11
+ 12
+ 16
+ 15
+  4 nodes for side   3
+ 10
+ 11
+ 15
+ 14
+  4 nodes for side   4
+  9
+ 13
+ 16
+ 12
+  4 nodes for side   5
+  9
+ 10
+ 14
+ 13
+  4 nodes for side   6
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 34
+
+after ex_get_side_set_param, error =   0
+side set 35 parameters:
+num_sides =   4
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 35
+  4
+  4
+  4
+  4
+side list for side set 35
+  1
+  2
+  3
+  4
+node list for side set 35
+  3 nodes for side   0
+ 17
+ 18
+ 20
+  3 nodes for side   1
+ 18
+ 19
+ 20
+  3 nodes for side   2
+ 17
+ 20
+ 19
+  3 nodes for side   3
+ 17
+ 19
+ 18
+no dist factors for side set 35
+
+after ex_get_side_set_param, error =   0
+side set 36 parameters:
+num_sides =   2
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 36
+  7
+  7
+side list for side set 36
+  1
+  2
+node list for side set 36
+  4 nodes for side   0
+  1
+  2
+  3
+  4
+  4 nodes for side   1
+  1
+  4
+  3
+  2
+no dist factors for side set 36
+
+after ex_get_side_set_param, error =   0
+side set 37 parameters:
+num_sides =   4
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 37
+  7
+  7
+  7
+  7
+side list for side set 37
+  3
+  4
+  5
+  6
+node list for side set 37
+  2 nodes for side   0
+  1
+  2
+  2 nodes for side   1
+  2
+  3
+  2 nodes for side   2
+  3
+  4
+  2 nodes for side   3
+  4
+  1
+no dist factors for side set 37
+
+after ex_get_side_set_param, error =   0
+side set 38 parameters:
+num_sides =   2
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 38
+  8
+  8
+side list for side set 38
+  1
+  2
+node list for side set 38
+  3 nodes for side   0
+ 30
+ 31
+ 32
+  3 nodes for side   1
+ 32
+ 31
+ 30
+no dist factors for side set 38
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 23,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 70,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+num_elem_per_set = 
+  0
+  0
+  2
+  2
+  7
+  4
+  2
+  4
+  2
+num_dist_per_set = 
+  0
+  0
+  4
+  4
+  0
+  0
+  0
+  0
+  0
+elem_ind = 
+  0
+  0
+  0
+  2
+  4
+ 11
+ 15
+ 17
+ 21
+dist_ind = 
+  0
+  0
+  0
+  4
+  8
+  8
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  7
+  7
+  7
+  7
+  7
+  7
+  8
+  8
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+  6
+  1
+  2
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd_zeroe.dmp b/exodus/cbind/test/testrd_zeroe.dmp
new file mode 100644
index 0000000..9bef1e7
--- /dev/null
+++ b/exodus/cbind/test/testrd_zeroe.dmp
@@ -0,0 +1,345 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  33
+num_elem =   0
+num_elem_blk =   0
+num_node_sets =   2
+num_side_sets =   0
+ after ex_inquire, error = 0
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+y coord name = 'ycoor'
+z coord name = 'zcoor'
+ after ex_get_attr_param, error = 0
+num nodal attributes = 0
+
+after ex_get_map, error =   0
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_names, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+name = ''
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 20 = 0
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+name = ''
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+ after ex_get_attr_param, error = 0
+num nodeset attributes for nodeset 21 = 0
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'node_variable_a_very_long_name_0'
+ 'nod_var1'
+
+after ex_get_var_param, error =   0
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+1.870
+1.900
+1.930
+1.960
+1.990
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrd_zeron.dmp b/exodus/cbind/test/testrd_zeron.dmp
new file mode 100644
index 0000000..ec494dc
--- /dev/null
+++ b/exodus/cbind/test/testrd_zeron.dmp
@@ -0,0 +1,86 @@
+
+after ex_open
+         I/O word size 4
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   1
+num_nodes =   0
+num_elem =   0
+num_elem_blk =   0
+num_node_sets =   0
+num_side_sets =   0
+ after ex_inquire, error = 0
+
+after ex_get_coord, error =   0
+x coords = 
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+ after ex_get_attr_param, error = 0
+num nodal attributes = 0
+
+after ex_get_map, error =   0
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWT'
+ 'testwt'
+ '07/07/93'
+ '15:41:33'
+ ''
+ ''
+ ''
+ ''
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ ''
+ ''
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrdd.c b/exodus/cbind/test/testrdd.c
new file mode 100644
index 0000000..7860d42
--- /dev/null
+++ b/exodus/cbind/test/testrdd.c
@@ -0,0 +1,900 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/******************************************************************************
+* testrdd - read exodus file test.exo created by testwt - double precision
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*
+*
+* environment - UNIX
+*
+* entry conditions -
+*   input parameters:
+*       int     exoid                   exodus file id
+*
+* exit conditions -
+*
+* revision history -
+*
+*   Original L. A. Schoof
+*   04/05/93 V.R. Yarberry - revised so that output resembles Fortran version
+*   06/25/93 VRY - revised to match 2.00 API.
+*
+*****************************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk, num_node_sets;
+   int num_side_sets, error;
+   int i, j, k, node_ctr;
+   int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+   int *ids;
+   int *num_nodes_per_set, *num_elem_per_set;
+   int *num_df_per_set;
+   int *node_ind, *elem_ind, *df_ind, num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int num_time_steps;
+   int *num_elem_in_block, *num_nodes_per_elem, *num_attr;
+   int num_nodes_in_set, num_elem_in_set;
+   int num_sides_in_set, num_df_in_set;
+   int list_len = 0;
+   int elem_list_len = 0;
+   int node_list_len = 0;
+   int df_list_len = 0;
+   int node_num, time_step, var_index, beg_time, end_time, elem_num;
+   int CPU_word_size,IO_word_size;
+   int num_props, prop_value, *prop_values;
+
+   double time_value, *time_values, *var_values;
+   double *x, *y, *z;
+   double attrib[1], *dist_fact;
+   float version, fdum;
+
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+   char *cdum = 0;
+   char *prop_names[3];
+
+   CPU_word_size = 8;                   /* sizeof(double) */
+   IO_word_size = 0;                    /* use what is stored in file */
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* open EXODUS II files */
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                     EX_READ,           /* access mode = READ */
+                     &CPU_word_size,    /* CPU word size */
+                     &IO_word_size,     /* IO word size */
+                     &version);         /* ExodusII library version */
+
+   printf ("\nafter ex_open\n");
+   if (exoid < 0) exit(1);
+
+   printf ("test.exo is an EXODUSII file; version %4.2f\n",
+            version);
+   printf ("         CPU word size %1d\n",CPU_word_size);
+   printf ("         I/O word size %1d\n",IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* read database parameters */
+
+   error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                        &num_elem_blk, &num_node_sets, &num_side_sets);
+
+   printf ("after ex_get_init, error = %3d\n", error);
+
+   printf ("database parameters:\n");
+   printf ("title =  '%s'\n",title);
+   printf ("num_dim = %3d\n",num_dim);
+   printf ("num_nodes = %3d\n",num_nodes);
+   printf ("num_elem = %3d\n",num_elem);
+   printf ("num_elem_blk = %3d\n",num_elem_blk);
+   printf ("num_node_sets = %3d\n",num_node_sets);
+   printf ("num_side_sets = %3d\n",num_side_sets);
+
+/* read nodal coordinates values and names from database */
+
+   x = (double *) calloc(num_nodes, sizeof(double));
+   y = (double *) calloc(num_nodes, sizeof(double));
+   if (num_dim >= 3)
+     z = (double *) calloc(num_nodes, sizeof(double));
+   else
+     z = 0;
+
+
+   error = ex_get_coord (exoid, x, y, z);
+   printf ("\nafter ex_get_coord, error = %3d\n", error);
+
+   printf ("x coords = \n");
+   for (i=0; i<num_nodes; i++)
+   {
+      printf ("%5.1f\n", x[i]);
+   }
+
+   printf ("y coords = \n");
+   for (i=0; i<num_nodes; i++)
+   {
+      printf ("%5.1f\n", y[i]);
+   }
+
+   if (num_dim >= 3)
+   {
+     printf ("z coords = \n");
+     for (i=0; i<num_nodes; i++)
+     {
+        printf ("%5.1f\n", z[i]);
+     }
+   }
+
+
+/*
+   error = ex_get_1_coord (exoid, 2, x, y, z);
+   printf ("\nafter ex_get_1_coord, error = %3d\n", error);
+
+   printf ("x coord of node 2 = \n");
+   printf ("%f \n", x[0]);
+
+   printf ("y coord of node 2 = \n");
+   printf ("%f \n", y[0]);
+*/
+   free (x);
+   free (y);
+   if (num_dim >= 3)
+     free (z);
+
+
+   for (i=0; i<num_dim; i++)
+   {
+      coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_coord_names (exoid, coord_names);
+   printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+
+   printf ("x coord name = '%s'\n", coord_names[0]);
+   printf ("y coord name = '%s'\n", coord_names[1]);
+
+   for (i=0; i<num_dim; i++)
+     free(coord_names[i]);
+
+
+/* read element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   error = ex_get_map (exoid, elem_map);
+   printf ("\nafter ex_get_map, error = %3d\n", error);
+
+   for (i=0; i<num_elem; i++)
+   {
+      printf ("elem_map(%d) = %d \n", i, elem_map[i]);
+   }
+
+   free (elem_map);
+
+/* read element block parameters */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+   num_elem_in_block = (int *) calloc(num_elem_blk, sizeof(int));
+   num_nodes_per_elem = (int *) calloc(num_elem_blk, sizeof(int));
+   num_attr = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+     error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                &(num_elem_in_block[i]), 
+                                &(num_nodes_per_elem[i]), &(num_attr[i]));
+     printf ("\nafter ex_get_elem_block, error = %d\n", error);
+
+     printf ("element block id = %2d\n",ids[i]);
+     printf ("element type = '%s'\n", elem_type);
+     printf ("num_elem_in_block = %2d\n",num_elem_in_block[i]);
+     printf ("num_nodes_per_elem = %2d\n",num_nodes_per_elem[i]);
+     printf ("num_attr = %2d\n",num_attr[i]);
+   }
+
+   /* read element block properties */
+   error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each element block\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_elem_blk; j++)
+     {
+       error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("element block %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+
+/* read element connectivity */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      connect = (int *) calloc((num_nodes_per_elem[i] * num_elem_in_block[i]), 
+                                sizeof(int));
+
+      error = ex_get_elem_conn (exoid, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+
+      printf ("connect array for elem block %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%3d\n", connect[j]);
+      }
+/*
+      error = ex_get_1_elem_conn (exoid, 1, ids[i], connect);
+      printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+
+      printf ("node list for first element of element block %d \n ", ids[i]);
+      for (j=0; j<num_nodes_per_elem[i]; j++)
+      {
+         printf ("%d \n", connect[j]);
+      }
+*/
+      free (connect);
+
+   }
+
+/* read element block attributes */
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      error = ex_get_elem_attr (exoid, ids[i], attrib);
+      printf ("\n after ex_get_elem_attr, error = %d\n", error);
+
+      if (error == 0)
+         printf ("element block %d attributes = %10.8f\n", ids[i], *attrib);
+   }
+
+   free (ids);
+   free (num_nodes_per_elem);
+   free (num_attr);
+
+/* read individual node sets */
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+
+   error = ex_get_node_set_ids (exoid, ids);
+   printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_node_sets; i++)
+   {
+      error = ex_get_node_set_param (exoid, ids[i],
+                                      &num_nodes_in_set, &num_df_in_set);
+      printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+
+      printf ("\nnode set %2d parameters: \n", ids[i]);
+      printf ("num_nodes = %2d\n", num_nodes_in_set);
+
+      node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+      dist_fact = (double *) calloc(num_nodes_in_set, sizeof(double));
+
+      error = ex_get_node_set (exoid, ids[i], node_list);
+      printf ("\nafter ex_get_node_set, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("\nnode list for node set %2d\n", ids[i]);
+
+      for (j=0; j<num_nodes_in_set; j++)
+      {
+         printf ("%3d\n", node_list[j]);
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for node set %2d\n", ids[i]);
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+           printf ("%5.2f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for node set %2d\n", ids[i]);
+
+      free (node_list);
+      free (dist_fact);
+   }
+   free(ids);
+
+   /* read node set properties */
+   error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each node set\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+   prop_values = (int *) calloc (num_node_sets, sizeof(int));
+
+   error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+   for (i=0; i<num_props; i++)
+   {
+     error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                         prop_values);
+     if (error == 0)
+       for (j=0; j<num_node_sets; j++)
+         printf ("node set %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_values[j]);
+     else
+       printf ("after ex_get_prop_array, error = %d\n", error);
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free(prop_values);
+
+/* read concatenated node sets; this produces the same information as
+ * the above code which reads individual node sets
+ */
+
+   error = ex_inquire (exoid, EX_INQ_NODE_SETS, &num_node_sets, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n",error);
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+   num_nodes_per_set = (int *) calloc(num_node_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_node_sets, sizeof(int));
+   node_ind = (int *) calloc(num_node_sets, sizeof(int));
+   df_ind = (int *) calloc(num_node_sets, sizeof(int));
+
+   error = ex_inquire (exoid, EX_INQ_NS_NODE_LEN, &list_len, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_NS_NODE_LEN = %d, error = %3d\n",
+            list_len, error);
+
+   node_list = (int *) calloc(list_len, sizeof(int));
+
+   error = ex_inquire (exoid, EX_INQ_NS_DF_LEN, &list_len, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_NS_DF_LEN = %d, error = %3d\n",
+            list_len, error);
+   dist_fact = (double *) calloc(list_len, sizeof(double));
+
+   error = ex_get_concat_node_sets (exoid,ids,num_nodes_per_set,num_df_per_set,
+                                    node_ind, df_ind, node_list, dist_fact);
+   printf ("\nafter ex_get_concat_node_sets, error = %3d\n", error);
+
+   printf ("\nconcatenated node set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_nodes_per_set = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", num_nodes_per_set[i]);
+
+   printf ("node_ind = \n");
+   for (i=0; i<num_node_sets; i++) printf ("%3d\n", node_ind[i]);
+
+   printf ("node_list = \n");
+   for (i=0; i<list_len; i++) printf ("%3d\n", node_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_nodes_per_set);
+   free (df_ind);
+   free (node_ind);
+   free (num_df_per_set);
+   free (node_list);
+   free (dist_fact);
+
+
+/* read individual side sets */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+
+   error = ex_get_side_set_ids (exoid, ids);
+   printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+
+   for (i=0; i<num_side_sets; i++)
+   {
+      error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set, 
+                                     &num_df_in_set);
+      printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+
+      printf ("side set %2d parameters:\n",ids[i]);
+      printf ("num_sides = %3d\n",num_sides_in_set);
+      printf ("num_dist_factors = %3d\n", num_df_in_set);
+
+
+      /* Note: The # of elements is same as # of sides!  */
+      num_elem_in_set = num_sides_in_set;
+      elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+      node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+      dist_fact = (double *) calloc(num_df_in_set, sizeof(double));
+
+      error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+      printf ("\nafter ex_get_side_set, error = %3d\n", error);
+
+      error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                         node_list);
+      printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+      }
+
+      printf ("element list for side set %2d\n", ids[i]);
+
+      for (j=0; j<num_elem_in_set; j++)
+      {
+         printf ("%3d\n", elem_list[j]);
+      }
+
+      printf ("side list for side set %2d\n", ids[i]);
+      for (j=0; j<num_sides_in_set; j++)
+      {
+         printf ("%3d\n", side_list[j]);
+      }
+
+      node_ctr = 0;
+      printf ("node list for side set %2d\n", ids[i]);
+      for (k=0; k<num_elem_in_set; k++)
+      {
+        for (j=0; j<node_ctr_list[k]; j++)
+        {
+          printf ("%3d\n", node_list[node_ctr+j]);
+        }
+        node_ctr += node_ctr_list[k];
+      }
+
+      if (num_df_in_set > 0)
+      {
+        printf ("dist factors for side set %2d\n", ids[i]); 
+
+        for (j=0; j<num_df_in_set; j++)
+        {
+           printf ("%5.3f\n", dist_fact[j]);
+        }
+      }
+      else
+        printf ("no dist factors for side set %2d\n", ids[i]);
+
+      free (elem_list);
+      free (side_list);
+      free (node_ctr_list);
+      free (node_list);
+      free (dist_fact);
+   }
+
+   /* read side set properties */
+   error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+   printf ("\nThere are %2d properties for each side set\n", num_props);
+
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_side_sets; j++)
+     {
+       error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                           &prop_value);
+       if (error == 0)
+         printf ("side set %2d, property(%2d): '%s'= %5d\n",
+                  j+1, i+1, prop_names[i], prop_value);
+       else
+         printf ("after ex_get_prop, error = %d\n", error);
+     }
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free (ids);
+
+   error = ex_inquire (exoid, EX_INQ_SIDE_SETS, &num_side_sets, &fdum, cdum);
+   printf ("\nafter ex_inquire: EX_INQ_SIDE_SETS = %d,  error = %d\n",
+            num_side_sets, error);
+
+   if (num_side_sets > 0)
+   {
+     error = ex_inquire(exoid, EX_INQ_SS_ELEM_LEN, &elem_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_ELEM_LEN = %d,  error = %d\n",
+              elem_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_NODE_LEN, &node_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_NODE_LEN = %d,  error = %d\n",
+              node_list_len, error);
+
+     error = ex_inquire(exoid, EX_INQ_SS_DF_LEN, &df_list_len, &fdum, cdum);
+     printf ("\nafter ex_inquire: EX_INQ_SS_DF_LEN = %d,  error = %d\n",
+              df_list_len, error);
+   }
+
+/* read concatenated side sets; this produces the same information as
+ * the above code which reads individual side sets
+ */
+
+/* concatenated side set read */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+   num_elem_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   num_df_per_set = (int *) calloc(num_side_sets, sizeof(int));
+   elem_ind = (int *) calloc(num_side_sets, sizeof(int));
+   df_ind = (int *) calloc(num_side_sets, sizeof(int));
+   elem_list = (int *) calloc(elem_list_len, sizeof(int));
+   side_list = (int *) calloc(elem_list_len, sizeof(int));
+   dist_fact = (double *) calloc(df_list_len, sizeof(double));
+
+   error = ex_get_concat_side_sets (exoid, ids, num_elem_per_set, 
+                                    num_df_per_set, elem_ind, df_ind, 
+                                    elem_list, side_list, dist_fact);
+   printf ("\nafter ex_get_concat_side_sets, error = %3d\n", error);
+
+   printf ("concatenated side set info\n");
+
+   printf ("ids = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", ids[i]);
+
+   printf ("num_elem_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_elem_per_set[i]);
+
+   printf ("num_dist_per_set = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", num_df_per_set[i]);
+
+   printf ("elem_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", elem_ind[i]);
+
+   printf ("dist_ind = \n");
+   for (i=0; i<num_side_sets; i++) printf ("%3d\n", df_ind[i]);
+
+   printf ("elem_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", elem_list[i]);
+
+   printf ("side_list = \n");
+   for (i=0; i<elem_list_len; i++) printf ("%3d\n", side_list[i]);
+
+   printf ("dist_fact = \n");
+   for (i=0; i<df_list_len; i++) printf ("%5.3f\n", dist_fact[i]);
+
+   free (ids);
+   free (num_elem_per_set);
+   free (num_df_per_set);
+   free (df_ind);
+   free (elem_ind);
+   free (elem_list);
+   free (side_list);
+   free (dist_fact);
+
+/* end of concatenated side set read */
+
+/* read QA records */
+
+   ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+   for (i=0; i<num_qa_rec; i++)
+   {
+      for (j=0; j<4; j++)
+      {
+         qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+   }
+
+   error = ex_get_qa (exoid, qa_record); 
+   printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+   printf ("QA records = \n");
+   for (i=0; i<num_qa_rec; i++) 
+   {
+     for (j=0; j<4; j++)
+     {
+       printf (" '%s'\n", qa_record[i][j]);
+       free(qa_record[i][j]);
+     }
+   }
+
+
+/* read information records */
+
+   error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+
+   for (i=0; i<num_info; i++)
+   {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_info (exoid, info); 
+   printf ("\nafter ex_get_info, error = %3d\n", error);
+
+   printf ("info records = \n");
+   for (i=0; i<num_info; i++)
+   {
+     printf (" '%s'\n", info[i]);
+     free(info[i]);
+   }
+
+
+/* read global variables parameters and names */
+
+   error = ex_get_var_param (exoid, "g", &num_glo_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_glo_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d global variables; their names are :\n", 
+           num_glo_vars);
+   for (i=0; i<num_glo_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+
+/* read nodal variables parameters and names */
+
+   error = ex_get_var_param (exoid, "n", &num_nod_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_nod_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d nodal variables; their names are :\n", num_nod_vars);
+   for (i=0; i<num_nod_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+/* read element variables parameters and names */
+
+   error = ex_get_var_param (exoid, "e", &num_ele_vars);
+   printf ("\nafter ex_get_var_param, error = %3d\n", error);
+
+   for (i=0; i<num_ele_vars; i++)
+   {
+      var_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("\nafter ex_get_var_names, error = %3d\n", error);
+
+   printf ("There are %2d element variables; their names are :\n", 
+            num_ele_vars);
+   for (i=0; i<num_ele_vars; i++)
+   {
+      printf (" '%s'\n", var_names[i]);
+      free(var_names[i]);
+   }
+
+
+/* read element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   error = ex_get_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("\nafter ex_get_elem_var_tab, error = %3d\n", error);
+
+   printf ("This is the element variable truth table:\n");
+
+   k = 0;
+   for (i=0; i<num_elem_blk*num_ele_vars; i++)
+   {
+      printf ("%2d\n", truth_tab[k++]);
+   }
+   free (truth_tab);
+
+/* determine how many time steps are stored */
+
+   error = ex_inquire (exoid, EX_INQ_TIME, &num_time_steps, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+   printf ("There are %2d time steps in the database.\n", num_time_steps);
+
+/* read time value at one time step */
+
+   time_step = 3;
+   error = ex_get_time (exoid, time_step, &time_value);
+   printf ("\nafter ex_get_time, error = %3d\n", error);
+
+   printf ("time value at time step %2d = %5.3f\n", time_step, time_value);
+
+/* read time values at all time steps */
+
+   time_values = (double *) calloc (num_time_steps, sizeof(double));
+
+   error = ex_get_all_times (exoid, time_values);
+   printf ("\nafter ex_get_all_times, error = %3d\n", error);
+
+   printf ("time values at all time steps are:\n");
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", time_values[i]);
+
+   free (time_values);
+
+/* read all global variables at one time step */
+
+   var_values = (double *) calloc (num_glo_vars, sizeof(double));
+
+   error = ex_get_glob_vars (exoid, time_step, num_glo_vars, var_values);
+   printf ("\nafter ex_get_glob_vars, error = %3d\n", error);
+
+   printf ("global variable values at time step %2d\n", time_step);
+   for (i=0; i<num_glo_vars; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a single global variable through time */
+
+   var_index = 1;
+   beg_time = 1;
+   end_time = -1;
+
+   var_values = (double *) calloc (num_time_steps, sizeof(double));
+
+   error = ex_get_glob_var_time (exoid, var_index, beg_time, end_time, 
+                                 var_values);
+   printf ("\nafter ex_get_glob_var_time, error = %3d\n", error);
+
+   printf ("global variable %2d values through time:\n", var_index);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a nodal variable at one time step */
+
+   var_values = (double *) calloc (num_nodes, sizeof(double));
+
+   error = ex_get_nodal_var (exoid, time_step, var_index, num_nodes, 
+                             var_values);
+   printf ("\nafter ex_get_nodal_var, error = %3d\n", error);
+
+   printf ("nodal variable %2d values at time step %2d\n", var_index, 
+           time_step);
+   for (i=0; i<num_nodes; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read a nodal variable through time */
+
+   var_values = (double *) calloc (num_time_steps, sizeof(double));
+
+   node_num = 1;
+   error = ex_get_nodal_var_time (exoid, var_index, node_num, beg_time, 
+                                  end_time, var_values);
+   printf ("\nafter ex_get_nodal_var_time, error = %3d\n", error);
+
+   printf ("nodal variable %2d values for node %2d through time:\n", var_index,
+           node_num);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+/* read an element variable at one time step */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\n after ex_get_elem_blk_ids, error = %3d\n", error);
+
+   for (i=0; i<num_elem_blk; i++)
+   {
+      var_values = (double *) calloc (num_elem_in_block[i], sizeof(double));
+
+      error = ex_get_elem_var (exoid, time_step, var_index, ids[i], 
+                               num_elem_in_block[i], var_values);
+      printf ("\nafter ex_get_elem_var, error = %3d\n", error);
+
+      if (!error)
+      {
+         printf 
+    ("element variable %2d values of element block %2d at time step %2d\n",
+            var_index, ids[i], time_step);
+         for (j=0; j<num_elem_in_block[i]; j++) 
+            printf ("%5.3f\n", var_values[j]);
+      }
+
+      free (var_values); 
+   }
+   free (num_elem_in_block);
+   free(ids);
+
+/* read an element variable through time */
+
+   var_values = (double *) calloc (num_time_steps, sizeof(double));
+
+   var_index = 2;
+   elem_num = 2;
+   error = ex_get_elem_var_time (exoid, var_index, elem_num, beg_time, 
+                                  end_time, var_values);
+   printf ("\nafter ex_get_elem_var_time, error = %3d\n", error);
+
+   printf ("element variable %2d values for element %2d through time:\n", 
+           var_index, elem_num);
+   for (i=0; i<num_time_steps; i++) printf ("%5.3f\n", var_values[i]);
+
+   free (var_values); 
+
+   error = ex_close (exoid);
+   printf ("\nafter ex_close, error = %3d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testrdd.dmp b/exodus/cbind/test/testrdd.dmp
new file mode 100644
index 0000000..eec0204
--- /dev/null
+++ b/exodus/cbind/test/testrdd.dmp
@@ -0,0 +1,775 @@
+
+after ex_open
+         CPU word size 8
+         I/O word size 8
+after ex_get_init, error =   0
+database parameters:
+title =  'This is a test'
+num_dim =   3
+num_nodes =  26
+num_elem =   5
+num_elem_blk =   5
+num_node_sets =   2
+num_side_sets =   5
+
+after ex_get_coord, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+
+after ex_get_coord_names, error =   0
+x coord name = 'xcoor'
+y coord name = 'ycoor'
+
+after ex_get_map, error =   0
+elem_map(0) = 1 
+elem_map(1) = 2 
+elem_map(2) = 3 
+elem_map(3) = 4 
+elem_map(4) = 5 
+
+after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_block, error = 0
+element block id = 10
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 11
+element type = 'quad'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 12
+element type = 'hex'
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 13
+element type = 'tetra'
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after ex_get_elem_block, error = 0
+element block id = 14
+element type = 'wedge'
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+
+after ex_inquire, error = 0
+
+There are  3 properties for each element block
+after ex_get_prop_names, error = 0
+element block  1, property( 1): 'ID'=    10
+element block  2, property( 1): 'ID'=    11
+element block  3, property( 1): 'ID'=    12
+element block  4, property( 1): 'ID'=    13
+element block  5, property( 1): 'ID'=    14
+element block  1, property( 2): 'MATL'=    10
+element block  2, property( 2): 'MATL'=    20
+element block  3, property( 2): 'MATL'=    30
+element block  4, property( 2): 'MATL'=    40
+element block  5, property( 2): 'MATL'=    50
+element block  1, property( 3): 'DENSITY'=     0
+element block  2, property( 3): 'DENSITY'=     0
+element block  3, property( 3): 'DENSITY'=     0
+element block  4, property( 3): 'DENSITY'=     0
+element block  5, property( 3): 'DENSITY'=     0
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after ex_get_elem_conn, error = 0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+ after ex_get_elem_attr, error = 0
+element block 10 attributes = 3.14159000
+
+ after ex_get_elem_attr, error = 0
+element block 11 attributes = 6.14159000
+
+ after ex_get_elem_attr, error = 0
+element block 12 attributes = 6.14159000
+
+ after ex_get_elem_attr, error = 0
+element block 13 attributes = 6.14159000
+
+ after ex_get_elem_attr, error = 0
+element block 14 attributes = 6.14159000
+
+after ex_get_node_set_ids, error =   0
+
+after ex_get_node_set_param, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 20
+ 10
+ 11
+ 12
+ 13
+ 14
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+
+after ex_get_node_set_param, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+
+after ex_get_node_set, error =   0
+
+after ex_get_node_set_dist_fact, error =   0
+
+node list for node set 21
+ 20
+ 21
+ 22
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+
+after ex_inquire, error = 0
+
+There are  3 properties for each node set
+after ex_get_prop_names, error = 0
+node set  1, property( 1): 'ID'=    20
+node set  2, property( 1): 'ID'=    21
+node set  1, property( 2): 'FACE'=     4
+node set  2, property( 2): 'FACE'=     5
+node set  1, property( 3): 'VELOCITY'=  1000
+node set  2, property( 3): 'VELOCITY'=  2000
+
+after ex_inquire, error =   0
+
+after ex_inquire: EX_INQ_NS_NODE_LEN = 8, error =   0
+
+after ex_inquire: EX_INQ_NS_DF_LEN = 8, error =   0
+
+after ex_get_concat_node_sets, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  0
+  5
+node_list = 
+ 10
+ 11
+ 12
+ 13
+ 14
+ 20
+ 21
+ 22
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after ex_get_side_set_ids, error =   0
+
+after ex_get_side_set_param, error =   0
+side set 30 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after ex_get_side_set_param, error =   0
+side set 31 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+
+after ex_get_side_set_dist_fact, error =   0
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_side_set_param, error =   0
+side set 32 parameters:
+num_sides =   7
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after ex_get_side_set_param, error =   0
+side set 33 parameters:
+num_sides =   4
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 33
+  4
+  4
+  4
+  4
+side list for side set 33
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+no dist factors for side set 33
+
+after ex_get_side_set_param, error =   0
+side set 34 parameters:
+num_sides =   5
+num_dist_factors =   0
+
+after ex_get_side_set, error =   0
+
+after ex_get_side_set_node_list, error =   0
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+node list for side set 34
+ 21
+ 22
+ 25
+ 24
+ 22
+ 23
+ 26
+ 25
+ 21
+ 24
+ 26
+ 23
+ 21
+ 23
+ 22
+ 24
+ 25
+ 26
+no dist factors for side set 34
+
+after ex_inquire, error = 0
+
+There are  2 properties for each side set
+after ex_get_prop_names, error = 0
+side set  1, property( 1): 'ID'=    30
+side set  2, property( 1): 'ID'=    31
+side set  3, property( 1): 'ID'=    32
+side set  4, property( 1): 'ID'=    33
+side set  5, property( 1): 'ID'=    34
+side set  1, property( 2): 'COLOR'=   100
+side set  2, property( 2): 'COLOR'=   101
+side set  3, property( 2): 'COLOR'=     0
+side set  4, property( 2): 'COLOR'=     0
+side set  5, property( 2): 'COLOR'=     0
+
+after ex_inquire: EX_INQ_SIDE_SETS = 5,  error = 0
+
+after ex_inquire: EX_INQ_SS_ELEM_LEN = 20,  error = 0
+
+after ex_inquire: EX_INQ_SS_NODE_LEN = 66,  error = 0
+
+after ex_inquire: EX_INQ_SS_DF_LEN = 8,  error = 0
+
+after ex_get_concat_side_sets, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  4
+  5
+num_dist_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  0
+  2
+  4
+ 11
+ 15
+dist_ind = 
+  0
+  4
+  8
+  8
+  8
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  5
+  5
+  5
+  5
+  5
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after ex_get_qa, error =   0
+QA records = 
+ 'TESTWTD'
+ 'testwtd'
+ '07/07/93'
+ '15:41:33'
+ 'FASTQ'
+ 'fastq'
+ '07/07/93'
+ '16:41:33'
+
+after ex_inquire, error =   0
+
+after ex_get_info, error =   0
+info records = 
+ 'This is the first information record.'
+ 'This is the second information record.'
+ 'This is the third information record.'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  1 global variables; their names are :
+ 'glo_vars'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  2 nodal variables; their names are :
+ 'nod_var0'
+ 'nod_var1'
+
+after ex_get_var_param, error =   0
+
+after ex_get_var_names, error =   0
+There are  3 element variables; their names are :
+ 'ele_var0'
+ 'ele_var1'
+ 'ele_var2'
+
+after ex_get_elem_var_tab, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after ex_inquire, error =   0
+There are 10 time steps in the database.
+
+after ex_get_time, error =   0
+time value at time step  3 = 0.030
+
+after ex_get_all_times, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after ex_get_glob_vars, error =   0
+global variable values at time step  3
+0.060
+
+after ex_get_glob_var_time, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after ex_get_nodal_var, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+
+after ex_get_nodal_var_time, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+ after ex_get_elem_blk_ids, error =   0
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 12 at time step  3
+6.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after ex_get_elem_var, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after ex_get_elem_var_time, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+after ex_close, error =   0
diff --git a/exodus/cbind/test/testrdwt.c b/exodus/cbind/test/testrdwt.c
new file mode 100644
index 0000000..958004f
--- /dev/null
+++ b/exodus/cbind/test/testrdwt.c
@@ -0,0 +1,455 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testrdwt - test reading from one ExodusII file and writing to another
+*            ExodusII file open concurrently
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database read and write routines. It tests reading from an open EXODUSII
+*  file and writing to another concurrently opened EXODUSII file.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "exodusII.h"
+#include "netcdf.h"
+int main (int argc, char **argv)
+{
+   int exoid, exoid2, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block, num_node_sets, num_nodes_per_elem, num_attr;
+   int num_side_sets, error;
+   int i, j;
+   int *elem_map, *connect, *node_list, *node_ctr_list, *elem_list, *side_list;
+   int *ids;
+   int num_nodes_in_set, num_elem_in_set;
+   int num_sides_in_set, num_df_in_set;
+   int num_qa_rec, num_info;
+   int CPU_word_size,IO_word_size;
+   int num_props, prop_value, *prop_values;
+
+   float *x, *y, *z;
+   float *dist_fact;
+   float version, fdum;
+
+   char *coord_names[3], *qa_record[2][4], *info[3];
+   char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+   char *prop_names[3];
+   char *cdum = 0;
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* float */
+
+/* open EXODUS II file for reading */
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+   exoid = ex_open ("test.exo",         /* filename path */
+                    EX_READ,            /* access mode */
+                    &CPU_word_size,     /* CPU float word size in bytes */
+                    &IO_word_size,      /* I/O float word size in bytes */
+                    &version);          /* returned version number */
+   printf ("after ex_open for test.exo\n");
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+/* create EXODUS II file for writing */
+
+   exoid2= ex_create ("test2.exo",      /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test2.exo, exoid = %d\n", exoid2);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* read initialization parameters */
+
+   error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                        &num_elem_blk, &num_node_sets, &num_side_sets);
+
+   printf ("after ex_get_init, error = %d\n", error);
+
+/* write initialization parameters */
+
+   error = ex_put_init (exoid2, title, num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+/* read nodal coordinate values */
+
+   x = (float *) calloc(num_nodes, sizeof(float));
+   y = (float *) calloc(num_nodes, sizeof(float));
+   if (num_dim >= 3)
+     z = (float *) calloc(num_nodes, sizeof(float));
+   else
+     z = 0;
+ 
+   error = ex_get_coord (exoid, x, y, z);
+   printf ("\nafter ex_get_coord, error = %3d\n", error);
+ 
+/* write nodal coordinate values */
+
+   error = ex_put_coord (exoid2, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   free (x);
+   free (y);
+   if (num_dim >= 3)
+     free (z);
+ 
+/* read nodal coordinate names */
+
+   for (i=0; i<num_dim; i++)
+   {
+     coord_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+ 
+   error = ex_get_coord_names (exoid, coord_names);
+   printf ("\nafter ex_get_coord_names, error = %3d\n", error);
+ 
+/* write nodal coordinate names */
+
+   error = ex_put_coord_names (exoid2, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   for (i=0; i<num_dim; i++) {
+     free(coord_names[i]);
+   }
+
+/* read element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+ 
+   error = ex_get_map (exoid, elem_map);
+   printf ("\nafter ex_get_map, error = %3d\n", error);
+ 
+/* write element order map */
+
+   error = ex_put_map (exoid2, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   free (elem_map);
+
+/* read and write element block parameters and element connectivity */
+
+   ids = (int *) calloc(num_elem_blk, sizeof(int));
+   error = ex_get_elem_blk_ids (exoid, ids);
+   printf ("\nafter ex_get_elem_blk_ids, error = %3d\n", error);
+   
+   for (i=0; i<num_elem_blk; i++)
+   {
+     error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                &num_elem_in_block,
+                                &num_nodes_per_elem, &num_attr);
+     printf ("\nafter ex_get_elem_block, error = %d\n", error);
+
+     error = ex_put_elem_block (exoid2, ids[i], elem_type, num_elem_in_block,
+                                num_nodes_per_elem, num_attr);
+     printf ("after ex_put_elem_block, error = %d\n", error);
+ 
+     connect = (int *) calloc((num_nodes_per_elem * num_elem_in_block),
+                               sizeof(int));
+ 
+     error = ex_get_elem_conn (exoid, ids[i], connect);
+     printf ("\nafter ex_get_elem_conn, error = %d\n", error);
+ 
+     error = ex_put_elem_conn (exoid2, ids[i], connect);
+     printf ("after ex_put_elem_conn, error = %d\n", error);
+
+     free (connect);
+   }
+
+/* read and write element block properties */
+
+   error = ex_inquire (exoid, EX_INQ_EB_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+ 
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+ 
+   error = ex_get_prop_names(exoid,EX_ELEM_BLOCK,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+ 
+   error = ex_put_prop_names(exoid2,EX_ELEM_BLOCK,num_props,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+ 
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_elem_blk; j++)
+     {
+       error = ex_get_prop(exoid, EX_ELEM_BLOCK, ids[j], prop_names[i],
+                           &prop_value);
+       printf ("after ex_get_prop, error = %d\n", error);
+
+       if (i>0) {   /* first property is the ID which is already stored */
+          error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ids[j], prop_names[i], 
+                              prop_value);
+          printf ("after ex_put_prop, error = %d\n", error);
+       }
+     }
+   }
+
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+ 
+
+   free (ids);
+
+/* read and write individual node sets */
+
+   ids = (int *) calloc(num_node_sets, sizeof(int));
+ 
+   error = ex_get_node_set_ids (exoid, ids);
+   printf ("\nafter ex_get_node_set_ids, error = %3d\n", error);
+ 
+   for (i=0; i<num_node_sets; i++)
+   {
+      error = ex_get_node_set_param (exoid, ids[i],
+				     &num_nodes_in_set, &num_df_in_set);
+      printf ("\nafter ex_get_node_set_param, error = %3d\n", error);
+ 
+      error = ex_put_node_set_param (exoid2, ids[i], num_nodes_in_set, 
+                                     num_df_in_set);
+      printf ("after ex_put_node_set_param, error = %d\n", error);
+
+      node_list = (int *) calloc(num_nodes_in_set, sizeof(int));
+      dist_fact = (float *) calloc(num_nodes_in_set, sizeof(float));
+ 
+      error = ex_get_node_set (exoid, ids[i], node_list);
+      printf ("\nafter ex_get_node_set, error = %3d\n", error);
+ 
+      error = ex_put_node_set (exoid2, ids[i], node_list);
+      printf ("after ex_put_node_set, error = %d\n", error);
+
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_node_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_node_set_dist_fact, error = %3d\n", error);
+
+        error = ex_put_node_set_dist_fact (exoid2, ids[i], dist_fact);
+        printf ("after ex_put_node_set, error = %d\n", error);
+
+      }
+ 
+      free (node_list);
+      free (dist_fact);
+   }
+   free(ids);
+
+   /* read node set properties */
+   error = ex_inquire (exoid, EX_INQ_NS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+ 
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+   prop_values = (int *) calloc (num_node_sets, sizeof(int));
+ 
+   error = ex_get_prop_names(exoid,EX_NODE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+
+   error = ex_put_prop_names(exoid2,EX_NODE_SET,num_props,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+ 
+   for (i=0; i<num_props; i++)
+   {
+     error = ex_get_prop_array(exoid, EX_NODE_SET, prop_names[i],
+                         prop_values);
+     printf ("after ex_get_prop_array, error = %d\n", error);
+
+     error = ex_put_prop_array(exoid2, EX_NODE_SET, prop_names[i], prop_values);
+     printf ("after ex_put_prop_array, error = %d\n", error);
+
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free(prop_values);
+
+/* read and write individual side sets */
+
+   ids = (int *) calloc(num_side_sets, sizeof(int));
+ 
+   error = ex_get_side_set_ids (exoid, ids);
+   printf ("\nafter ex_get_side_set_ids, error = %3d\n", error);
+ 
+   for (i=0; i<num_side_sets; i++)
+   {
+      error = ex_get_side_set_param (exoid, ids[i], &num_sides_in_set,
+                                     &num_df_in_set);
+      printf ("\nafter ex_get_side_set_param, error = %3d\n", error);
+ 
+      error = ex_put_side_set_param (exoid2, ids[i], num_sides_in_set, 
+                                     num_df_in_set);
+      printf ("after ex_put_side_set_param, error = %d\n", error);
+
+      /* Note: The # of elements is same as # of sides!  */
+      num_elem_in_set = num_sides_in_set;
+      elem_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      side_list = (int *) calloc(num_sides_in_set, sizeof(int));
+      node_ctr_list = (int *) calloc(num_elem_in_set, sizeof(int));
+      node_list = (int *) calloc(num_elem_in_set*21, sizeof(int));
+      dist_fact = (float *) calloc(num_df_in_set, sizeof(float));
+ 
+      error = ex_get_side_set (exoid, ids[i], elem_list, side_list);
+      printf ("\nafter ex_get_side_set, error = %3d\n", error);
+ 
+      error = ex_put_side_set (exoid2, ids[i], elem_list, side_list);
+      printf ("after ex_put_side_set, error = %d\n", error);
+
+      error = ex_get_side_set_node_list (exoid, ids[i], node_ctr_list,
+                                         node_list);
+      printf ("\nafter ex_get_side_set_node_list, error = %3d\n", error);
+ 
+      if (num_df_in_set > 0)
+      {
+        error = ex_get_side_set_dist_fact (exoid, ids[i], dist_fact);
+        printf ("\nafter ex_get_side_set_dist_fact, error = %3d\n", error);
+
+        error = ex_put_side_set_dist_fact (exoid2, ids[i], dist_fact);
+        printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+      }
+ 
+      free (elem_list);
+      free (side_list);
+      free (node_ctr_list);
+      free (node_list);
+      free (dist_fact);
+ 
+   }
+
+
+   /* read side set properties */
+   error = ex_inquire (exoid, EX_INQ_SS_PROP, &num_props, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %d\n", error);
+ 
+   for (i=0; i<num_props; i++)
+   {
+      prop_names[i] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+   }
+ 
+   error = ex_get_prop_names(exoid,EX_SIDE_SET,prop_names);
+   printf ("after ex_get_prop_names, error = %d\n", error);
+ 
+ 
+   for (i=0; i<num_props; i++)
+   {
+     for (j=0; j<num_side_sets; j++)
+     {
+       error = ex_get_prop(exoid, EX_SIDE_SET, ids[j], prop_names[i],
+                           &prop_value);
+       printf ("after ex_get_prop, error = %d\n", error);
+
+       if (i>0) {  /* first property is ID so it is already stored */
+         error = ex_put_prop(exoid2, EX_SIDE_SET, ids[j], prop_names[i], 
+                             prop_value);
+         printf ("after ex_put_prop, error = %d\n", error);
+       }
+     }
+   }
+   for (i=0; i<num_props; i++)
+     free(prop_names[i]);
+   free (ids);
+
+/* read and write QA records */
+
+   ex_inquire (exoid, EX_INQ_QA, &num_qa_rec, &fdum, cdum);
+
+   for (i=0; i<num_qa_rec; i++) {
+      for (j=0; j<4; j++) {
+	qa_record[i][j] = (char *) calloc ((MAX_STR_LENGTH+1), sizeof(char));
+      }
+   }
+
+   error = ex_get_qa (exoid, qa_record);
+   printf ("\nafter ex_get_qa, error = %3d\n", error);
+
+   error = ex_put_qa (exoid2, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   for (i=0; i<num_qa_rec; i++) {
+      for (j=0; j<4; j++) {
+	free(qa_record[i][j]);
+      }
+   }
+/* read and write information records */
+
+   error = ex_inquire (exoid, EX_INQ_INFO, &num_info, &fdum, cdum);
+   printf ("\nafter ex_inquire, error = %3d\n", error);
+
+   for (i=0; i<num_info; i++)
+   {
+      info[i] = (char *) calloc ((MAX_LINE_LENGTH+1), sizeof(char));
+   }
+
+   error = ex_get_info (exoid, info);
+   printf ("\nafter ex_get_info, error = %3d\n", error);
+
+   error = ex_put_info (exoid2, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   for (i=0; i<num_info; i++)
+   {
+     free(info[i]);
+   }
+
+/* close the EXODUS files */
+
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   error = ex_close (exoid2);
+   printf ("after ex_close (2), error = %d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-groups.c b/exodus/cbind/test/testwt-groups.c
new file mode 100644
index 0000000..5cf86c4
--- /dev/null
+++ b/exodus/cbind/test/testwt-groups.c
@@ -0,0 +1,1247 @@
+/*
+ * Copyright (c) 2013 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+  int exoid, rootid, num_dim, num_nodes, num_elem, num_elem_blk;
+  int num_elem_in_block[10], num_nodes_per_elem[10];
+  int num_face_in_sset[10], num_nodes_in_nset[10];
+  int num_node_sets, num_side_sets, error;
+  int i, j, k, m, *elem_map, *connect;
+  int node_list[100],elem_list[100],side_list[100];
+  int ebids[10], ssids[10], nsids[10];
+  int  num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+  int *truth_tab;
+  int whole_time_step, num_time_steps;
+  int CPU_word_size,IO_word_size;
+  int prop_array[2];
+
+  float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+  float *sset_var_vals, *nset_var_vals;
+  float time_value;
+  float x[100], y[100], z[100];
+  float attrib[1], dist_fact[100];
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+  char *block_names[10], *nset_names[10], *sset_names[10];
+  char *prop_names[2], *attrib_names[2];
+  char *title = "This is a test";
+  int group, num_groups=2;
+  char *group_names[2];
+  ex_opts (EX_VERBOSE | EX_ABORT );
+
+  /* Specify compute and i/o word size */
+
+  CPU_word_size = 0;                   /* sizeof(float) */
+  IO_word_size = 4;                    /* (4 bytes) */
+
+  /* create EXODUS II file */
+
+  rootid = ex_create ("test-groups.exo",       /* filename path */
+		      EX_CLOBBER|EX_NETCDF4|EX_NOCLASSIC,      /* create mode */
+		      &CPU_word_size,  /* CPU float word size in bytes */
+		      &IO_word_size);  /* I/O float word size in bytes */
+  printf ("after ex_create for test-groups.exo, exoid = %d\n", exoid);
+  printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+  /* ncopts = NC_VERBOSE; */
+
+  group_names[0] = "Group_0";
+  group_names[1] = "Group_1";
+  
+  for (group = 0; group < num_groups; group++) {
+    /* Now create a group using netdf direct call... */
+    exoid = ex_create_group(rootid, group_names[group]);
+    printf ("after ex_create_group for group 'Group1' in 'test-groups.exo', exoid = %d\n", exoid);
+
+    /* initialize file with parameters */
+    num_dim = 3;
+    num_nodes = 33;
+    num_elem = 7;
+    num_elem_blk = 7;
+    num_node_sets = 2;
+    num_side_sets = 5;
+
+    error = ex_put_init (exoid, title, num_dim, num_nodes, num_elem,
+			 num_elem_blk, num_node_sets, num_side_sets);
+
+    printf ("after ex_put_init, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    /* write nodal coordinates values and names to database */
+
+    /* Quad #1 */
+    x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+    x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+    x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+    x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+    /* Quad #2 */
+    x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+    x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+    x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+    x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+    /* Hex #1 */
+    x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+    x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+    x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+    x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+    x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+    x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+    x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+    x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+    /* Tetra #1 */
+    x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+    x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+    x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+    x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+    /* Wedge #1 */
+    x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+    x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+    x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+    x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+    x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+    x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+    /* Tetra #2 */
+    x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+    x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+    x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+    x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+    /* 3d Tri */
+    x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+    x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+    x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+    error = ex_put_coord (exoid, x, y, z);
+    printf ("after ex_put_coord, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    coord_names[0] = "xcoor";
+    coord_names[1] = "ycoor";
+    coord_names[2] = "zcoor";
+
+    error = ex_put_coord_names (exoid, coord_names);
+    printf ("after ex_put_coord_names, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    /* Add nodal attributes */
+    error = ex_put_attr_param(exoid, EX_NODAL, 0, 2);
+    printf ("after ex_put_attr_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    error = ex_put_one_attr(exoid, EX_NODAL, 0, 1, x);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    error = ex_put_one_attr(exoid, EX_NODAL, 0, 2, y);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    {
+      attrib_names[0] = "Node_attr_1";
+      attrib_names[1] = "Node_attr_2";
+      error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+    }
+
+    /* write element order map */
+
+    elem_map = (int *) calloc(num_elem, sizeof(int));
+
+    for (i=1; i<=num_elem; i++)
+      {
+	elem_map[i-1] = i;
+      }
+
+    error = ex_put_map (exoid, elem_map);
+    printf ("after ex_put_map, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    free (elem_map);
+
+
+    /* write element block parameters */
+
+    block_names[0] = "block_1";
+    block_names[1] = "block_2";
+    block_names[2] = "block_3";
+    block_names[3] = "block_4";
+    block_names[4] = "block_5";
+    block_names[5] = "block_6";
+    block_names[6] = "block_7";
+
+    num_elem_in_block[0] = 1;
+    num_elem_in_block[1] = 1;
+    num_elem_in_block[2] = 1;
+    num_elem_in_block[3] = 1;
+    num_elem_in_block[4] = 1;
+    num_elem_in_block[5] = 1;
+    num_elem_in_block[6] = 1;
+
+    num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+    num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+    num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+    num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */
+    num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */
+    num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */
+    num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris   */
+
+    ebids[0] = 10;
+    ebids[1] = 11;
+    ebids[2] = 12;
+    ebids[3] = 13;
+    ebids[4] = 14;
+    ebids[5] = 15;
+    ebids[6] = 16;
+
+    error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+			       num_nodes_per_elem[0], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_name(exoid, EX_ELEM_BLOCK, ebids[0], block_names[0]);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5],
+                               num_nodes_per_elem[5], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_block (exoid, ebids[6], "tri", num_elem_in_block[6],
+                               num_nodes_per_elem[6], 1);
+    printf ("after ex_put_elem_block, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    /* Write element block names */
+    for (i=0; i < 7; i++) {
+      error = ex_put_name(exoid, EX_ELEM_BLOCK, ebids[i], block_names[i]);
+      printf ("after ex_put_names, error = %d\n", error);
+    }
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    /* write element block properties */
+
+    /*               12345678901234567890123456789012 */
+    prop_names[0] = "MATERIAL_PROPERTY_LONG_NAME_32CH";
+    prop_names[1] = "DENSITY";
+    error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+    printf ("after ex_put_prop_names, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], prop_names[0], 10);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], prop_names[0], 20);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], prop_names[0], 30);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], prop_names[0], 40);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], prop_names[0], 50);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], prop_names[0], 60);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], prop_names[0], 70);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* write element connectivity */
+
+    connect = (int *) calloc(8, sizeof(int));
+    connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+    error = ex_put_elem_conn (exoid, ebids[0], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+    error = ex_put_elem_conn (exoid, ebids[1], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+    connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+    error = ex_put_elem_conn (exoid, ebids[2], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+    error = ex_put_elem_conn (exoid, ebids[3], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    connect[0] = 21; connect[1] = 22; connect[2] = 23;
+    connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+    error = ex_put_elem_conn (exoid, ebids[4], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+    connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+    error = ex_put_elem_conn (exoid, ebids[5], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    connect[0] = 31; connect[1] = 32; connect[2] = 33;
+
+    error = ex_put_elem_conn (exoid, ebids[6], connect);
+    printf ("after ex_put_elem_conn, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    free (connect);
+
+
+    /* write element block attributes */
+
+    attrib[0] = 3.14159;
+    error = ex_put_elem_attr (exoid, ebids[0], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_attr (exoid, ebids[0], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    attrib[0] = 6.14159;
+    error = ex_put_elem_attr (exoid, ebids[1], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_attr (exoid, ebids[2], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_attr (exoid, ebids[3], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_attr (exoid, ebids[4], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_attr (exoid, ebids[5], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_elem_attr (exoid, ebids[6], attrib);
+    printf ("after ex_put_elem_attr, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    attrib_names[0] = "THICKNESS";
+    for (i=0; i < 7; i++) {
+      error = ex_put_elem_attr_names (exoid, ebids[i], attrib_names);
+      printf ("after ex_put_elem_attr_names, error = %d\n", error);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+    }
+
+    /* write individual node sets */
+
+
+    num_nodes_in_nset[0] = 5;
+    num_nodes_in_nset[1] = 3;
+
+    nsids[0] = 20;
+    nsids[1] = 21;
+
+    error = ex_put_node_set_param (exoid, nsids[0], 5, 5);
+    printf ("after ex_put_node_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+    node_list[3] = 13; node_list[4] = 14; 
+
+    dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+    dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+    error = ex_put_node_set (exoid, nsids[0], node_list);
+    printf ("after ex_put_node_set, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact);
+    printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    error = ex_put_node_set_param (exoid, nsids[1], 3, 3);
+    printf ("after ex_put_node_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+    dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+    error = ex_put_node_set (exoid, nsids[1], node_list);
+    printf ("after ex_put_node_set, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact);
+    printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* Write node set names */
+    nset_names[0] = "nset_1";
+    nset_names[1] = "nset_2";
+
+    error = ex_put_names(exoid, EX_NODE_SET, nset_names);
+    printf ("after ex_put_names, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4);
+    printf ("after ex_put_prop, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5);
+    printf ("after ex_put_prop, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    prop_array[0] = 1000;
+    prop_array[1] = 2000;
+
+    error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+    printf ("after ex_put_prop_array, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    /* Add nodeset attributes */
+    error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1);
+    printf ("after ex_put_attr_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    {
+      attrib_names[0] = "Nodeset_attribute";
+      error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+    }
+
+    /* write individual side sets */
+    num_face_in_sset[0] =  2;
+    num_face_in_sset[1] =  2;
+    num_face_in_sset[2] =  7;
+    num_face_in_sset[3] =  8;
+    num_face_in_sset[4] = 10;
+   
+    ssids[0] = 30;
+    ssids[1] = 31;
+    ssids[2] = 32;
+    ssids[3] = 33;
+    ssids[4] = 34;
+
+    /* side set #1  - quad */
+
+    error = ex_put_side_set_param (exoid, ssids[0], 2, 4);
+    printf ("after ex_put_side_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    elem_list[0] = 2; elem_list[1] = 2;
+
+    side_list[0] = 4; side_list[1] = 2;
+
+    dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+    dist_fact[3] = 30.3;
+
+    error = ex_put_side_set (exoid, 30, elem_list, side_list);
+    printf ("after ex_put_side_set, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+    printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* side set #2  - quad, spanning 2 elements  */
+
+    error = ex_put_side_set_param (exoid, 31, 2, 4);
+    printf ("after ex_put_side_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    elem_list[0] = 1; elem_list[1] = 2;
+
+    side_list[0] = 2; side_list[1] = 3;
+
+    dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+    dist_fact[3] = 31.3;
+
+    error = ex_put_side_set (exoid, 31, elem_list, side_list);
+    printf ("after ex_put_side_set, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+    printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* side set #3  - hex */
+
+    error = ex_put_side_set_param (exoid, 32, 7, 0);
+    printf ("after ex_put_side_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    elem_list[0] = 3; elem_list[1] = 3;
+    elem_list[2] = 3; elem_list[3] = 3;
+    elem_list[4] = 3; elem_list[5] = 3;
+    elem_list[6] = 3;
+
+    side_list[0] = 5; side_list[1] = 3;
+    side_list[2] = 3; side_list[3] = 2;
+    side_list[4] = 4; side_list[5] = 1;
+    side_list[6] = 6;
+
+    error = ex_put_side_set (exoid, 32, elem_list, side_list);
+    printf ("after ex_put_side_set, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* side set #4  - tetras */
+
+    error = ex_put_side_set_param (exoid, 33, 8, 0);
+    printf ("after ex_put_side_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    elem_list[0] = 4; elem_list[1] = 4;
+    elem_list[2] = 4; elem_list[3] = 4;
+    elem_list[4] = 6; elem_list[5] = 6;
+    elem_list[6] = 6; elem_list[7] = 6;
+
+    side_list[0] = 1; side_list[1] = 2;
+    side_list[2] = 3; side_list[3] = 4;
+    side_list[4] = 1; side_list[5] = 2;
+    side_list[6] = 3; side_list[7] = 4;
+
+    error = ex_put_side_set (exoid, 33, elem_list, side_list);
+    printf ("after ex_put_side_set, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* side set #5  - wedges and tris */
+
+    error = ex_put_side_set_param (exoid, 34, 10, 0);
+    printf ("after ex_put_side_set_param, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    elem_list[0] = 5; elem_list[1] = 5;
+    elem_list[2] = 5; elem_list[3] = 5;
+    elem_list[4] = 5; elem_list[5] = 7;
+    elem_list[6] = 7; elem_list[7] = 7;
+    elem_list[8] = 7; elem_list[9] = 7;
+
+    side_list[0] = 1; side_list[1] = 2;
+    side_list[2] = 3; side_list[3] = 4;
+    side_list[4] = 5; side_list[5] = 1;
+    side_list[6] = 2; side_list[7] = 3;
+    side_list[8] = 4; side_list[9] = 5;
+
+    error = ex_put_side_set (exoid, 34, elem_list, side_list);
+    printf ("after ex_put_side_set, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    /* Write side set names */
+    sset_names[0] = "sset_1";
+    sset_names[1] = "sset_2";
+    sset_names[2] = "sset_3";
+    sset_names[3] = "sset_4";
+    sset_names[4] = "sset_5";
+
+    error = ex_put_names(exoid, EX_SIDE_SET, sset_names);
+    printf ("after ex_put_names, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+   
+    error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+    printf ("after ex_put_prop, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+    printf ("after ex_put_prop, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* write QA records; test empty and just blank-filled records */
+
+    num_qa_rec = 2;
+
+
+    qa_record[0][0] = "TESTWT";
+    qa_record[0][1] = "testwt";
+    qa_record[0][2] = "07/07/93";
+    qa_record[0][3] = "15:41:33";
+    qa_record[1][0] = "";
+    qa_record[1][1] = "                            ";
+    qa_record[1][2] = "";
+    qa_record[1][3] = "                        ";
+
+    error = ex_put_qa (exoid, num_qa_rec, qa_record);
+    printf ("after ex_put_qa, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    /* write information records; test empty and just blank-filled records */
+
+    num_info = 3;
+
+
+    info[0] = "This is the first information record.";
+    info[1] = "";
+    info[2] = "                                     ";
+
+    error = ex_put_info (exoid, num_info, info);
+    printf ("after ex_put_info, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+
+    /* write results variables parameters and names */
+
+    num_glo_vars = 1;
+
+    var_names[0] = "glo_vars";
+
+    error = ex_put_var_param (exoid, "g", num_glo_vars);
+    printf ("after ex_put_var_param, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+    printf ("after ex_put_var_names, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+
+    num_nod_vars = 2;
+    /*              12345678901234567890123456789012 */
+    var_names[0] = "node_variable_a_very_long_name_0";
+    var_names[1] = "nod_var1";
+
+    error = ex_put_var_param (exoid, "n", num_nod_vars);
+    printf ("after ex_put_var_param, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+    printf ("after ex_put_var_names, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+
+    num_ele_vars = 3;
+    /*              0        1         2         3   */
+    /*              12345678901234567890123456789012 */
+    var_names[0] = "this_variable_name_is_short";
+    var_names[1] = "this_variable_name_is_just_right";
+    var_names[2] = "this_variable_name_is_tooooo_long";
+
+    error = ex_put_var_param (exoid, "e", num_ele_vars);
+    printf ("after ex_put_var_param, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+    printf ("after ex_put_var_names, error = %d\n", error);
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    {
+      num_nset_vars = 3;
+     
+      var_names[0] = "ns_var0";
+      var_names[1] = "ns_var1";
+      var_names[2] = "ns_var2";
+     
+      error = ex_put_var_param (exoid, "m", num_nset_vars);
+      printf ("after ex_put_var_param, error = %d\n", error);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+     
+      error = ex_put_var_names (exoid, "m", num_nset_vars, var_names);
+      printf ("after ex_put_var_names, error = %d\n", error);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+    }
+   
+    {
+      num_sset_vars = 3;
+
+      var_names[0] = "ss_var0";
+      var_names[1] = "ss_var1";
+      var_names[2] = "ss_var2";
+     
+      error = ex_put_var_param (exoid, "s", num_sset_vars);
+      printf ("after ex_put_var_param, error = %d\n", error);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+     
+      error = ex_put_var_names (exoid, "s", num_sset_vars, var_names);
+      printf ("after ex_put_var_names, error = %d\n", error);
+      if (error) {
+	ex_close (rootid);
+	exit(-1);
+      }
+    }
+
+
+
+    /* write element variable truth table */
+
+    truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+    k = 0;
+    for (i=0; i<num_elem_blk; i++)
+      {
+	for (j=0; j<num_ele_vars; j++)
+	  {
+	    truth_tab[k++] = 1;
+	  }
+      }
+
+    error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+    printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+    if (error) {
+      ex_close (rootid);
+      exit(-1);
+    }
+
+    free (truth_tab);
+
+
+    /* for each time step, write the analysis results;
+     * the code below fills the arrays glob_var_vals, 
+     * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+     * obviously the analysis code will populate these arrays
+     */
+
+    whole_time_step = 1;
+    num_time_steps = 10;
+
+    glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+    nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+    elem_var_vals = (float *) calloc (4, CPU_word_size);
+    sset_var_vals = (float *) calloc (10, CPU_word_size);
+    nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+    for (i=0; i<num_time_steps; i++)
+      {
+	time_value = (float)(i+1)/100.;
+
+	/* write time value */
+
+	error = ex_put_time (exoid, whole_time_step, &time_value);
+	printf ("after ex_put_time, error = %d\n", error);
+
+	if (error) {
+	  ex_close (rootid);
+	  exit(-1);
+	}
+
+	/* write global variables */
+
+	for (j=0; j<num_glo_vars; j++)
+	  {
+	    glob_var_vals[j] = (float)(j+2) * time_value;
+	  }
+
+	error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+				  glob_var_vals);
+	printf ("after ex_put_glob_vars, error = %d\n", error);
+
+	if (error) {
+	  ex_close (rootid);
+	  exit(-1);
+	}
+
+	/* write nodal variables */
+
+	for (k=1; k<=num_nod_vars; k++)
+	  {
+	    for (j=0; j<num_nodes; j++)
+	      {
+		nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+	      }
+
+	    error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+				      nodal_var_vals);
+	    printf ("after ex_put_nodal_var, error = %d\n", error);
+	    if (error) {
+	      ex_close (rootid);
+	      exit(-1);
+	    }
+
+	  }
+
+	/* write element variables */
+
+	for (k=1; k<=num_ele_vars; k++)
+	  {
+	    for (j=0; j<num_elem_blk; j++)
+	      {
+		for (m=0; m<num_elem_in_block[j]; m++)
+		  {
+		    elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+		      ((float)(m+1)*time_value);
+		    /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+		  }
+		error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+					 num_elem_in_block[j], elem_var_vals);
+		printf ("after ex_put_elem_var, error = %d\n", error);
+		if (error) {
+		  ex_close (rootid);
+		  exit(-1);
+		}
+	      }
+	  }
+
+	/* write sideset variables */
+
+	for (k=1; k<=num_sset_vars; k++)
+	  {
+	    for (j=0; j<num_side_sets; j++)
+	      {
+		for (m=0; m<num_face_in_sset[j]; m++)
+		  {
+		    sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+		      ((float)(m+1)*time_value);
+		    /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+		  }
+		error = ex_put_sset_var (exoid, whole_time_step, k, ssids[j],
+					 num_face_in_sset[j], sset_var_vals);
+		printf ("after ex_put_sset_var, error = %d\n", error);
+		if (error) {
+		  ex_close (rootid);
+		  exit(-1);
+		}
+	      }
+	  }
+
+	/* write nodeset variables */
+
+	for (k=1; k<=num_nset_vars; k++)
+	  {
+	    for (j=0; j<num_node_sets; j++)
+	      {
+		for (m=0; m<num_nodes_in_nset[j]; m++)
+		  {
+		    nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+		      ((float)(m+1)*time_value);
+		    /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+		  }
+		error = ex_put_nset_var (exoid, whole_time_step, k, nsids[j],
+					 num_nodes_in_nset[j], nset_var_vals);
+		printf ("after ex_put_nset_var, error = %d\n", error);
+		if (error) {
+		  ex_close (rootid);
+		  exit(-1);
+		}
+	      }
+	  }
+
+	whole_time_step++;
+
+	/* update the data file; this should be done at the end of every time step
+	 * to ensure that no data is lost if the analysis dies
+	 */
+	error = ex_update (exoid);
+	printf ("after ex_update, error = %d\n", error);
+	if (error) {
+	  ex_close (rootid);
+	  exit(-1);
+	}
+      }
+    free(glob_var_vals);
+    free(nodal_var_vals);
+    free(elem_var_vals);
+    free(sset_var_vals);
+    free(nset_var_vals);
+
+  }
+  /* close the EXODUS files
+   */
+  error = ex_close (rootid);
+  printf ("after ex_close, error = %d\n", error);
+  if (error) {
+    exit(-1);
+  }
+  return 0;
+}
diff --git a/exodus/cbind/test/testwt-long-name.c b/exodus/cbind/test/testwt-long-name.c
new file mode 100644
index 0000000..d043868
--- /dev/null
+++ b/exodus/cbind/test/testwt-long-name.c
@@ -0,0 +1,1216 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+/* #include "netcdf.h" */
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_face_in_sset[10], num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ssids[10], nsids[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *sset_var_vals, *nset_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float attrib[1], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *variable_names[3];
+   char *block_names[10], *nset_names[10], *sset_names[10];
+   char *prop_names[2], *attrib_names[2];
+   char *title = "This is a test";
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   ex_set_option(exoid, EX_OPT_MAX_NAME_LENGTH, 127); /* Using long names */
+
+   /* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 7;
+   num_elem_blk = 7;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   
+   error = ex_put_init (exoid, title, num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* 3d Tri */
+   x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+   x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+   x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   /*                0        1         2         3         4         5         6     */
+   /*                1234567890123456789012345678901234567890123456789012345678901234 */
+   coord_names[0] = "X coordinate name that is padded to be longer than 32 characters";
+   coord_names[1] = "Y coordinate name that is padded to be longer than 32 characters";
+   coord_names[2] = "Z coordinate name that is padded to be longer than 32 characters";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodal attributes */
+   error = ex_put_attr_param(exoid, EX_NODAL, 0, 2);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 1, x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 2, y);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Node_attr_1";
+     attrib_names[1] = "Node_attr_2";
+     error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (elem_map);
+
+
+/* write element block parameters */
+
+   /*                0        1         2         3         4         5         6     */
+   /*                1234567890123456789012345678901234567890123456789012345678901234 */
+   block_names[0] = "Very long name for block_1 that exceeds 32 characters";
+   block_names[1] = "Very long name for block_2 that exceeds 32 characters";
+   block_names[2] = "Very long name for block_3 that exceeds 32 characters";
+   block_names[3] = "Very long name for block_4 that exceeds 32 characters";
+   block_names[4] = "Very long name for block_5 that exceeds 32 characters";
+   block_names[5] = "Very long name for block_6 that exceeds 32 characters";
+   block_names[6] = "Very long name for block_7 that exceeds 32 characters";
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+   num_elem_in_block[5] = 1;
+   num_elem_in_block[6] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */
+   num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */
+   num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris   */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+   ebids[5] = 15;
+   ebids[6] = 16;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5],
+                               num_nodes_per_elem[5], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[6], "tri", num_elem_in_block[6],
+                               num_nodes_per_elem[6], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write element block names */
+   error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+/* write element block properties */
+
+   /*               0        1         2         3         4         5         6     */
+   /*               1234567890123456789012345678901234567890123456789012345678901234 */
+   prop_names[0] = "MATERIAL_PROPERTY_LONG_NAME_32CH";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], prop_names[0], 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], prop_names[0], 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], prop_names[0], 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], prop_names[0], 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], prop_names[0], 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], prop_names[0], 60);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], prop_names[0], 70);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+   connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+   error = ex_put_elem_conn (exoid, ebids[5], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 31; connect[1] = 32; connect[2] = 33;
+
+   error = ex_put_elem_conn (exoid, ebids[6], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[5], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[6], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /*                 0        1         2         3         4         5         6     */
+   /*                 1234567890123456789012345678901234567890123456789012345678901234 */
+   attrib_names[0] = "The name for the attribute representing the shell thickness";
+   for (i=0; i < 7; i++) {
+     error = ex_put_elem_attr_names (exoid, ebids[i], attrib_names);
+     printf ("after ex_put_elem_attr_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual node sets */
+
+
+   num_nodes_in_nset[0] = 5;
+   num_nodes_in_nset[1] = 3;
+
+   nsids[0] = 20;
+   nsids[1] = 21;
+
+   error = ex_put_node_set_param (exoid, nsids[0], 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, nsids[0], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_node_set_param (exoid, nsids[1], 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, nsids[1], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write node set names */
+   nset_names[0] = "nset_1";
+   nset_names[1] = "nset_2";
+
+   error = ex_put_names(exoid, EX_NODE_SET, nset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodeset attributes */
+   error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Nodeset_attribute";
+     error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual side sets */
+   num_face_in_sset[0] =  2;
+   num_face_in_sset[1] =  2;
+   num_face_in_sset[2] =  7;
+   num_face_in_sset[3] =  8;
+   num_face_in_sset[4] = 10;
+   
+   ssids[0] = 30;
+   ssids[1] = 31;
+   ssids[2] = 32;
+   ssids[3] = 33;
+   ssids[4] = 34;
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, ssids[0], 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 8, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+   elem_list[4] = 6; elem_list[5] = 6;
+   elem_list[6] = 6; elem_list[7] = 6;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 1; side_list[5] = 2;
+   side_list[6] = 3; side_list[7] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #5  - wedges and tris */
+
+   error = ex_put_side_set_param (exoid, 34, 10, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5; elem_list[5] = 7;
+   elem_list[6] = 7; elem_list[7] = 7;
+   elem_list[8] = 7; elem_list[9] = 7;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5; side_list[5] = 1;
+   side_list[6] = 2; side_list[7] = 3;
+   side_list[8] = 4; side_list[9] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write side set names */
+   sset_names[0] = "sset_1";
+   sset_names[1] = "sset_2";
+   sset_names[2] = "sset_3";
+   sset_names[3] = "sset_4";
+   sset_names[4] = "sset_5";
+
+   error = ex_put_names(exoid, EX_SIDE_SET, sset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   variable_names[0] = "glo_vars";
+
+   error = ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars);
+   printf ("after ex_put_variable_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_variable_names (exoid, EX_GLOBAL, num_glo_vars, variable_names);
+   printf ("after ex_put_variable_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              0        1         2         3         4         5         6     */
+   /*              1234567890123456789012345678901234567890123456789012345678901234 */
+   variable_names[0] = "node_variable_a_somewhat_long_name_0";
+   variable_names[1] = "node_variable_a_much_longer_name_that_is_not_too_long_name";
+
+   error = ex_put_variable_param (exoid, EX_NODAL, num_nod_vars);
+   printf ("after ex_put_variable_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, variable_names);
+   printf ("after ex_put_variable_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 3;
+
+   /*              0        1         2         3         4         5         6     */
+   /*              1234567890123456789012345678901234567890123456789012345678901234 */
+   variable_names[0] = "the_stress_on_the_elements_in_this_block_that_are_active_now";
+   variable_names[1] = "ele_var1";
+   variable_names[2] = "ele_var2";
+
+   error = ex_put_variable_param (exoid, EX_ELEM_BLOCK, num_ele_vars);
+   printf ("after ex_put_variable_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_variable_names (exoid, EX_ELEM_BLOCK, num_ele_vars, variable_names);
+   printf ("after ex_put_variable_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   {
+     num_nset_vars = 3;
+     
+     variable_names[0] = "ns_var0";
+     variable_names[1] = "ns_var1";
+     variable_names[2] = "ns_var2";
+     
+     error = ex_put_variable_param (exoid, EX_NODE_SET, num_nset_vars);
+     printf ("after ex_put_variable_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_variable_names (exoid, EX_NODE_SET, num_nset_vars, variable_names);
+     printf ("after ex_put_variable_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     num_sset_vars = 3;
+
+     variable_names[0] = "ss_var0";
+     variable_names[1] = "ss_var1";
+     variable_names[2] = "ss_var2";
+     
+     error = ex_put_variable_param (exoid, EX_SIDE_SET, num_sset_vars);
+     printf ("after ex_put_variable_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_variable_names (exoid, EX_SIDE_SET, num_sset_vars, variable_names);
+     printf ("after ex_put_variable_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+   sset_var_vals = (float *) calloc (10, CPU_word_size);
+   nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write sideset variables */
+
+     for (k=1; k<=num_sset_vars; k++)
+     {
+       for (j=0; j<num_side_sets; j++)
+       {
+         for (m=0; m<num_face_in_sset[j]; m++)
+         {
+           sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+                              ((float)(m+1)*time_value);
+           /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+         }
+         error = ex_put_sset_var (exoid, whole_time_step, k, ssids[j],
+                                  num_face_in_sset[j], sset_var_vals);
+         printf ("after ex_put_sset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write nodeset variables */
+
+     for (k=1; k<=num_nset_vars; k++)
+     {
+       for (j=0; j<num_node_sets; j++)
+       {
+         for (m=0; m<num_nodes_in_nset[j]; m++)
+         {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+                              ((float)(m+1)*time_value);
+           /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+         }
+         error = ex_put_nset_var (exoid, whole_time_step, k, nsids[j],
+                                  num_nodes_in_nset[j], nset_var_vals);
+         printf ("after ex_put_nset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   free(sset_var_vals);
+   free(nset_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-long-name.dmp b/exodus/cbind/test/testwt-long-name.dmp
new file mode 100644
index 0000000..ebf00e3
--- /dev/null
+++ b/exodus/cbind/test/testwt-long-name.dmp
@@ -0,0 +1,1025 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 128 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 3 ;
+	num_att_in_blk7 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+	num_nset_var = 3 ;
+	num_sset_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "tri" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATERIAL_PROPERTY_LONG_NAME_32CH" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	float nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	char name_nset_var(num_nset_var, len_name) ;
+	char name_sset_var(num_sset_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var1eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var2eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var3eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var1eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var2eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var3eb7(time_step, num_el_in_blk7) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+	float vals_sset_var1ss1(time_step, num_side_ss1) ;
+	float vals_sset_var1ss2(time_step, num_side_ss2) ;
+	float vals_sset_var1ss3(time_step, num_side_ss3) ;
+	float vals_sset_var1ss4(time_step, num_side_ss4) ;
+	float vals_sset_var1ss5(time_step, num_side_ss5) ;
+	float vals_sset_var2ss1(time_step, num_side_ss1) ;
+	float vals_sset_var2ss2(time_step, num_side_ss2) ;
+	float vals_sset_var2ss3(time_step, num_side_ss3) ;
+	float vals_sset_var2ss4(time_step, num_side_ss4) ;
+	float vals_sset_var2ss5(time_step, num_side_ss5) ;
+	float vals_sset_var3ss1(time_step, num_side_ss1) ;
+	float vals_sset_var3ss2(time_step, num_side_ss2) ;
+	float vals_sset_var3ss3(time_step, num_side_ss3) ;
+	float vals_sset_var3ss4(time_step, num_side_ss4) ;
+	float vals_sset_var3ss5(time_step, num_side_ss5) ;
+	float vals_nset_var1ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var1ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var2ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var2ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var3ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var3ns2(time_step, num_nod_ns2) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 64 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "Very long name for block_1 that exceeds 32 characters",
+  "Very long name for block_2 that exceeds 32 characters",
+  "Very long name for block_3 that exceeds 32 characters",
+  "Very long name for block_4 that exceeds 32 characters",
+  "Very long name for block_5 that exceeds 32 characters",
+  "Very long name for block_6 that exceeds 32 characters",
+  "Very long name for block_7 that exceeds 32 characters" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "X coordinate name that is padded to be longer than 32 characters",
+  "Y coordinate name that is padded to be longer than 32 characters",
+  "Z coordinate name that is padded to be longer than 32 characters" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  6.1416 ;
+
+ attrib_name6 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  6.1416 ;
+
+ attrib_name7 =
+  "The name for the attribute representing the shell thickness" ;
+
+ connect7 =
+  31, 32, 33 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56, 1.58, 1.6, 1.62, 1.64, 1.66,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84, 1.87, 1.9, 1.93, 1.96, 1.99,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68, 2.74, 2.8, 2.86, 2.92, 2.98,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96, 3.03, 3.1, 3.17, 3.24, 3.31,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24, 3.32, 3.4, 3.48, 3.56, 3.64,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52, 3.61, 3.7, 3.79, 3.88, 3.97,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
+    4.1, 4.2, 4.3 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56, 2.58, 2.6, 2.62, 2.64, 2.66,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12, 3.16, 3.2, 3.24, 3.28, 3.32,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68, 3.74, 3.8, 3.86, 3.92, 3.98,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96, 4.03, 4.1, 4.17, 4.24, 4.31,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24, 4.32, 4.4, 4.48, 4.56, 4.64,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52, 4.61, 4.7, 4.79, 4.88, 4.97,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 
+    5.1, 5.2, 5.3 ;
+
+ name_nod_var =
+  "node_variable_a_somewhat_long_name_0",
+  "node_variable_a_much_longer_name_that_is_not_too_long_name" ;
+
+ name_elem_var =
+  "the_stress_on_the_elements_in_this_block_that_are_active_now",
+  "ele_var1",
+  "ele_var2" ;
+
+ name_nset_var =
+  "ns_var0",
+  "ns_var1",
+  "ns_var2" ;
+
+ name_sset_var =
+  "ss_var0",
+  "ss_var1",
+  "ss_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var1eb6 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var2eb6 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var3eb6 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var1eb7 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb7 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb7 =
+  12.01,
+  12.02,
+  12.03,
+  12.04,
+  12.05,
+  12.06,
+  12.07,
+  12.08,
+  12.09,
+  12.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+
+ vals_sset_var1ss1 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_sset_var1ss2 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_sset_var1ss3 =
+  8.01, 8.02, 8.03, 8.04, 8.05, 8.06, 8.07,
+  8.02, 8.04, 8.06, 8.08, 8.1, 8.12, 8.14,
+  8.03, 8.06, 8.09, 8.12, 8.15, 8.18, 8.21,
+  8.04, 8.08, 8.12, 8.16, 8.2, 8.24, 8.28,
+  8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35,
+  8.06, 8.12, 8.18, 8.24, 8.3, 8.36, 8.42,
+  8.07, 8.14, 8.21, 8.28, 8.35, 8.42, 8.49,
+  8.08, 8.16, 8.24, 8.32, 8.4, 8.48, 8.56,
+  8.09, 8.18, 8.27, 8.36, 8.45, 8.54, 8.63,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7 ;
+
+ vals_sset_var1ss4 =
+  9.01, 9.02, 9.03, 9.04, 9.05, 9.06, 9.07, 9.08,
+  9.02, 9.04, 9.06, 9.08, 9.1, 9.12, 9.14, 9.16,
+  9.03, 9.06, 9.09, 9.12, 9.15, 9.18, 9.21, 9.24,
+  9.04, 9.08, 9.12, 9.16, 9.2, 9.24, 9.28, 9.32,
+  9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35, 9.4,
+  9.06, 9.12, 9.18, 9.24, 9.3, 9.36, 9.42, 9.48,
+  9.07, 9.14, 9.21, 9.28, 9.35, 9.42, 9.49, 9.56,
+  9.08, 9.16, 9.24, 9.32, 9.4, 9.48, 9.56, 9.64,
+  9.09, 9.18, 9.27, 9.36, 9.45, 9.54, 9.63, 9.72,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8 ;
+
+ vals_sset_var1ss5 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08, 10.09, 10.1,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16, 10.18, 10.2,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24, 10.27, 10.3,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32, 10.36, 10.4,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48, 10.54, 10.6,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56, 10.63, 10.7,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72, 10.81, 10.9,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11 ;
+
+ vals_sset_var2ss1 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_sset_var2ss2 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var2ss3 =
+  9.01, 9.02, 9.03, 9.04, 9.05, 9.06, 9.07,
+  9.02, 9.04, 9.06, 9.08, 9.1, 9.12, 9.14,
+  9.03, 9.06, 9.09, 9.12, 9.15, 9.18, 9.21,
+  9.04, 9.08, 9.12, 9.16, 9.2, 9.24, 9.28,
+  9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35,
+  9.06, 9.12, 9.18, 9.24, 9.3, 9.36, 9.42,
+  9.07, 9.14, 9.21, 9.28, 9.35, 9.42, 9.49,
+  9.08, 9.16, 9.24, 9.32, 9.4, 9.48, 9.56,
+  9.09, 9.18, 9.27, 9.36, 9.45, 9.54, 9.63,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7 ;
+
+ vals_sset_var2ss4 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8 ;
+
+ vals_sset_var2ss5 =
+  11.01, 11.02, 11.03, 11.04, 11.05, 11.06, 11.07, 11.08, 11.09, 11.1,
+  11.02, 11.04, 11.06, 11.08, 11.1, 11.12, 11.14, 11.16, 11.18, 11.2,
+  11.03, 11.06, 11.09, 11.12, 11.15, 11.18, 11.21, 11.24, 11.27, 11.3,
+  11.04, 11.08, 11.12, 11.16, 11.2, 11.24, 11.28, 11.32, 11.36, 11.4,
+  11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4, 11.45, 11.5,
+  11.06, 11.12, 11.18, 11.24, 11.3, 11.36, 11.42, 11.48, 11.54, 11.6,
+  11.07, 11.14, 11.21, 11.28, 11.35, 11.42, 11.49, 11.56, 11.63, 11.7,
+  11.08, 11.16, 11.24, 11.32, 11.4, 11.48, 11.56, 11.64, 11.72, 11.8,
+  11.09, 11.18, 11.27, 11.36, 11.45, 11.54, 11.63, 11.72, 11.81, 11.9,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12 ;
+
+ vals_sset_var3ss1 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var3ss2 =
+  9.01, 9.02,
+  9.02, 9.04,
+  9.03, 9.06,
+  9.04, 9.08,
+  9.05, 9.1,
+  9.06, 9.12,
+  9.07, 9.14,
+  9.08, 9.16,
+  9.09, 9.18,
+  9.1, 9.2 ;
+
+ vals_sset_var3ss3 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7 ;
+
+ vals_sset_var3ss4 =
+  11.01, 11.02, 11.03, 11.04, 11.05, 11.06, 11.07, 11.08,
+  11.02, 11.04, 11.06, 11.08, 11.1, 11.12, 11.14, 11.16,
+  11.03, 11.06, 11.09, 11.12, 11.15, 11.18, 11.21, 11.24,
+  11.04, 11.08, 11.12, 11.16, 11.2, 11.24, 11.28, 11.32,
+  11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4,
+  11.06, 11.12, 11.18, 11.24, 11.3, 11.36, 11.42, 11.48,
+  11.07, 11.14, 11.21, 11.28, 11.35, 11.42, 11.49, 11.56,
+  11.08, 11.16, 11.24, 11.32, 11.4, 11.48, 11.56, 11.64,
+  11.09, 11.18, 11.27, 11.36, 11.45, 11.54, 11.63, 11.72,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8 ;
+
+ vals_sset_var3ss5 =
+  12.01, 12.02, 12.03, 12.04, 12.05, 12.06, 12.07, 12.08, 12.09, 12.1,
+  12.02, 12.04, 12.06, 12.08, 12.1, 12.12, 12.14, 12.16, 12.18, 12.2,
+  12.03, 12.06, 12.09, 12.12, 12.15, 12.18, 12.21, 12.24, 12.27, 12.3,
+  12.04, 12.08, 12.12, 12.16, 12.2, 12.24, 12.28, 12.32, 12.36, 12.4,
+  12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5,
+  12.06, 12.12, 12.18, 12.24, 12.3, 12.36, 12.42, 12.48, 12.54, 12.6,
+  12.07, 12.14, 12.21, 12.28, 12.35, 12.42, 12.49, 12.56, 12.63, 12.7,
+  12.08, 12.16, 12.24, 12.32, 12.4, 12.48, 12.56, 12.64, 12.72, 12.8,
+  12.09, 12.18, 12.27, 12.36, 12.45, 12.54, 12.63, 12.72, 12.81, 12.9,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13 ;
+
+ vals_nset_var1ns1 =
+  8.01, 8.02, 8.03, 8.04, 8.05,
+  8.02, 8.04, 8.06, 8.08, 8.1,
+  8.03, 8.06, 8.09, 8.12, 8.15,
+  8.04, 8.08, 8.12, 8.16, 8.2,
+  8.05, 8.1, 8.15, 8.2, 8.25,
+  8.06, 8.12, 8.18, 8.24, 8.3,
+  8.07, 8.14, 8.21, 8.28, 8.35,
+  8.08, 8.16, 8.24, 8.32, 8.4,
+  8.09, 8.18, 8.27, 8.36, 8.45,
+  8.1, 8.2, 8.3, 8.4, 8.5 ;
+
+ vals_nset_var1ns2 =
+  9.01, 9.02, 9.03,
+  9.02, 9.04, 9.06,
+  9.03, 9.06, 9.09,
+  9.04, 9.08, 9.12,
+  9.05, 9.1, 9.15,
+  9.06, 9.12, 9.18,
+  9.07, 9.14, 9.21,
+  9.08, 9.16, 9.24,
+  9.09, 9.18, 9.27,
+  9.1, 9.2, 9.3 ;
+
+ vals_nset_var2ns1 =
+  9.01, 9.02, 9.03, 9.04, 9.05,
+  9.02, 9.04, 9.06, 9.08, 9.1,
+  9.03, 9.06, 9.09, 9.12, 9.15,
+  9.04, 9.08, 9.12, 9.16, 9.2,
+  9.05, 9.1, 9.15, 9.2, 9.25,
+  9.06, 9.12, 9.18, 9.24, 9.3,
+  9.07, 9.14, 9.21, 9.28, 9.35,
+  9.08, 9.16, 9.24, 9.32, 9.4,
+  9.09, 9.18, 9.27, 9.36, 9.45,
+  9.1, 9.2, 9.3, 9.4, 9.5 ;
+
+ vals_nset_var2ns2 =
+  10.01, 10.02, 10.03,
+  10.02, 10.04, 10.06,
+  10.03, 10.06, 10.09,
+  10.04, 10.08, 10.12,
+  10.05, 10.1, 10.15,
+  10.06, 10.12, 10.18,
+  10.07, 10.14, 10.21,
+  10.08, 10.16, 10.24,
+  10.09, 10.18, 10.27,
+  10.1, 10.2, 10.3 ;
+
+ vals_nset_var3ns1 =
+  10.01, 10.02, 10.03, 10.04, 10.05,
+  10.02, 10.04, 10.06, 10.08, 10.1,
+  10.03, 10.06, 10.09, 10.12, 10.15,
+  10.04, 10.08, 10.12, 10.16, 10.2,
+  10.05, 10.1, 10.15, 10.2, 10.25,
+  10.06, 10.12, 10.18, 10.24, 10.3,
+  10.07, 10.14, 10.21, 10.28, 10.35,
+  10.08, 10.16, 10.24, 10.32, 10.4,
+  10.09, 10.18, 10.27, 10.36, 10.45,
+  10.1, 10.2, 10.3, 10.4, 10.5 ;
+
+ vals_nset_var3ns2 =
+  11.01, 11.02, 11.03,
+  11.02, 11.04, 11.06,
+  11.03, 11.06, 11.09,
+  11.04, 11.08, 11.12,
+  11.05, 11.1, 11.15,
+  11.06, 11.12, 11.18,
+  11.07, 11.14, 11.21,
+  11.08, 11.16, 11.24,
+  11.09, 11.18, 11.27,
+  11.1, 11.2, 11.3 ;
+}
diff --git a/exodus/cbind/test/testwt-nface-nside.c b/exodus/cbind/test/testwt-nface-nside.c
new file mode 100644
index 0000000..f015808
--- /dev/null
+++ b/exodus/cbind/test/testwt-nface-nside.c
@@ -0,0 +1,560 @@
+/*
+ * Copyright (c) 2010 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file (testwt-nfaced.exo)
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_total_nodes_per_blk[10];
+   int num_face_in_block[10], num_total_faces_per_blk[10];
+   int num_face_in_sset[10], num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int bids[10], ssids[10], nsids[10], nnpe[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *sset_var_vals, *nset_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *block_names[10], *nset_names[10], *sset_names[10];
+   char *prop_names[2], *attrib_names[2];
+   char *title = "This is a test";
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test-nfaced.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+   /* initialize file with parameters */
+   {
+     ex_init_params par;
+     
+     num_dim = 3;
+     num_nodes = 14;
+     num_elem = 1;
+     num_elem_blk = 1;
+     num_node_sets = 0;
+
+     strcpy( par.title, title );
+     par.num_dim = num_dim;
+     par.num_nodes = num_nodes;
+     par.num_edge = 0;
+     par.num_edge_blk = 0;
+     par.num_face = 5;
+     par.num_face_blk = 1;
+     par.num_elem = num_elem;
+     par.num_elem_blk = num_elem_blk;
+     par.num_node_sets = num_node_sets;
+     par.num_edge_sets = 0;
+     par.num_face_sets = 0;
+     par.num_side_sets = 0;
+     par.num_elem_sets = 0;
+     par.num_node_maps = 0;
+     par.num_edge_maps = 0;
+     par.num_face_maps = 0;
+     par.num_elem_maps = 0;
+     
+     error = ex_put_init_ext (exoid, &par);
+     
+     printf ("after ex_put_init_ext, error = %d\n", error);
+     
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write nodal coordinates values and names to database */
+   x[ 0] =  0.00000e+00 ;    y[ 0] = 0.00000e+00 ;   z[ 0] =  0.00000e+00 ;
+   x[ 1] =  2.00000e+00 ;    y[ 1] = 0.00000e+00 ;   z[ 1] =  0.00000e+00 ;
+   x[ 2] =  0.00000e+00 ;    y[ 2] = 2.00000e+00 ;   z[ 2] =  0.00000e+00 ;
+   x[ 3] =  2.00000e+00 ;    y[ 3] = 2.00000e+00 ;   z[ 3] =  0.00000e+00 ;
+   x[ 4] =  0.00000e+00 ;    y[ 4] = 0.00000e+00 ;   z[ 4] =  2.00000e+00 ;
+   x[ 5] =  2.00000e+00 ;    y[ 5] = 0.00000e+00 ;   z[ 5] =  2.00000e+00 ;
+   x[ 6] =  0.00000e+00 ;    y[ 6] = 2.00000e+00 ;   z[ 6] =  2.00000e+00 ;
+   x[ 7] =  2.00000e+00 ;    y[ 7] = 2.00000e+00 ;   z[ 7] =  2.00000e+00 ;
+   x[ 8] =  0.00000e+00 ;    y[ 8] = 3.50000e+00 ;   z[ 8] =  1.00000e+00 ;
+   x[ 9] =  2.00000e+00 ;    y[ 9] = 3.50000e+00 ;   z[ 9] =  1.00000e+00 ;
+   x[10] =  0.00000e+00 ;    y[10] = 3.00000e+00 ;   z[10] =  1.50000e+00 ;
+   x[11] =  2.00000e+00 ;    y[11] = 3.00000e+00 ;   z[11] =  1.50000e+00 ;
+   x[12] =  0.00000e+00 ;    y[12] = 3.00000e+00 ;   z[12] =  0.50000e+00 ;
+   x[13] =  2.00000e+00 ;    y[13] = 3.00000e+00 ;   z[13] =  0.50000e+00 ;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "x";
+   coord_names[1] = "y";
+   coord_names[2] = "z";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write the face block parameters */
+   block_names[0] = "face_block_1";
+   num_face_in_block[0] = 15;
+   num_total_nodes_per_blk[0] = 54;
+   bids[0] = 10;
+
+   error = ex_put_block (exoid, EX_FACE_BLOCK, bids[0], "nsided",
+			 num_face_in_block[0],
+			 num_total_nodes_per_blk[0],
+			 0, 0, 0);
+   printf ("after ex_put_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   
+    
+   /* write face connectivity */
+
+   connect = (int *) calloc(num_total_nodes_per_blk[0], sizeof(int));
+
+   i = 0;
+   j = 0;
+
+   connect[i++] = 5;
+   connect[i++] = 6;
+   connect[i++] = 8; /* connectivity of face 1 of element 1 */
+
+
+   connect[i++] = 2;
+   connect[i++] = 1;
+   connect[i++] = 4; /* face 2 of element 1 */
+
+
+   connect[i++] = 6;
+   connect[i++] = 2;
+   connect[i++] = 4;
+   connect[i++] = 8; /* face 3 of element 1 */
+
+
+   connect[i++] = 8;
+   connect[i++] = 4;
+   connect[i++] = 1;
+   connect[i++] = 5; /* face 4 of element 1 */
+
+   connect[i++] = 1;
+   connect[i++] = 2;
+   connect[i++] = 6;
+   connect[i++] = 5; /*  face 5 of element 1 */
+
+   connect[i++] = 5;
+   connect[i++] = 8;
+   connect[i++] = 7; /* connectivity of face 1 of element 2 */
+
+   connect[i++] = 1; connect[i++] = 2; connect[i++] = 3; connect[i++] = 4;
+   nnpe[j++] = 4;
+
+   connect[i++] = 5; connect[i++] = 3; connect[i++] = 4; connect[i++] = 6;
+   nnpe[j++] = 4;
+
+   connect[i++] = 5; connect[i++] = 1; connect[i++] = 2; connect[i++] = 6;
+   nnpe[j++] = 4;
+
+   connect[i++] = 6; connect[i++] = 2; connect[i++] = 4;
+   nnpe[j++] = 3;
+
+   connect[i++] = 5; connect[i++] = 3; connect[i++] = 1;
+   nnpe[j++] = 3;
+
+   assert(i == num_total_nodes_per_blk[0]);
+   assert(j == num_face_in_block[0]);
+
+   error = ex_put_conn (exoid, EX_FACE_BLOCK, bids[0], connect, NULL, NULL);
+   printf ("after ex_put_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+   connect = NULL;
+
+   error = ex_put_entity_count_per_polyhedra(exoid, EX_FACE_BLOCK, bids[0], nnpe);
+   printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* write element block parameters */
+   block_names[0] = "nfaced_1";
+
+   num_elem_in_block[0] = 1;
+   num_total_nodes_per_blk[0] = 6;   /* Do we need this; does it make sense... */
+   num_total_faces_per_blk[0] = 5;
+
+   bids[0] = 10;
+
+   error = ex_put_block (exoid, EX_ELEM_BLOCK, bids[0], "nfaced",
+			 num_elem_in_block[0],
+			 0, 
+			 0,
+			 num_total_faces_per_blk[0],
+			 0);
+   printf ("after ex_put_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write face block names */
+   error = ex_put_names(exoid, EX_FACE_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   /* Write element block names */
+   error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   /* write element-face connectivity */
+   connect = (int *) calloc(num_total_faces_per_blk[0], sizeof(int));
+
+   i = 0;
+   j = 0;
+   connect[i++] = 1; connect[i++] = 2; connect[i++] = 3; connect[i++] = 4;
+   connect[i++] = 5;
+   nnpe[j++] = 5;  /* Number of faces per element */
+   
+   assert(i == num_total_faces_per_blk[0]);
+   assert(j == num_elem_in_block[0]);
+
+   error = ex_put_conn (exoid, EX_ELEM_BLOCK, bids[0], NULL, NULL, connect);
+   printf ("after ex_put_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+   error = ex_put_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, bids[0], nnpe);
+   printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* write QA records; test empty and just blank-filled records */
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT-NFACED";
+   qa_record[0][1] = "testwt-nfaced";
+   qa_record[0][2] = "2010/02/15";
+   qa_record[0][3] = "06:35:15";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* write information records; test empty and just blank-filled records */
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   /* write results variables parameters and names */
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "n";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* write element variable truth table */
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (8, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+     /* write time value */
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+     /* write global variables */
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+     /* write nodal variables */
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+
+     }
+
+     /* write element variables */
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, bids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+     
+     /* update the data file; this should be done at the end of every time step
+      * to ensure that no data is lost if the analysis dies
+      */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   
+   /* close the EXODUS files
+    */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-nfaced.c b/exodus/cbind/test/testwt-nfaced.c
new file mode 100644
index 0000000..e418e20
--- /dev/null
+++ b/exodus/cbind/test/testwt-nfaced.c
@@ -0,0 +1,429 @@
+/*
+ * Copyright (c) 2010 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file (testwt-nfaced.exo)
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_total_nodes_per_blk[10];
+   int num_face_in_block[10], num_total_faces_per_blk[10];
+   int num_node_sets, error;
+   int i, j, *connect;
+   int bids, nnpe[20];
+   int  num_qa_rec, num_info;
+   int CPU_word_size,IO_word_size;
+
+   float x[100], y[100], z[100];
+   char *coord_names[3], *qa_record[2][4], *info[3];
+   char *block_names[10];
+   char *title = "This is a test";
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test-nfaced.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+   /* initialize file with parameters */
+   {
+     ex_init_params par;
+     
+     num_dim = 3;
+     num_nodes = 14;
+     num_elem = 3;
+     num_elem_blk = 1;
+     num_node_sets = 0;
+
+     strcpy( par.title, title );
+     par.num_dim = num_dim;
+     par.num_nodes = num_nodes;
+     par.num_edge = 0;
+     par.num_edge_blk = 0;
+     par.num_face = 15;
+     par.num_face_blk = 1;
+     par.num_elem = num_elem;
+     par.num_elem_blk = num_elem_blk;
+     par.num_node_sets = num_node_sets;
+     par.num_edge_sets = 0;
+     par.num_face_sets = 0;
+     par.num_side_sets = 0;
+     par.num_elem_sets = 0;
+     par.num_node_maps = 0;
+     par.num_edge_maps = 0;
+     par.num_face_maps = 0;
+     par.num_elem_maps = 0;
+     
+     error = ex_put_init_ext (exoid, &par);
+     
+     printf ("after ex_put_init_ext, error = %d\n", error);
+     
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write nodal coordinates values and names to database */
+   x[ 0] =  0.00000e+00 ;    y[ 0] = 0.00000e+00 ;   z[ 0] =  0.00000e+00 ;
+   x[ 1] =  2.00000e+00 ;    y[ 1] = 0.00000e+00 ;   z[ 1] =  0.00000e+00 ;
+   x[ 2] =  0.00000e+00 ;    y[ 2] = 2.00000e+00 ;   z[ 2] =  0.00000e+00 ;
+   x[ 3] =  2.00000e+00 ;    y[ 3] = 2.00000e+00 ;   z[ 3] =  0.00000e+00 ;
+   x[ 4] =  0.00000e+00 ;    y[ 4] = 0.00000e+00 ;   z[ 4] =  2.00000e+00 ;
+   x[ 5] =  2.00000e+00 ;    y[ 5] = 0.00000e+00 ;   z[ 5] =  2.00000e+00 ;
+   x[ 6] =  0.00000e+00 ;    y[ 6] = 2.00000e+00 ;   z[ 6] =  2.00000e+00 ;
+   x[ 7] =  2.00000e+00 ;    y[ 7] = 2.00000e+00 ;   z[ 7] =  2.00000e+00 ;
+   x[ 8] =  0.00000e+00 ;    y[ 8] = 3.50000e+00 ;   z[ 8] =  1.00000e+00 ;
+   x[ 9] =  2.00000e+00 ;    y[ 9] = 3.50000e+00 ;   z[ 9] =  1.00000e+00 ;
+   x[10] =  0.00000e+00 ;    y[10] = 3.00000e+00 ;   z[10] =  1.50000e+00 ;
+   x[11] =  2.00000e+00 ;    y[11] = 3.00000e+00 ;   z[11] =  1.50000e+00 ;
+   x[12] =  0.00000e+00 ;    y[12] = 3.00000e+00 ;   z[12] =  0.50000e+00 ;
+   x[13] =  2.00000e+00 ;    y[13] = 3.00000e+00 ;   z[13] =  0.50000e+00 ;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "x";
+   coord_names[1] = "y";
+   coord_names[2] = "z";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write the face block parameters */
+   block_names[0] = "face_block_1";
+   num_face_in_block[0] = 15;
+   num_total_nodes_per_blk[0] = 58;
+   bids = 10;
+
+   error = ex_put_block (exoid, EX_FACE_BLOCK, bids, "nsided",
+			 num_face_in_block[0],
+			 num_total_nodes_per_blk[0],
+			 0, 0, 0);
+   printf ("after ex_put_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write face block names */
+   error = ex_put_names(exoid, EX_FACE_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   
+    
+   /* write face connectivity */
+
+   connect = (int *) calloc(num_total_nodes_per_blk[0], sizeof(int));
+
+   i = 0;
+   j = 0;
+
+   connect[i++] = 5;
+   connect[i++] = 6;
+   connect[i++] = 8; /* connectivity of face 1 of element 1 */
+   nnpe[j++] = 3;
+
+   connect[i++] = 2;
+   connect[i++] = 1;
+   connect[i++] = 4; /* face 2 of element 1 */
+   nnpe[j++] = 3;
+
+   connect[i++] = 6;
+   connect[i++] = 2;
+   connect[i++] = 4;
+   connect[i++] = 8; /* face 3 of element 1 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 8;
+   connect[i++] = 4;
+   connect[i++] = 1;
+   connect[i++] = 5; /* face 4 of element 1 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 1;
+   connect[i++] = 2;
+   connect[i++] = 6;
+   connect[i++] = 5; /*  face 5 of element 1 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 5;
+   connect[i++] = 8;
+   connect[i++] = 7; /* connectivity of face 1 of element 2 */
+   nnpe[j++] = 3;
+
+   connect[i++] = 1;
+   connect[i++] = 3;
+   connect[i++] = 4; /*  face 2 of element 2 */
+   nnpe[j++] = 3;
+
+   connect[i++] = 7;
+   connect[i++] = 8;
+   connect[i++] = 4;
+   connect[i++] = 3; /*  face 3 of element 2 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 7;
+   connect[i++] = 3;
+   connect[i++] = 1;
+   connect[i++] = 5; /*  face 4 of element 2 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 8;
+   connect[i++] = 4;
+   connect[i++] = 14;
+   connect[i++] = 10;
+   connect[i++] = 12; /* connectivity of face 1 of element 3 */
+   nnpe[j++] = 5;
+
+   connect[i++] = 7;
+   connect[i++] = 11;
+   connect[i++] = 9;
+   connect[i++] = 13;
+   connect[i++] = 3; /*  face 2 of element 3 */
+   nnpe[j++] = 5;
+
+   connect[i++] = 7;
+   connect[i++] = 8;
+   connect[i++] = 12;
+   connect[i++] = 11; /* face 3 of element 3 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 11;
+   connect[i++] = 12;
+   connect[i++] = 10;
+   connect[i++] = 9;  /* face 4 of element 3 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 9;
+   connect[i++] = 10;
+   connect[i++] = 14;
+   connect[i++] = 13; /*  face 5 of element 3 */
+   nnpe[j++] = 4;
+
+   connect[i++] = 13;
+   connect[i++] = 14;
+   connect[i++] = 4;
+   connect[i++] = 3; /* face 6 of element 3 */
+   nnpe[j++] = 4;
+   
+   assert(i == num_total_nodes_per_blk[0]);
+   assert(j == num_face_in_block[0]);
+
+   error = ex_put_conn (exoid, EX_FACE_BLOCK, bids, connect, NULL, NULL);
+   printf ("after ex_put_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+   connect = NULL;
+
+   error = ex_put_entity_count_per_polyhedra(exoid, EX_FACE_BLOCK, bids, nnpe);
+   printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* write element block parameters */
+   block_names[0] = "nfaced_1";
+
+   num_elem_in_block[0] = 3;
+   num_total_faces_per_blk[0] = 5 + 5 + 7;
+
+   bids = 10;
+
+   error = ex_put_block (exoid, EX_ELEM_BLOCK, bids, "nfaced",
+			 num_elem_in_block[0],
+			 0, 
+			 0,
+			 num_total_faces_per_blk[0],
+			 0);
+   printf ("after ex_put_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write element block names */
+   error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   /* write element-face connectivity */
+   connect = (int *) calloc(num_total_faces_per_blk[0], sizeof(int));
+
+   i = 0;
+   j = 0;
+   connect[i++] = 1;
+   connect[i++] = 2;
+   connect[i++] = 3;
+   connect[i++] = 4;
+   connect[i++] = 5;
+   nnpe[j++] = 5;  /* Number of faces per element 1 */
+   
+   connect[i++] = 4;
+   connect[i++] = 6;
+   connect[i++] = 7;
+   connect[i++] = 8;
+   connect[i++] = 9;
+   nnpe[j++] = 5;  /* Number of faces per element 2 */
+   
+
+   connect[i++] = 8;
+   connect[i++] = 10;
+   connect[i++] = 11;
+   connect[i++] = 12;
+   connect[i++] = 13;
+   connect[i++] = 14;
+   connect[i++] = 15;
+   nnpe[j++] = 7;  /* Number of faces per element 3 */
+
+   assert(i == num_total_faces_per_blk[0]);
+   assert(j == num_elem_in_block[0]);
+
+   error = ex_put_conn (exoid, EX_ELEM_BLOCK, bids, NULL, NULL, connect);
+   printf ("after ex_put_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+   error = ex_put_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, bids, nnpe);
+   printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* write QA records; test empty and just blank-filled records */
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT-NFACED";
+   qa_record[0][1] = "testwt-nfaced";
+   qa_record[0][2] = "2010/02/15";
+   qa_record[0][3] = "06:35:15";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* write information records; test empty and just blank-filled records */
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* close the EXODUS files
+    */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-nfaced.dmp b/exodus/cbind/test/testwt-nfaced.dmp
new file mode 100644
index 0000000..aa8ab35
--- /dev/null
+++ b/exodus/cbind/test/testwt-nfaced.dmp
@@ -0,0 +1,104 @@
+netcdf test-nfaced {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 14 ;
+	num_elem = 3 ;
+	num_face = 15 ;
+	num_el_blk = 1 ;
+	num_fa_blk = 1 ;
+	num_fa_in_blk1 = 15 ;
+	num_nod_per_fa1 = 58 ;
+	num_el_in_blk1 = 3 ;
+	num_fac_per_el1 = 17 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int fa_status(num_fa_blk) ;
+	int fa_prop1(num_fa_blk) ;
+		fa_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char fa_names(num_fa_blk, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int fbconn1(num_nod_per_fa1) ;
+		fbconn1:elem_type = "nsided" ;
+	int fbepecnt1(num_fa_in_blk1) ;
+		fbepecnt1:entity_type1 = "NODE" ;
+		fbepecnt1:entity_type2 = "FACE" ;
+	int facconn1(num_fac_per_el1) ;
+		facconn1:elem_type = "nfaced" ;
+	int ebepecnt1(num_el_in_blk1) ;
+		ebepecnt1:entity_type1 = "FACE" ;
+		ebepecnt1:entity_type2 = "ELEM" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1 ;
+
+ eb_prop1 = 10 ;
+
+ fa_status = 1 ;
+
+ fa_prop1 = 10 ;
+
+ coordx = 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2 ;
+
+ coordy = 0, 0, 2, 2, 0, 0, 2, 2, 3.5, 3.5, 3, 3, 3, 3 ;
+
+ coordz = 0, 0, 0, 0, 2, 2, 2, 2, 1, 1, 1.5, 1.5, 0.5, 0.5 ;
+
+ eb_names =
+  "nfaced_1" ;
+
+ fa_names =
+  "face_block_1" ;
+
+ coor_names =
+  "x",
+  "y",
+  "z" ;
+
+ fbconn1 = 5, 6, 8, 2, 1, 4, 6, 2, 4, 8, 8, 4, 1, 5, 1, 2, 6, 5, 5, 8, 7, 1, 
+    3, 4, 7, 8, 4, 3, 7, 3, 1, 5, 8, 4, 14, 10, 12, 7, 11, 9, 13, 3, 7, 8, 
+    12, 11, 11, 12, 10, 9, 9, 10, 14, 13, 13, 14, 4, 3 ;
+
+ fbepecnt1 = 3, 3, 4, 4, 4, 3, 3, 4, 4, 5, 5, 4, 4, 4, 4 ;
+
+ facconn1 = 1, 2, 3, 4, 5, 4, 6, 7, 8, 9, 8, 10, 11, 12, 13, 14, 15 ;
+
+ ebepecnt1 = 5, 5, 7 ;
+
+ qa_records =
+  "TESTWT-NFACED",
+  "testwt-nfaced",
+  "2010/02/15",
+  "06:35:15",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+}
diff --git a/exodus/cbind/test/testwt-nsided.c b/exodus/cbind/test/testwt-nsided.c
new file mode 100644
index 0000000..2f0f948
--- /dev/null
+++ b/exodus/cbind/test/testwt-nsided.c
@@ -0,0 +1,974 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file (testwt-nsided.exo)
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_total_nodes_per_blk[10];
+   int num_face_in_sset[10], num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ssids[10], nsids[10], nnpe[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *sset_var_vals, *nset_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *block_names[10], *nset_names[10], *sset_names[10];
+   char *attrib_names[2];
+   char *title = "This is a test";
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test-nsided.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 7;
+   num_elem_blk = 1;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   
+   error = ex_put_init (exoid, title, num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* 3d Tri */
+   x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+   x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+   x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodal attributes */
+   error = ex_put_attr_param(exoid, EX_NODAL, 0, 2);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 1, x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 2, y);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Node_attr_1";
+     attrib_names[1] = "Node_attr_2";
+     error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (elem_map);
+
+
+/* write element block parameters */
+
+   block_names[0] = "nsided_1";
+
+   num_elem_in_block[0] = 7;
+
+   num_total_nodes_per_blk[0] = 37; 
+
+   ebids[0] = 10;
+
+#if 0
+   error = ex_put_nsided_block (exoid, EX_ELEM_BLOCK, ebids[0], num_elem_in_block[0],
+				num_total_nodes_per_blk[0], 0);
+#else
+   error = ex_put_block (exoid, EX_ELEM_BLOCK, ebids[0], "nsided",
+			 num_elem_in_block[0],
+			 num_total_nodes_per_blk[0],
+			 0, 0, 0);
+#endif
+   printf ("after ex_put_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write element block names */
+   error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+/* write element connectivity */
+
+   connect = (int *) calloc(num_total_nodes_per_blk[0], sizeof(int));
+
+   i = 0;
+   j = 0;
+   connect[i++] = 1; connect[i++] = 2; connect[i++] = 3; connect[i++] = 4;
+   nnpe[j++] = 4;
+   connect[i++] = 5; connect[i++] = 6; connect[i++] = 7; connect[i++] = 8;
+   nnpe[j++] = 4;
+
+   connect[i++] = 9; connect[i++] = 10; connect[i++] = 11; connect[i++] = 12;
+   connect[i++] = 13; connect[i++] = 14; connect[i++] = 15; connect[i++] = 16;
+   nnpe[j++] = 8 ;
+
+   connect[i++] = 17; connect[i++] = 18; connect[i++] = 19; connect[i++] = 20;
+   nnpe[j++] = 4;
+
+   connect[i++] = 21; connect[i++] = 22; connect[i++] = 23;
+   connect[i++] = 24; connect[i++] = 25; connect[i++] = 26;
+   nnpe[j++] = 6;
+
+   connect[i++] = 17; connect[i++] = 18; connect[i++] = 19; connect[i++] = 20;
+   connect[i++] = 27; connect[i++] = 28; connect[i++] = 30; connect[i++] = 29;
+   nnpe[j++] = 8;
+
+   connect[i++] = 31; connect[i++] = 32; connect[i++] = 33;
+   nnpe[j++] = 3;
+
+   assert(i == num_total_nodes_per_blk[0]);
+   assert(j == num_elem_in_block[0]);
+
+   error = ex_put_conn (exoid, EX_ELEM_BLOCK, ebids[0], connect, NULL, NULL);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+   error = ex_put_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, ebids[0], nnpe);
+   printf ("after ex_put_entity_count_per_polyhedra, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write individual node sets */
+
+
+   num_nodes_in_nset[0] = 5;
+   num_nodes_in_nset[1] = 3;
+
+   nsids[0] = 20;
+   nsids[1] = 21;
+
+   error = ex_put_node_set_param (exoid, nsids[0], 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, nsids[0], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_node_set_param (exoid, nsids[1], 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, nsids[1], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write node set names */
+   nset_names[0] = "nset_1";
+   nset_names[1] = "nset_2";
+
+   error = ex_put_names(exoid, EX_NODE_SET, nset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodeset attributes */
+   error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Nodeset_attribute";
+     error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual side sets */
+   num_face_in_sset[0] =  2;
+   num_face_in_sset[1] =  2;
+   num_face_in_sset[2] =  7;
+   num_face_in_sset[3] =  8;
+   num_face_in_sset[4] = 10;
+   
+   ssids[0] = 30;
+   ssids[1] = 31;
+   ssids[2] = 32;
+   ssids[3] = 33;
+   ssids[4] = 34;
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, ssids[0], 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 8, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+   elem_list[4] = 6; elem_list[5] = 6;
+   elem_list[6] = 6; elem_list[7] = 6;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 1; side_list[5] = 2;
+   side_list[6] = 3; side_list[7] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #5  - wedges and tris */
+
+   error = ex_put_side_set_param (exoid, 34, 10, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5; elem_list[5] = 7;
+   elem_list[6] = 7; elem_list[7] = 7;
+   elem_list[8] = 7; elem_list[9] = 7;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5; side_list[5] = 1;
+   side_list[6] = 2; side_list[7] = 3;
+   side_list[8] = 4; side_list[9] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write side set names */
+   sset_names[0] = "sset_1";
+   sset_names[1] = "sset_2";
+   sset_names[2] = "sset_3";
+   sset_names[3] = "sset_4";
+   sset_names[4] = "sset_5";
+
+   error = ex_put_names(exoid, EX_SIDE_SET, sset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   {
+     num_nset_vars = 3;
+     
+     var_names[0] = "ns_var0";
+     var_names[1] = "ns_var1";
+     var_names[2] = "ns_var2";
+     
+     error = ex_put_var_param (exoid, "m", num_nset_vars);
+     printf ("after ex_put_var_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_var_names (exoid, "m", num_nset_vars, var_names);
+     printf ("after ex_put_var_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     num_sset_vars = 3;
+
+     var_names[0] = "ss_var0";
+     var_names[1] = "ss_var1";
+     var_names[2] = "ss_var2";
+     
+     error = ex_put_var_param (exoid, "s", num_sset_vars);
+     printf ("after ex_put_var_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_var_names (exoid, "s", num_sset_vars, var_names);
+     printf ("after ex_put_var_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (8, CPU_word_size);
+   sset_var_vals = (float *) calloc (10, CPU_word_size);
+   nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write sideset variables */
+
+     for (k=1; k<=num_sset_vars; k++)
+     {
+       for (j=0; j<num_side_sets; j++)
+       {
+         for (m=0; m<num_face_in_sset[j]; m++)
+         {
+           sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+                              ((float)(m+1)*time_value);
+           /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+         }
+         error = ex_put_sset_var (exoid, whole_time_step, k, ssids[j],
+                                  num_face_in_sset[j], sset_var_vals);
+         printf ("after ex_put_sset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write nodeset variables */
+
+     for (k=1; k<=num_nset_vars; k++)
+     {
+       for (j=0; j<num_node_sets; j++)
+       {
+         for (m=0; m<num_nodes_in_nset[j]; m++)
+         {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+                              ((float)(m+1)*time_value);
+           /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+         }
+         error = ex_put_nset_var (exoid, whole_time_step, k, nsids[j],
+                                  num_nodes_in_nset[j], nset_var_vals);
+         printf ("after ex_put_nset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   free(sset_var_vals);
+   free(nset_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-nsided.dmp b/exodus/cbind/test/testwt-nsided.dmp
new file mode 100644
index 0000000..08c18e8
--- /dev/null
+++ b/exodus/cbind/test/testwt-nsided.dmp
@@ -0,0 +1,669 @@
+netcdf test-nsided {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 1 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_att_in_nblk = 2 ;
+	num_el_in_blk1 = 7 ;
+	num_nod_per_el1 = 37 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_att_in_ns1 = 1 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 8 ;
+	num_side_ss5 = 10 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+	num_nset_var = 3 ;
+	num_sset_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float nattrb(num_nodes, num_att_in_nblk) ;
+	char nattrib_name(num_att_in_nblk, len_name) ;
+	int elem_map(num_elem) ;
+	int connect1(num_nod_per_el1) ;
+		connect1:elem_type = "nsided" ;
+	int ebepecnt1(num_el_in_blk1) ;
+		ebepecnt1:entity_type1 = "NODE" ;
+		ebepecnt1:entity_type2 = "ELEM" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	float nsattrb1(num_nod_ns1, num_att_in_ns1) ;
+	char nsattrib_name1(num_att_in_ns1, len_name) ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	char name_nset_var(num_nset_var, len_name) ;
+	char name_sset_var(num_sset_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+	float vals_sset_var1ss1(time_step, num_side_ss1) ;
+	float vals_sset_var1ss2(time_step, num_side_ss2) ;
+	float vals_sset_var1ss3(time_step, num_side_ss3) ;
+	float vals_sset_var1ss4(time_step, num_side_ss4) ;
+	float vals_sset_var1ss5(time_step, num_side_ss5) ;
+	float vals_sset_var2ss1(time_step, num_side_ss1) ;
+	float vals_sset_var2ss2(time_step, num_side_ss2) ;
+	float vals_sset_var2ss3(time_step, num_side_ss3) ;
+	float vals_sset_var2ss4(time_step, num_side_ss4) ;
+	float vals_sset_var2ss5(time_step, num_side_ss5) ;
+	float vals_sset_var3ss1(time_step, num_side_ss1) ;
+	float vals_sset_var3ss2(time_step, num_side_ss2) ;
+	float vals_sset_var3ss3(time_step, num_side_ss3) ;
+	float vals_sset_var3ss4(time_step, num_side_ss4) ;
+	float vals_sset_var3ss5(time_step, num_side_ss5) ;
+	float vals_nset_var1ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var1ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var2ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var2ns2(time_step, num_nod_ns2) ;
+	float vals_nset_var3ns1(time_step, num_nod_ns1) ;
+	float vals_nset_var3ns2(time_step, num_nod_ns2) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1 ;
+
+ eb_prop1 = 10 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "nsided_1" ;
+
+ ns_names =
+  "nset_1",
+  "nset_2" ;
+
+ ss_names =
+  "sset_1",
+  "sset_2",
+  "sset_3",
+  "sset_4",
+  "sset_5" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nattrb =
+  0, 0,
+  1, 0,
+  1, 1,
+  0, 1,
+  1, 0,
+  2, 0,
+  2, 1,
+  1, 1,
+  0, 0,
+  10, 0,
+  10, 0,
+  1, 0,
+  1, 10,
+  10, 10,
+  10, 10,
+  1, 10,
+  0, 0,
+  1, 0,
+  10, 0,
+  7, 5,
+  3, 0,
+  6, 0,
+  0, 0,
+  3, 2,
+  6, 2,
+  0, 2,
+  2.7, 1.7,
+  6, 1.7,
+  5.7, 1.7,
+  3.7, 0,
+  0, 0,
+  10, 0,
+  10, 10 ;
+
+ nattrib_name =
+  "Node_attr_1",
+  "Node_attr_2" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ connect1 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+    19, 20, 21, 22, 23, 24, 25, 26, 17, 18, 19, 20, 27, 28, 30, 29, 31, 32, 33 ;
+
+ ebepecnt1 = 4, 4, 8, 4, 6, 8, 3 ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ nsattrb1 =
+  0,
+  1,
+  1,
+  0,
+  1 ;
+
+ nsattrib_name1 =
+  "Nodeset_attribute" ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4, 6, 6, 6, 6 ;
+
+ side_ss4 = 1, 2, 3, 4, 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5, 7, 7, 7, 7, 7 ;
+
+ side_ss5 = 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56, 1.58, 1.6, 1.62, 1.64, 1.66,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84, 1.87, 1.9, 1.93, 1.96, 1.99,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68, 2.74, 2.8, 2.86, 2.92, 2.98,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96, 3.03, 3.1, 3.17, 3.24, 3.31,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24, 3.32, 3.4, 3.48, 3.56, 3.64,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52, 3.61, 3.7, 3.79, 3.88, 3.97,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
+    4.1, 4.2, 4.3 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56, 2.58, 2.6, 2.62, 2.64, 2.66,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12, 3.16, 3.2, 3.24, 3.28, 3.32,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68, 3.74, 3.8, 3.86, 3.92, 3.98,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96, 4.03, 4.1, 4.17, 4.24, 4.31,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24, 4.32, 4.4, 4.48, 4.56, 4.64,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52, 4.61, 4.7, 4.79, 4.88, 4.97,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 
+    5.1, 5.2, 5.3 ;
+
+ name_nod_var =
+  "node_variable_a_very_long_name_0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ name_nset_var =
+  "ns_var0",
+  "ns_var1",
+  "ns_var2" ;
+
+ name_sset_var =
+  "ss_var0",
+  "ss_var1",
+  "ss_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01, 4.02, 4.03, 4.04, 4.05, 4.06, 4.07,
+  4.02, 4.04, 4.06, 4.08, 4.1, 4.12, 4.14,
+  4.03, 4.06, 4.09, 4.12, 4.15, 4.18, 4.21,
+  4.04, 4.08, 4.12, 4.16, 4.2, 4.24, 4.28,
+  4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35,
+  4.06, 4.12, 4.18, 4.24, 4.3, 4.36, 4.42,
+  4.07, 4.14, 4.21, 4.28, 4.35, 4.42, 4.49,
+  4.08, 4.16, 4.24, 4.32, 4.4, 4.48, 4.56,
+  4.09, 4.18, 4.27, 4.36, 4.45, 4.54, 4.63,
+  4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7 ;
+
+ vals_elem_var2eb1 =
+  5.01, 5.02, 5.03, 5.04, 5.05, 5.06, 5.07,
+  5.02, 5.04, 5.06, 5.08, 5.1, 5.12, 5.14,
+  5.03, 5.06, 5.09, 5.12, 5.15, 5.18, 5.21,
+  5.04, 5.08, 5.12, 5.16, 5.2, 5.24, 5.28,
+  5.05, 5.1, 5.15, 5.2, 5.25, 5.3, 5.35,
+  5.06, 5.12, 5.18, 5.24, 5.3, 5.36, 5.42,
+  5.07, 5.14, 5.21, 5.28, 5.35, 5.42, 5.49,
+  5.08, 5.16, 5.24, 5.32, 5.4, 5.48, 5.56,
+  5.09, 5.18, 5.27, 5.36, 5.45, 5.54, 5.63,
+  5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7 ;
+
+ vals_elem_var3eb1 =
+  6.01, 6.02, 6.03, 6.04, 6.05, 6.06, 6.07,
+  6.02, 6.04, 6.06, 6.08, 6.1, 6.12, 6.14,
+  6.03, 6.06, 6.09, 6.12, 6.15, 6.18, 6.21,
+  6.04, 6.08, 6.12, 6.16, 6.2, 6.24, 6.28,
+  6.05, 6.1, 6.15, 6.2, 6.25, 6.3, 6.35,
+  6.06, 6.12, 6.18, 6.24, 6.3, 6.36, 6.42,
+  6.07, 6.14, 6.21, 6.28, 6.35, 6.42, 6.49,
+  6.08, 6.16, 6.24, 6.32, 6.4, 6.48, 6.56,
+  6.09, 6.18, 6.27, 6.36, 6.45, 6.54, 6.63,
+  6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7 ;
+
+ elem_var_tab =
+  1, 1, 1 ;
+
+ vals_sset_var1ss1 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_sset_var1ss2 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_sset_var1ss3 =
+  8.01, 8.02, 8.03, 8.04, 8.05, 8.06, 8.07,
+  8.02, 8.04, 8.06, 8.08, 8.1, 8.12, 8.14,
+  8.03, 8.06, 8.09, 8.12, 8.15, 8.18, 8.21,
+  8.04, 8.08, 8.12, 8.16, 8.2, 8.24, 8.28,
+  8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35,
+  8.06, 8.12, 8.18, 8.24, 8.3, 8.36, 8.42,
+  8.07, 8.14, 8.21, 8.28, 8.35, 8.42, 8.49,
+  8.08, 8.16, 8.24, 8.32, 8.4, 8.48, 8.56,
+  8.09, 8.18, 8.27, 8.36, 8.45, 8.54, 8.63,
+  8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7 ;
+
+ vals_sset_var1ss4 =
+  9.01, 9.02, 9.03, 9.04, 9.05, 9.06, 9.07, 9.08,
+  9.02, 9.04, 9.06, 9.08, 9.1, 9.12, 9.14, 9.16,
+  9.03, 9.06, 9.09, 9.12, 9.15, 9.18, 9.21, 9.24,
+  9.04, 9.08, 9.12, 9.16, 9.2, 9.24, 9.28, 9.32,
+  9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35, 9.4,
+  9.06, 9.12, 9.18, 9.24, 9.3, 9.36, 9.42, 9.48,
+  9.07, 9.14, 9.21, 9.28, 9.35, 9.42, 9.49, 9.56,
+  9.08, 9.16, 9.24, 9.32, 9.4, 9.48, 9.56, 9.64,
+  9.09, 9.18, 9.27, 9.36, 9.45, 9.54, 9.63, 9.72,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8 ;
+
+ vals_sset_var1ss5 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08, 10.09, 10.1,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16, 10.18, 10.2,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24, 10.27, 10.3,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32, 10.36, 10.4,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4, 10.45, 10.5,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48, 10.54, 10.6,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56, 10.63, 10.7,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72, 10.81, 10.9,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 11 ;
+
+ vals_sset_var2ss1 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_sset_var2ss2 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var2ss3 =
+  9.01, 9.02, 9.03, 9.04, 9.05, 9.06, 9.07,
+  9.02, 9.04, 9.06, 9.08, 9.1, 9.12, 9.14,
+  9.03, 9.06, 9.09, 9.12, 9.15, 9.18, 9.21,
+  9.04, 9.08, 9.12, 9.16, 9.2, 9.24, 9.28,
+  9.05, 9.1, 9.15, 9.2, 9.25, 9.3, 9.35,
+  9.06, 9.12, 9.18, 9.24, 9.3, 9.36, 9.42,
+  9.07, 9.14, 9.21, 9.28, 9.35, 9.42, 9.49,
+  9.08, 9.16, 9.24, 9.32, 9.4, 9.48, 9.56,
+  9.09, 9.18, 9.27, 9.36, 9.45, 9.54, 9.63,
+  9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7 ;
+
+ vals_sset_var2ss4 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07, 10.08,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14, 10.16,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21, 10.24,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28, 10.32,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35, 10.4,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42, 10.48,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49, 10.56,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63, 10.72,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8 ;
+
+ vals_sset_var2ss5 =
+  11.01, 11.02, 11.03, 11.04, 11.05, 11.06, 11.07, 11.08, 11.09, 11.1,
+  11.02, 11.04, 11.06, 11.08, 11.1, 11.12, 11.14, 11.16, 11.18, 11.2,
+  11.03, 11.06, 11.09, 11.12, 11.15, 11.18, 11.21, 11.24, 11.27, 11.3,
+  11.04, 11.08, 11.12, 11.16, 11.2, 11.24, 11.28, 11.32, 11.36, 11.4,
+  11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4, 11.45, 11.5,
+  11.06, 11.12, 11.18, 11.24, 11.3, 11.36, 11.42, 11.48, 11.54, 11.6,
+  11.07, 11.14, 11.21, 11.28, 11.35, 11.42, 11.49, 11.56, 11.63, 11.7,
+  11.08, 11.16, 11.24, 11.32, 11.4, 11.48, 11.56, 11.64, 11.72, 11.8,
+  11.09, 11.18, 11.27, 11.36, 11.45, 11.54, 11.63, 11.72, 11.81, 11.9,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 12 ;
+
+ vals_sset_var3ss1 =
+  8.01, 8.02,
+  8.02, 8.04,
+  8.03, 8.06,
+  8.04, 8.08,
+  8.05, 8.1,
+  8.06, 8.12,
+  8.07, 8.14,
+  8.08, 8.16,
+  8.09, 8.18,
+  8.1, 8.2 ;
+
+ vals_sset_var3ss2 =
+  9.01, 9.02,
+  9.02, 9.04,
+  9.03, 9.06,
+  9.04, 9.08,
+  9.05, 9.1,
+  9.06, 9.12,
+  9.07, 9.14,
+  9.08, 9.16,
+  9.09, 9.18,
+  9.1, 9.2 ;
+
+ vals_sset_var3ss3 =
+  10.01, 10.02, 10.03, 10.04, 10.05, 10.06, 10.07,
+  10.02, 10.04, 10.06, 10.08, 10.1, 10.12, 10.14,
+  10.03, 10.06, 10.09, 10.12, 10.15, 10.18, 10.21,
+  10.04, 10.08, 10.12, 10.16, 10.2, 10.24, 10.28,
+  10.05, 10.1, 10.15, 10.2, 10.25, 10.3, 10.35,
+  10.06, 10.12, 10.18, 10.24, 10.3, 10.36, 10.42,
+  10.07, 10.14, 10.21, 10.28, 10.35, 10.42, 10.49,
+  10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56,
+  10.09, 10.18, 10.27, 10.36, 10.45, 10.54, 10.63,
+  10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7 ;
+
+ vals_sset_var3ss4 =
+  11.01, 11.02, 11.03, 11.04, 11.05, 11.06, 11.07, 11.08,
+  11.02, 11.04, 11.06, 11.08, 11.1, 11.12, 11.14, 11.16,
+  11.03, 11.06, 11.09, 11.12, 11.15, 11.18, 11.21, 11.24,
+  11.04, 11.08, 11.12, 11.16, 11.2, 11.24, 11.28, 11.32,
+  11.05, 11.1, 11.15, 11.2, 11.25, 11.3, 11.35, 11.4,
+  11.06, 11.12, 11.18, 11.24, 11.3, 11.36, 11.42, 11.48,
+  11.07, 11.14, 11.21, 11.28, 11.35, 11.42, 11.49, 11.56,
+  11.08, 11.16, 11.24, 11.32, 11.4, 11.48, 11.56, 11.64,
+  11.09, 11.18, 11.27, 11.36, 11.45, 11.54, 11.63, 11.72,
+  11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8 ;
+
+ vals_sset_var3ss5 =
+  12.01, 12.02, 12.03, 12.04, 12.05, 12.06, 12.07, 12.08, 12.09, 12.1,
+  12.02, 12.04, 12.06, 12.08, 12.1, 12.12, 12.14, 12.16, 12.18, 12.2,
+  12.03, 12.06, 12.09, 12.12, 12.15, 12.18, 12.21, 12.24, 12.27, 12.3,
+  12.04, 12.08, 12.12, 12.16, 12.2, 12.24, 12.28, 12.32, 12.36, 12.4,
+  12.05, 12.1, 12.15, 12.2, 12.25, 12.3, 12.35, 12.4, 12.45, 12.5,
+  12.06, 12.12, 12.18, 12.24, 12.3, 12.36, 12.42, 12.48, 12.54, 12.6,
+  12.07, 12.14, 12.21, 12.28, 12.35, 12.42, 12.49, 12.56, 12.63, 12.7,
+  12.08, 12.16, 12.24, 12.32, 12.4, 12.48, 12.56, 12.64, 12.72, 12.8,
+  12.09, 12.18, 12.27, 12.36, 12.45, 12.54, 12.63, 12.72, 12.81, 12.9,
+  12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 13 ;
+
+ vals_nset_var1ns1 =
+  8.01, 8.02, 8.03, 8.04, 8.05,
+  8.02, 8.04, 8.06, 8.08, 8.1,
+  8.03, 8.06, 8.09, 8.12, 8.15,
+  8.04, 8.08, 8.12, 8.16, 8.2,
+  8.05, 8.1, 8.15, 8.2, 8.25,
+  8.06, 8.12, 8.18, 8.24, 8.3,
+  8.07, 8.14, 8.21, 8.28, 8.35,
+  8.08, 8.16, 8.24, 8.32, 8.4,
+  8.09, 8.18, 8.27, 8.36, 8.45,
+  8.1, 8.2, 8.3, 8.4, 8.5 ;
+
+ vals_nset_var1ns2 =
+  9.01, 9.02, 9.03,
+  9.02, 9.04, 9.06,
+  9.03, 9.06, 9.09,
+  9.04, 9.08, 9.12,
+  9.05, 9.1, 9.15,
+  9.06, 9.12, 9.18,
+  9.07, 9.14, 9.21,
+  9.08, 9.16, 9.24,
+  9.09, 9.18, 9.27,
+  9.1, 9.2, 9.3 ;
+
+ vals_nset_var2ns1 =
+  9.01, 9.02, 9.03, 9.04, 9.05,
+  9.02, 9.04, 9.06, 9.08, 9.1,
+  9.03, 9.06, 9.09, 9.12, 9.15,
+  9.04, 9.08, 9.12, 9.16, 9.2,
+  9.05, 9.1, 9.15, 9.2, 9.25,
+  9.06, 9.12, 9.18, 9.24, 9.3,
+  9.07, 9.14, 9.21, 9.28, 9.35,
+  9.08, 9.16, 9.24, 9.32, 9.4,
+  9.09, 9.18, 9.27, 9.36, 9.45,
+  9.1, 9.2, 9.3, 9.4, 9.5 ;
+
+ vals_nset_var2ns2 =
+  10.01, 10.02, 10.03,
+  10.02, 10.04, 10.06,
+  10.03, 10.06, 10.09,
+  10.04, 10.08, 10.12,
+  10.05, 10.1, 10.15,
+  10.06, 10.12, 10.18,
+  10.07, 10.14, 10.21,
+  10.08, 10.16, 10.24,
+  10.09, 10.18, 10.27,
+  10.1, 10.2, 10.3 ;
+
+ vals_nset_var3ns1 =
+  10.01, 10.02, 10.03, 10.04, 10.05,
+  10.02, 10.04, 10.06, 10.08, 10.1,
+  10.03, 10.06, 10.09, 10.12, 10.15,
+  10.04, 10.08, 10.12, 10.16, 10.2,
+  10.05, 10.1, 10.15, 10.2, 10.25,
+  10.06, 10.12, 10.18, 10.24, 10.3,
+  10.07, 10.14, 10.21, 10.28, 10.35,
+  10.08, 10.16, 10.24, 10.32, 10.4,
+  10.09, 10.18, 10.27, 10.36, 10.45,
+  10.1, 10.2, 10.3, 10.4, 10.5 ;
+
+ vals_nset_var3ns2 =
+  11.01, 11.02, 11.03,
+  11.02, 11.04, 11.06,
+  11.03, 11.06, 11.09,
+  11.04, 11.08, 11.12,
+  11.05, 11.1, 11.15,
+  11.06, 11.12, 11.18,
+  11.07, 11.14, 11.21,
+  11.08, 11.16, 11.24,
+  11.09, 11.18, 11.27,
+  11.1, 11.2, 11.3 ;
+}
diff --git a/exodus/cbind/test/testwt-one-attrib.c b/exodus/cbind/test/testwt-one-attrib.c
new file mode 100644
index 0000000..47f1454
--- /dev/null
+++ b/exodus/cbind/test/testwt-one-attrib.c
@@ -0,0 +1,338 @@
+/*
+ * Copyright (c) 2014, Sandia Corporation.
+ * Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+ * the U.S. Government retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+#undef NDEBUG
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+  int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+  int num_elem_in_block[10], num_nodes_per_elem[10], num_attr[10];
+  int num_node_sets, num_side_sets, error;
+  int i, j, *connect;
+  int ebids[10], ids[10];
+  int CPU_word_size,IO_word_size;
+  char title[MAX_LINE_LENGTH+1], elem_type[MAX_STR_LENGTH+1];
+
+  float version;
+  float *attrib;
+  float x[100], y[100], z[100];
+  char *coord_names[3];
+
+  /* Coordinate Frames */
+  int cf_ids[2] = {20, 13};
+  float pt_coords[9*2] = {1,0,0,  1,0,1,  2,0,0,
+			  0,0,0,  1,0,0,  0,1,0};
+  char tags[2]={'r', 'c'};
+  
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+  /* Specify compute and i/o word size */
+
+  CPU_word_size = 0;                   /* sizeof(float) */
+  IO_word_size = 4;                    /* (4 bytes) */
+
+  /* create EXODUS II file */
+
+  exoid = ex_create ("test.exo",       /* filename path */
+		     EX_CLOBBER,      /* create mode */
+		     &CPU_word_size,  /* CPU float word size in bytes */
+		     &IO_word_size);  /* I/O float word size in bytes */
+  /* initialize file with parameters */
+
+  num_dim = 3;
+  num_nodes = 19;
+  num_elem = 12;;
+  num_elem_blk = 1;
+  num_node_sets = 0;
+  num_side_sets = 0;
+
+  error = ex_put_init (exoid, "This is testwt1", num_dim, num_nodes, num_elem,
+		       num_elem_blk, num_node_sets, num_side_sets);
+  assert(error == 0);
+
+  /* write nodal coordinates values and names to database */
+
+  /* Quad #1 */
+  x[0]  = 1.0000000E+00;
+  x[1]  = 5.0000000E-01;
+  x[2]  = 1.0000000E+00;
+  x[3]  = 1.0000000E+00;
+  x[4]  = 7.5000000E-01;
+  x[5]  = 5.0000000E-01;
+  x[6]  = 1.0000000E+00;
+  x[7]  = 7.5000000E-01;
+  x[8]  = 1.0000000E+00;
+  x[9]  = 5.0000000E-01;
+  x[10] = 5.0000000E-01;
+  x[11] = 5.0000000E-01;
+  x[12] = 1.0000000E+00;
+  x[13] = 1.0000000E+00;
+  x[14] = 7.5000000E-01;
+  x[15] = 7.5000000E-01;
+  x[16] = 1.0000000E+00;
+  x[17] = 7.5000000E-01;
+  x[18] = 1.0000000E+00;
+
+  y[0]  =  5.0000000E-01;
+  y[1]  =  1.0000000E+00;
+  y[2]  =  1.0000000E+00;
+  y[3]  =  7.5000000E-01;
+  y[4]  =  1.0000000E+00;
+  y[5]  =  5.0000000E-01;
+  y[6]  =  5.0000000E-01;
+  y[7]  =  5.0000000E-01;
+  y[8]  =  5.0000000E-01;
+  y[9]  =  1.0000000E+00;
+  y[10] =  7.5000000E-01;
+  y[11] =  1.0000000E+00;
+  y[12] =  1.0000000E+00;
+  y[13] =  7.5000000E-01;
+  y[14] =  1.0000000E+00;
+  y[15] =  7.5000000E-01;
+  y[16] =  1.0000000E+00;
+  y[17] =  1.0000000E+00;
+  y[18] =  7.5000000E-01;
+
+  z[0]  = 5.0000000E-01;
+  z[1]  = 5.0000000E-01;
+  z[2]  = 5.0000000E-01;
+  z[3]  = 5.0000000E-01;
+  z[4]  = 5.0000000E-01;
+  z[5]  = 1.0000000E+00;
+  z[6]  = 1.0000000E+00;
+  z[7]  = 1.0000000E+00;
+  z[8]  = 7.5000000E-01;
+  z[9]  = 1.0000000E+00;
+  z[10] = 1.0000000E+00;
+  z[11] = 7.5000000E-01;
+  z[12] = 1.0000000E+00;
+  z[13] = 1.0000000E+00;
+  z[14] = 1.0000000E+00;
+  z[15] = 1.0000000E+00;
+  z[16] = 7.5000000E-01;
+  z[17] = 7.5000000E-01;
+  z[18] = 7.5000000E-01;
+
+  error = ex_put_coord (exoid, x, y, z);
+  assert(error == 0);
+
+  coord_names[0] = "xcoor";
+  coord_names[1] = "ycoor";
+  coord_names[2] = "zcoor";
+
+  error = ex_put_coord_names (exoid, coord_names);
+  assert(error == 0);
+
+  /* write element block parameters */
+  num_elem_in_block[0] = 12;
+  num_nodes_per_elem[0] = 4;
+  ebids[0] = 10;
+  num_attr[0] = 3;
+
+  error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+			     num_nodes_per_elem[0], num_attr[0]);
+  assert(error == 0);
+
+  /* write element connectivity */
+  connect = (int *) calloc(num_elem_in_block[0] * num_nodes_per_elem[0], sizeof(int));
+
+  connect[ 0] =  1;
+  connect[ 1] =  4;
+  connect[ 2] = 19;
+  connect[ 3] =  9;
+  connect[ 4] =  4;
+  connect[ 5] =  3;
+  connect[ 6] = 17;
+  connect[ 7] = 19;
+  connect[ 8] =  3;
+  connect[ 9] =  5;
+  connect[10] = 18;
+  connect[11] = 17;
+  connect[12] =  5;
+  connect[13] =  2;
+  connect[14] = 12;
+  connect[15] = 18;
+  connect[16] =  9;
+  connect[17] = 19;
+  connect[18] = 14;
+  connect[19] =  7;
+  connect[20] =  7;
+  connect[21] = 14;
+  connect[22] = 16;
+  connect[23] =  8;
+  connect[24] = 19;
+  connect[25] = 17;
+  connect[26] = 13;
+  connect[27] = 14;
+  connect[28] = 17;
+  connect[29] = 18;
+  connect[30] = 15;
+  connect[31] = 13;
+  connect[32] = 14;
+  connect[33] = 13;
+  connect[34] = 15;
+  connect[35] = 16;
+  connect[36] =  8;
+  connect[37] = 16;
+  connect[38] = 11;
+  connect[39] =  6;
+  connect[40] = 18;
+  connect[41] = 12;
+  connect[42] = 10;
+  connect[43] = 15;
+  connect[44] = 16;
+  connect[45] = 15;
+  connect[46] = 10;
+  connect[47] = 11;
+
+  error = ex_put_elem_conn (exoid, ebids[0], connect);
+  assert(error == 0);
+  free (connect);
+
+  /* write element block attributes  (3 per block) */
+  attrib = (float *) calloc(num_elem_in_block[0] * num_attr[0], sizeof(float));
+
+#if 0
+  {
+    k = 0;
+    for (i=0; i < num_elem_in_block[0]; i++) {
+      for (j = 0; j < num_attr[0]; j++) {
+	attrib[k++] = 10*(i+1) + j+1;
+      }
+    }
+  }
+
+  error = ex_put_elem_attr (exoid, ebids[0], &attrib[0]);
+  assert(error == 0);
+#else
+  {
+    for (j = 0; j < num_attr[0]; j++) {
+      for (i=0; i < num_elem_in_block[0]; i++) {
+	attrib[i] = 10*(i+1) + j+1;
+      }
+      error = ex_put_one_elem_attr (exoid, ebids[0], j+1, &attrib[0]);
+      assert(error == 0);
+    }
+  }
+#endif
+  free(attrib);
+
+  /* Add a coordinate frame just to give test coverage... */
+  {
+    error = ex_put_coordinate_frames(exoid, 2, cf_ids, pt_coords, tags);
+    assert(error == 0);
+  }
+
+  /* close the EXODUS files
+   */
+  error = ex_close (exoid);
+  assert(error == 0);
+
+
+  /* Reopen the file and read the attributes to see if they were written correctly */
+  CPU_word_size = 0;                    /* sizeof(float) */
+  IO_word_size = 0;                     /* use what is stored in file */
+
+
+  /* open EXODUS II files */
+
+  exoid = ex_open ("test.exo",  /* filename path */
+                   EX_READ,             /* access mode = READ */
+                   &CPU_word_size,      /* CPU word size */
+                   &IO_word_size,       /* IO word size */
+                   &version);           /* ExodusII library version */
+
+  assert(exoid >= 0);
+  if (exoid < 0) exit(1);
+
+  error = ex_get_init (exoid, title, &num_dim, &num_nodes, &num_elem,
+                       &num_elem_blk, &num_node_sets, &num_side_sets);
+
+  assert(error == 0);
+
+  if (num_elem_blk > 0) {
+    error = ex_get_elem_blk_ids (exoid, ids);
+    assert(error == 0);
+    
+    for (i=0; i<num_elem_blk; i++)
+      {
+        error = ex_get_elem_block (exoid, ids[i], elem_type,
+                                   &(num_elem_in_block[i]), 
+                                   &(num_nodes_per_elem[i]), &(num_attr[i]));
+	assert(error == 0);
+      }
+     
+    /* read element block attributes */
+
+    attrib = (float *) calloc(num_elem_in_block[0],sizeof(float));
+    for (j = 0; j < num_attr[0]; j++) {
+      error = ex_get_one_elem_attr (exoid, ids[0], j+1, &attrib[0]);
+      assert(error == 0);
+	
+      if (error == 0) {
+	for (i=0; i < num_elem_in_block[0]; i++) {
+	  assert(attrib[i] == 10*(i+1) + j+1);	  }
+      }
+    }
+    free (attrib);
+  }
+
+  /* Read the coordinate frame... */
+  {
+    int nframes;
+    int rdcf_ids[2];
+    float rdpt_coords[9*2];
+    char rdtags[2];
+
+    nframes = ex_inquire_int(exoid, EX_INQ_COORD_FRAMES);
+    assert(nframes == 2);
+
+    error = ex_get_coordinate_frames(exoid, &nframes, rdcf_ids, rdpt_coords, rdtags);
+    assert(error == 0);
+    assert(rdtags[0] == tags[0] && rdtags[1] == tags[1]);
+    assert(rdcf_ids[0] == cf_ids[0] && rdcf_ids[1] == cf_ids[1]);
+    
+    for (i=0; i < nframes*9; i++) {
+      assert(rdpt_coords[i] == pt_coords[i]);
+    }
+  }
+  error = ex_close (exoid);
+  assert(error == 0);
+  return 0;
+}
diff --git a/exodus/cbind/test/testwt-partial.c b/exodus/cbind/test/testwt-partial.c
new file mode 100644
index 0000000..32146da
--- /dev/null
+++ b/exodus/cbind/test/testwt-partial.c
@@ -0,0 +1,1218 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+/* #include "netcdf.h" */
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_face_in_sset[10], num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ssids[10], nsids[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *sset_var_vals, *nset_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float attrib[1], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *block_names[10], *nset_names[10], *sset_names[10];
+   char *prop_names[2], *attrib_names[2];
+   char *title = "This is a test";
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 7;
+   num_elem_blk = 7;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   
+   error = ex_put_init (exoid, title, num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* 3d Tri */
+   x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+   x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+   x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+   for (i=0; i < num_nodes; i+=11) {
+     error = ex_put_n_coord (exoid, i+1, 11, &x[i], &y[i], &z[i]);
+     printf ("after ex_put_coord, error = %d\n", error);
+   }
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodal attributes */
+   error = ex_put_attr_param(exoid, EX_NODAL, 0, 2);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   for (i=0; i < num_nodes; i+=11) {
+     error = ex_put_n_one_attr(exoid, EX_NODAL, 0, i+1, 11, 1, &x[i]);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_n_one_attr(exoid, EX_NODAL, 0, i+1, 11, 2, &y[i]);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     attrib_names[0] = "Node_attr_1";
+     attrib_names[1] = "Node_attr_2";
+     error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (elem_map);
+
+
+/* write element block parameters */
+
+/*                   1234567890123456789012345678901234567890 */
+   block_names[0] = "block_1";
+   block_names[1] = "block_2";
+   block_names[2] = "block_3";
+   block_names[3] = "block_4";
+   block_names[4] = "block_5";
+   block_names[5] = "block_6";
+   block_names[6] = "block_7";
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+   num_elem_in_block[5] = 1;
+   num_elem_in_block[6] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */
+   num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */
+   num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris   */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+   ebids[5] = 15;
+   ebids[6] = 16;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5],
+                               num_nodes_per_elem[5], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[6], "tri", num_elem_in_block[6],
+                               num_nodes_per_elem[6], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write element block names */
+   error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+/* write element block properties */
+
+   /*               12345678901234567890123456789012 */
+   prop_names[0] = "MATERIAL_PROPERTY_LONG_NAME_32CH";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], prop_names[0], 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], prop_names[0], 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], prop_names[0], 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], prop_names[0], 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], prop_names[0], 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], prop_names[0], 60);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], prop_names[0], 70);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+   connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+   error = ex_put_elem_conn (exoid, ebids[5], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 31; connect[1] = 32; connect[2] = 33;
+
+   error = ex_put_elem_conn (exoid, ebids[6], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[5], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[6], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib_names[0] = "THICKNESS";
+   for (i=0; i < 7; i++) {
+     error = ex_put_elem_attr_names (exoid, ebids[i], attrib_names);
+     printf ("after ex_put_elem_attr_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual node sets */
+
+
+   num_nodes_in_nset[0] = 5;
+   num_nodes_in_nset[1] = 3;
+
+   nsids[0] = 20;
+   nsids[1] = 21;
+
+   error = ex_put_node_set_param (exoid, nsids[0], 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, nsids[0], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_node_set_param (exoid, nsids[1], 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, nsids[1], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write node set names */
+   nset_names[0] = "nset_1";
+   nset_names[1] = "nset_2";
+
+   error = ex_put_names(exoid, EX_NODE_SET, nset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodeset attributes */
+   error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Nodeset_attribute";
+     error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual side sets */
+   num_face_in_sset[0] =  2;
+   num_face_in_sset[1] =  2;
+   num_face_in_sset[2] =  7;
+   num_face_in_sset[3] =  8;
+   num_face_in_sset[4] = 10;
+   
+   ssids[0] = 30;
+   ssids[1] = 31;
+   ssids[2] = 32;
+   ssids[3] = 33;
+   ssids[4] = 34;
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, ssids[0], 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 8, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+   elem_list[4] = 6; elem_list[5] = 6;
+   elem_list[6] = 6; elem_list[7] = 6;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 1; side_list[5] = 2;
+   side_list[6] = 3; side_list[7] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #5  - wedges and tris */
+
+   error = ex_put_side_set_param (exoid, 34, 10, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5; elem_list[5] = 7;
+   elem_list[6] = 7; elem_list[7] = 7;
+   elem_list[8] = 7; elem_list[9] = 7;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5; side_list[5] = 1;
+   side_list[6] = 2; side_list[7] = 3;
+   side_list[8] = 4; side_list[9] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write side set names */
+   sset_names[0] = "sset_1";
+   sset_names[1] = "sset_2";
+   sset_names[2] = "sset_3";
+   sset_names[3] = "sset_4";
+   sset_names[4] = "sset_5";
+
+   error = ex_put_names(exoid, EX_SIDE_SET, sset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars);
+   printf ("after ex_put_variable_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_variable_names (exoid, EX_GLOBAL, num_glo_vars, var_names);
+   printf ("after ex_put_variable_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_variable_param (exoid, EX_NODAL, num_nod_vars);
+   printf ("after ex_put_variable_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, var_names);
+   printf ("after ex_put_variable_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_variable_param (exoid, EX_ELEM_BLOCK, num_ele_vars);
+   printf ("after ex_put_variable_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_variable_names (exoid, EX_ELEM_BLOCK, num_ele_vars, var_names);
+   printf ("after ex_put_variable_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   {
+     num_nset_vars = 3;
+     
+     var_names[0] = "ns_var0";
+     var_names[1] = "ns_var1";
+     var_names[2] = "ns_var2";
+     
+     error = ex_put_variable_param (exoid, EX_NODE_SET, num_nset_vars);
+     printf ("after ex_put_variable_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_variable_names (exoid, EX_NODE_SET, num_nset_vars, var_names);
+     printf ("after ex_put_variable_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     num_sset_vars = 3;
+
+     var_names[0] = "ss_var0";
+     var_names[1] = "ss_var1";
+     var_names[2] = "ss_var2";
+     
+     error = ex_put_variable_param (exoid, EX_SIDE_SET, num_sset_vars);
+     printf ("after ex_put_variable_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_variable_names (exoid, EX_SIDE_SET, num_sset_vars, var_names);
+     printf ("after ex_put_variable_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+   sset_var_vals = (float *) calloc (10, CPU_word_size);
+   nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++) {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+     /* write nodal variables */
+     for (k=1; k<=num_nod_vars; k++) {
+       for (j=0; j<num_nodes; j++) {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+       error = ex_put_var(exoid, whole_time_step, EX_NODAL,
+			  k, 0, num_nodes, nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+     }
+
+     /* write element variables */
+     for (k=1; k<=num_ele_vars; k++) {
+       for (j=0; j<num_elem_blk; j++) {
+         for (m=0; m<num_elem_in_block[j]; m++) {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_var(exoid, whole_time_step, EX_ELEM_BLOCK,
+			    k, ebids[j], num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     /* write sideset variables */
+     for (k=1; k<=num_sset_vars; k++) {
+       for (j=0; j<num_side_sets; j++) {
+         for (m=0; m<num_face_in_sset[j]; m++) {
+           sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+                              ((float)(m+1)*time_value);
+           /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+         }
+         error = ex_put_var(exoid, whole_time_step, EX_SIDE_SET,
+			    k, ssids[j], num_face_in_sset[j], sset_var_vals);
+         printf ("after ex_put_sset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     /* write nodeset variables */
+     for (k=1; k<=num_nset_vars; k++) {
+       for (j=0; j<num_node_sets; j++) {
+         for (m=0; m<num_nodes_in_nset[j]; m++) {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+	     ((float)(m+1)*time_value);
+           /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+         }
+         error = ex_put_var(exoid, whole_time_step, EX_NODE_SET,
+			    k, nsids[j], num_nodes_in_nset[j], nset_var_vals);
+         printf ("after ex_put_nset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   free(sset_var_vals);
+   free(nset_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-zeroe.c b/exodus/cbind/test/testwt-zeroe.c
new file mode 100644
index 0000000..1f26c8e
--- /dev/null
+++ b/exodus/cbind/test/testwt-zeroe.c
@@ -0,0 +1,473 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+/* #include "netcdf.h" */
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m;
+   int node_list[100];
+   int ebids[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 0;
+   num_elem_blk = 0;
+   num_node_sets = 2;
+   num_side_sets = 0;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* 3d Tri */
+   x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+   x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+   x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write individual node sets */
+
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 0;
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-zeroe.dmp b/exodus/cbind/test/testwt-zeroe.dmp
new file mode 100644
index 0000000..4bd865b
--- /dev/null
+++ b/exodus/cbind/test/testwt-zeroe.dmp
@@ -0,0 +1,185 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_node_sets = 2 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+variables:
+	float time_whole(time_step) ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char ns_names(num_node_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ ns_names =
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ node_ns1 = 10, 11, 12, 13, 14 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 20, 21, 22 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28, 1.29, 1.3, 1.31, 1.32, 1.33,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56, 1.58, 1.6, 1.62, 1.64, 1.66,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84, 1.87, 1.9, 1.93, 1.96, 1.99,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68, 2.74, 2.8, 2.86, 2.92, 2.98,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96, 3.03, 3.1, 3.17, 3.24, 3.31,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24, 3.32, 3.4, 3.48, 3.56, 3.64,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52, 3.61, 3.7, 3.79, 3.88, 3.97,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 
+    4.1, 4.2, 4.3 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28, 2.29, 2.3, 2.31, 2.32, 2.33,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56, 2.58, 2.6, 2.62, 2.64, 2.66,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84, 2.87, 2.9, 2.93, 2.96, 2.99,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12, 3.16, 3.2, 3.24, 3.28, 3.32,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68, 3.74, 3.8, 3.86, 3.92, 3.98,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96, 4.03, 4.1, 4.17, 4.24, 4.31,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24, 4.32, 4.4, 4.48, 4.56, 4.64,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52, 4.61, 4.7, 4.79, 4.88, 4.97,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 
+    5.1, 5.2, 5.3 ;
+
+ name_nod_var =
+  "node_variable_a_very_long_name_0",
+  "nod_var1" ;
+}
diff --git a/exodus/cbind/test/testwt-zeron.c b/exodus/cbind/test/testwt-zeron.c
new file mode 100644
index 0000000..80ed50d
--- /dev/null
+++ b/exodus/cbind/test/testwt-zeron.c
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+/* #include "netcdf.h" */
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_node_sets, num_side_sets, error;
+   int i, j;
+   int  num_qa_rec, num_info;
+   int num_glo_vars;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+
+   float *glob_var_vals;
+   float time_value;
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 1;
+   num_nodes = 0;
+   num_elem = 0;
+   num_elem_blk = 0;
+   num_node_sets = 0;
+   num_side_sets = 0;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt-zeron.dmp b/exodus/cbind/test/testwt-zeron.dmp
new file mode 100644
index 0000000..85a5cef
--- /dev/null
+++ b/exodus/cbind/test/testwt-zeron.dmp
@@ -0,0 +1,62 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 1 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+variables:
+	float time_whole(time_step) ;
+	char coor_names(num_dim, len_name) ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ coor_names =
+  "xcoor" ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+}
diff --git a/exodus/cbind/test/testwt.c b/exodus/cbind/test/testwt.c
new file mode 100644
index 0000000..bdc7e3e
--- /dev/null
+++ b/exodus/cbind/test/testwt.c
@@ -0,0 +1,1210 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_face_in_sset[10], num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ssids[10], nsids[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *sset_var_vals, *nset_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float attrib[1], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *block_names[10], *nset_names[10], *sset_names[10];
+   char *prop_names[2], *attrib_names[2];
+   char *title = "This is a test";
+
+   struct ex_block blocks[10];
+   
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 7;
+   num_elem_blk = 7;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   
+   error = ex_put_init (exoid, title, num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* 3d Tri */
+   x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+   x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+   x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodal attributes */
+   error = ex_put_attr_param(exoid, EX_NODAL, 0, 2);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 1, x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 2, y);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Node_attr_1";
+     attrib_names[1] = "Node_attr_2";
+     error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (elem_map);
+
+
+   /* write element block parameters */
+   for (i=0; i < 10; i++) {
+     blocks[i].type = EX_ELEM_BLOCK;
+     blocks[i].id = 0;
+     blocks[i].num_entry = 0;
+     blocks[i].num_nodes_per_entry = 0;
+     blocks[i].num_edges_per_entry = 0;
+     blocks[i].num_faces_per_entry = 0;
+     blocks[i].num_attribute = 0;
+   }
+
+   block_names[0] = "block_1";
+   block_names[1] = "block_2";
+   block_names[2] = "block_3";
+   block_names[3] = "block_4";
+   block_names[4] = "block_5";
+   block_names[5] = "block_6";
+   block_names[6] = "block_7";
+
+   strncpy(blocks[0].topology, "quad", 32);
+   strncpy(blocks[1].topology, "quad", 32);
+   strncpy(blocks[2].topology, "hex", 32);
+   strncpy(blocks[3].topology, "tetra", 32);
+   strncpy(blocks[4].topology, "wedge", 32);
+   strncpy(blocks[5].topology, "tetra", 32);
+   strncpy(blocks[6].topology, "tri", 32);
+
+   blocks[0].num_entry = 1;
+   blocks[1].num_entry = 1;
+   blocks[2].num_entry = 1;
+   blocks[3].num_entry = 1;
+   blocks[4].num_entry = 1;
+   blocks[5].num_entry = 1;
+   blocks[6].num_entry = 1;
+
+   blocks[0].num_attribute = 1;
+   blocks[1].num_attribute = 1;
+   blocks[2].num_attribute = 1;
+   blocks[3].num_attribute = 1;
+   blocks[4].num_attribute = 1;
+   blocks[5].num_attribute = 1;
+   blocks[6].num_attribute = 1;
+
+   blocks[0].num_nodes_per_entry = 4; /* elements in block #1 are 4-node quads  */
+   blocks[1].num_nodes_per_entry = 4; /* elements in block #2 are 4-node quads  */
+   blocks[2].num_nodes_per_entry = 8; /* elements in block #3 are 8-node hexes  */
+   blocks[3].num_nodes_per_entry = 4; /* elements in block #4 are 4-node tetras */
+   blocks[4].num_nodes_per_entry = 6; /* elements in block #5 are 6-node wedges */
+   blocks[5].num_nodes_per_entry = 8; /* elements in block #6 are 8-node tetras */
+   blocks[6].num_nodes_per_entry = 3; /* elements in block #7 are 3-node tris   */
+
+   blocks[0].id = 10;
+   blocks[1].id = 11;
+   blocks[2].id = 12;
+   blocks[3].id = 13;
+   blocks[4].id = 14;
+   blocks[5].id = 15;
+   blocks[6].id = 16;
+
+   /* Generate an error that name is not found since blocks have not
+      yet been defined
+   */
+   error = ex_put_name(exoid, EX_ELEM_BLOCK, blocks[0].id, block_names[0]);
+
+   error = ex_put_block_params(exoid, num_elem_blk, blocks);
+   printf ("after ex_put_block_params, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write element block names */
+   for (i=0; i < num_elem_blk; i++) {
+     error = ex_put_name(exoid, EX_ELEM_BLOCK, blocks[i].id, block_names[i]);
+     printf ("after ex_put_names, error = %d\n", error);
+   }
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+/* write element block properties */
+
+   /*               12345678901234567890123456789012 */
+   prop_names[0] = "MATERIAL_PROPERTY_LONG_NAME_32CH";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[0].id, prop_names[0], 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[1].id, prop_names[0], 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[2].id, prop_names[0], 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[3].id, prop_names[0], 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[4].id, prop_names[0], 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[5].id, prop_names[0], 60);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, blocks[6].id, prop_names[0], 70);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, blocks[0].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, blocks[1].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, blocks[2].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, blocks[3].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, blocks[4].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+   connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+   error = ex_put_elem_conn (exoid, blocks[5].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 31; connect[1] = 32; connect[2] = 33;
+
+   error = ex_put_elem_conn (exoid, blocks[6].id, connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+   /* write element block attributes */
+   attrib[0] = 3.14159;
+   error = ex_put_attr (exoid, EX_ELEM_BLOCK, blocks[0].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, blocks[0].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, blocks[1].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, blocks[2].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, blocks[3].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, blocks[4].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, blocks[5].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, blocks[6].id, attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib_names[0] = "THICKNESS";
+   for (i=0; i < num_elem_blk; i++) {
+     error = ex_put_elem_attr_names (exoid, blocks[i].id, attrib_names);
+     printf ("after ex_put_elem_attr_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual node sets */
+
+
+   num_nodes_in_nset[0] = 5;
+   num_nodes_in_nset[1] = 3;
+
+   nsids[0] = 20;
+   nsids[1] = 21;
+
+   error = ex_put_node_set_param (exoid, nsids[0], 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, nsids[0], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_node_set_param (exoid, nsids[1], 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, nsids[1], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write node set names */
+   nset_names[0] = "nset_1";
+   nset_names[1] = "nset_2";
+
+   error = ex_put_names(exoid, EX_NODE_SET, nset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodeset attributes */
+   error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Nodeset_attribute";
+     error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual side sets */
+   num_face_in_sset[0] =  2;
+   num_face_in_sset[1] =  2;
+   num_face_in_sset[2] =  7;
+   num_face_in_sset[3] =  8;
+   num_face_in_sset[4] = 10;
+   
+   ssids[0] = 30;
+   ssids[1] = 31;
+   ssids[2] = 32;
+   ssids[3] = 33;
+   ssids[4] = 34;
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, ssids[0], 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 8, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+   elem_list[4] = 6; elem_list[5] = 6;
+   elem_list[6] = 6; elem_list[7] = 6;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 1; side_list[5] = 2;
+   side_list[6] = 3; side_list[7] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #5  - wedges and tris */
+
+   error = ex_put_side_set_param (exoid, 34, 10, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5; elem_list[5] = 7;
+   elem_list[6] = 7; elem_list[7] = 7;
+   elem_list[8] = 7; elem_list[9] = 7;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5; side_list[5] = 1;
+   side_list[6] = 2; side_list[7] = 3;
+   side_list[8] = 4; side_list[9] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write side set names */
+   sset_names[0] = "sset_1";
+   sset_names[1] = "sset_2";
+   sset_names[2] = "sset_3";
+   sset_names[3] = "sset_4";
+   sset_names[4] = "sset_5";
+
+   error = ex_put_names(exoid, EX_SIDE_SET, sset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 3;
+   /*              0        1         2         3   */
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "this_variable_name_is_short";
+   var_names[1] = "this_variable_name_is_just_right";
+   var_names[2] = "this_variable_name_is_tooooo_long";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   {
+     num_nset_vars = 3;
+     
+     var_names[0] = "ns_var0";
+     var_names[1] = "ns_var1";
+     var_names[2] = "ns_var2";
+     
+     error = ex_put_var_param (exoid, "m", num_nset_vars);
+     printf ("after ex_put_var_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_var_names (exoid, "m", num_nset_vars, var_names);
+     printf ("after ex_put_var_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     num_sset_vars = 3;
+
+     var_names[0] = "ss_var0";
+     var_names[1] = "ss_var1";
+     var_names[2] = "ss_var2";
+     
+     error = ex_put_var_param (exoid, "s", num_sset_vars);
+     printf ("after ex_put_var_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_var_names (exoid, "s", num_sset_vars, var_names);
+     printf ("after ex_put_var_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+   sset_var_vals = (float *) calloc (10, CPU_word_size);
+   nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<blocks[j].num_entry; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, blocks[j].id,
+                                  blocks[j].num_entry, elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write sideset variables */
+
+     for (k=1; k<=num_sset_vars; k++)
+     {
+       for (j=0; j<num_side_sets; j++)
+       {
+         for (m=0; m<num_face_in_sset[j]; m++)
+         {
+           sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+                              ((float)(m+1)*time_value);
+           /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+         }
+         error = ex_put_sset_var (exoid, whole_time_step, k, ssids[j],
+                                  num_face_in_sset[j], sset_var_vals);
+         printf ("after ex_put_sset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write nodeset variables */
+
+     for (k=1; k<=num_nset_vars; k++)
+     {
+       for (j=0; j<num_node_sets; j++)
+       {
+         for (m=0; m<num_nodes_in_nset[j]; m++)
+         {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+                              ((float)(m+1)*time_value);
+           /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+         }
+         error = ex_put_nset_var (exoid, whole_time_step, k, nsids[j],
+                                  num_nodes_in_nset[j], nset_var_vals);
+         printf ("after ex_put_nset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   free(sset_var_vals);
+   free(nset_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt1.c b/exodus/cbind/test/testwt1.c
new file mode 100644
index 0000000..e70619f
--- /dev/null
+++ b/exodus/cbind/test/testwt1.c
@@ -0,0 +1,920 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt1 - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10], num_attr[10];
+   int num_node_sets, num_side_sets, error;
+   int num_node_maps, num_elem_maps;
+   int i, j, k, m, *elem_map, *connect, *node_map;
+   int node_list[100],elem_list[100],side_list[100];
+   int id, ebids[10], ids[10];
+   int num_nodes_per_set[10], num_elem_per_set[10];
+   int num_df_per_set[10];
+   int df_ind[10], node_ind[10], elem_ind[10];
+   int num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float attrib[100], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *emap_names[2];
+   char *prop_names[2];
+
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+/*   ncopts = NC_VERBOSE;  */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 28;
+   num_elem = 8;
+   num_elem_blk = 7;
+   num_node_sets = 2;
+   num_side_sets = 5;
+   /* num_side_sets = 6; Uncomment to test NULL side sets */
+
+   error = ex_put_init (exoid, "This is testwt1", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Circle #1 */
+   x[20] = 100.0; y[20] = 100.0; z[20] = 0.0;
+
+/* Sphere #1 */
+   x[21] = 50.0; y[21] = 50.0; z[21] = 20.0;
+
+/* Wedge #1 */
+   x[22] =  3.0; y[22] =  0.0; z[22] =  6.0;
+   x[23] =  6.0; y[23] =  0.0; z[23] =  0.0;
+   x[24] =  0.0; y[24] =  0.0; z[24] =  0.0;
+   x[25] =  3.0; y[25] =  2.0; z[25] =  6.0;
+   x[26] =  6.0; y[26] =  2.0; z[26] =  2.0;
+   x[27] =  0.0; y[27] =  2.0; z[27] =  0.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+
+/* write node and element map parameters */
+
+   num_node_maps = 1;
+   num_elem_maps = 2;
+
+   error = ex_put_map_param (exoid, num_node_maps, num_elem_maps);
+
+   printf ("after ex_put_map_param, error = %d\n", error);
+
+/* write element map properties */
+
+   prop_names[0] = "ORDER";
+   prop_names[1] = "NUMBER";
+   error = ex_put_prop_names(exoid,EX_ELEM_MAP,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   id = 111;
+   error = ex_put_elem_map (exoid, id, elem_map);
+   printf ("after ex_put_elem_map, error = %d\n", error);
+
+   free (elem_map);
+
+   error = ex_put_prop(exoid, EX_ELEM_MAP, id, "ORDER", 1);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+/* write element numbering map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i*2;
+   }
+
+   id = 222;
+   /* Output the map 1 element at a time... */
+   for (i=1; i <= num_elem; i++) {
+     error = ex_put_partial_elem_map (exoid, id, i, 1, &elem_map[i-1]);
+     printf ("after ex_put_partial_elem_map, error = %d\n", error);
+   }
+
+   free (elem_map);
+
+   error = ex_put_prop(exoid, EX_ELEM_MAP, id, "NUMBER", 1);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+/* write element map names */
+   emap_names[0] = "Element_Map_111";
+   emap_names[1] = "Element_Map_222";
+
+   error = ex_put_names(exoid, EX_ELEM_MAP, emap_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+/* write node map properties */
+
+   prop_names[0] = "NUMBER";
+   error = ex_put_prop_names(exoid,EX_NODE_MAP,1,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+/* write node numbering map */
+
+   node_map = (int *) calloc(num_nodes, sizeof(int));
+
+   for (i=1; i<=num_nodes; i++)
+   {
+      node_map[i-1] = i*3;
+   }
+
+   id = 333;
+   error = ex_put_node_map (exoid, id, node_map);
+   printf ("after ex_put_node_map, error = %d\n", error);
+
+   error = ex_put_name(exoid, EX_NODE_MAP, id, "Node_Map_111");
+   printf ("after ex_put_name, error = %d\n", error);
+
+   free (node_map);
+
+   error = ex_put_prop(exoid, EX_NODE_MAP, id, "NUMBER", 1);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1; /* element 1: Quad 1 */
+   num_elem_in_block[1] = 2; /* elements 2, 3: Quad 1 & 2 */
+   num_elem_in_block[2] = 1; /* element 4: Hex    */
+   num_elem_in_block[3] = 1; /* element 5: Tetra  */
+   num_elem_in_block[4] = 1; /* element 6: Circle */
+   num_elem_in_block[5] = 1; /* element 7: Sphere */
+   num_elem_in_block[6] = 1; /* element 8: Wedge  */
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem[4] = 1; /* elements in block #4 are 1-node circles */
+   num_nodes_per_elem[5] = 1; /* elements in block #5 are 1-node spheres */
+   num_nodes_per_elem[6] = 6; /* elements in block #6 are 6-node wedges */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+   ebids[5] = 15;
+   ebids[6] = 16;
+
+   num_attr[0] = 3;
+   num_attr[1] = 3;
+   num_attr[2] = 3;
+   num_attr[3] = 3;
+   num_attr[4] = 3;
+   num_attr[5] = 3;
+   num_attr[6] = 3;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], num_attr[0]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], num_attr[1]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], num_attr[2]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], num_attr[3]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[4], "circle", num_elem_in_block[4],
+                               num_nodes_per_elem[4], num_attr[4]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[5], "sphere", num_elem_in_block[5],
+                               num_nodes_per_elem[5], num_attr[5]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[6], "wedge", num_elem_in_block[6],
+                               num_nodes_per_elem[6], num_attr[6]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+/* write element block properties */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], "MATL", 60);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], "MATL", 70);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+   connect[4] = 5; connect[5] = 6; connect[6] = 7; connect[7] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 21;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 22;
+
+   error = ex_put_elem_conn (exoid, ebids[5], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 23; connect[1] = 24; connect[2] = 25;
+   connect[3] = 26; connect[4] = 27; connect[5] = 28;
+
+   error = ex_put_elem_conn (exoid, ebids[6], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   free (connect);
+
+
+/* write element block attributes  (3 per block) */
+
+   attrib[0] = 1.0; attrib[1] = 2.0; attrib[2] = 3.0;
+   attrib[3] = 1.11; attrib[4] = 2.11; attrib[5] = 3.11;
+   attrib[6] = 1.12; attrib[7] = 2.12; attrib[8] = 3.12;
+   attrib[9] = 1.2; attrib[10] = 2.2; attrib[11] = 3.2;
+   attrib[12] = 1.3; attrib[13] = 2.3; attrib[14] = 3.3;
+   attrib[15] = 1.4; attrib[16] = 2.4; attrib[17] = 3.4;
+   attrib[18] = 1.5; attrib[19] = 2.5; attrib[20] = 3.5;
+   attrib[21] = 1.6; attrib[22] = 2.6; attrib[23] = 3.6;
+
+   error = ex_put_elem_attr (exoid, ebids[0], &attrib[0]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[1], &attrib[3]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[2], &attrib[9]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[3], &attrib[12]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[4], &attrib[15]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[5], &attrib[18]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[6], &attrib[21]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+/* write individual node sets */
+
+   /* COMMENTED OUT ...
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   END COMMENTED OUT SECTION */
+
+/* write concatenated node sets; this produces the same information as
+ * the above code which writes individual node sets
+ */
+
+/* THIS SECTION IS NOT COMMENTED OUT */
+
+   ids[0] = 20; ids[1] = 21;
+
+   num_nodes_per_set[0] = 5;
+   num_nodes_per_set[1] = 3;
+   /* num_nodes_per_set[1] = 0; Uncomment to test NULL node sets */
+
+   node_ind[0] = 0; node_ind[1] = 5;
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+   node_list[5] = 20; node_list[6] = 21; node_list[7] = 22;
+
+   num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+   df_ind[0] = 0; df_ind[1] = 5;
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; 
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0; 
+   dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1;
+
+   error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set,
+                                    num_df_per_set, node_ind,
+                                    df_ind, node_list, dist_fact);
+   printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   /* END NOT COMMENTED OUT SECTION */
+
+
+/* write individual side sets */
+
+   /* COMMENTED OUT SECTION ...
+
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 1; elem_list[1] = 1;
+
+   node_list[0] = 1; node_list[1] = 2;
+   node_list[2] = 5; node_list[3] = 6;
+
+   side_list[0] = 1; side_list[1] = 1;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   node_list[0] = 6; node_list[1] = 7;
+   node_list[2] = 7; node_list[3] = 8;
+
+   side_list[0] = 3; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   END COMMENTED OUT SECTION */
+
+/* write concatenated side sets; this produces the same information as
+ * the above code which writes individual side sets
+ */
+
+/* THIS SECTION IS NOT COMMENTED OUT */
+
+   ids[0] = 30;
+   ids[1] = 31;
+   ids[2] = 32;
+   ids[3] = 33;
+   ids[4] = 34;
+   ids[5] = 35;
+
+   /* side set #1  - quad */
+   node_list[0] = 8; node_list[1] = 5; elem_list[0] = 3;
+   node_list[2] = 6; node_list[3] = 7; elem_list[1] = 3;
+
+   /* side set #2  - quad/hex, spanning 2 element types  */
+   node_list[4] = 2; node_list[5] = 3; elem_list[2] = 1; 
+   node_list[6] = 7; node_list[7] = 8; elem_list[3] = 3;
+
+   /* side set #3  - hex */
+   node_list[ 8] =  9; node_list[ 9] = 12;
+   node_list[10] = 11; node_list[11] = 10; elem_list[4] = 4;
+
+   node_list[12] = 11; node_list[13] = 12;
+   node_list[14] = 16; node_list[15] = 15; elem_list[5] = 4;
+ 
+   node_list[16] = 16; node_list[17] = 15;
+   node_list[18] = 11; node_list[19] = 12; elem_list[6] = 4;
+
+   node_list[20] = 10; node_list[21] = 11;
+   node_list[22] = 15; node_list[23] = 14; elem_list[7] = 4;
+
+   node_list[24] = 13; node_list[25] = 16;
+   node_list[26] = 12; node_list[27] =  9; elem_list[8] = 4;
+
+   node_list[28] = 14; node_list[29] = 13;
+   node_list[30] =  9; node_list[31] = 10; elem_list[9] = 4;
+
+   node_list[32] = 16; node_list[33] = 13;
+   node_list[34] = 14; node_list[35] = 15; elem_list[10] = 4;
+
+   /* side set #4  - tetras */
+   node_list[36] = 17; node_list[37] = 18;
+   node_list[38] = 20;                     elem_list[11] = 5;
+
+   node_list[39] = 18; node_list[40] = 19;
+   node_list[41] = 20;                     elem_list[12] = 5;
+
+   node_list[42] = 20; node_list[43] = 19;
+   node_list[44] = 17;                     elem_list[13] = 5;
+
+   node_list[45] = 19; node_list[46] = 18;
+   node_list[47] = 17;                     elem_list[14] = 5;
+
+   /* side set #5  - circle and sphere */
+   node_list[48] = 21;                     elem_list[15] = 6;
+   node_list[49] = 22;                     elem_list[16] = 7;
+
+   /* side set #6  - wedges */
+   node_list[50] = 27; node_list[51] = 26;
+   node_list[52] = 23; node_list[53] = 24; elem_list[17] = 8;
+
+   node_list[54] = 28; node_list[55] = 27;
+   node_list[56] = 24; node_list[57] = 25; elem_list[18] = 8;
+
+   node_list[58] = 28; node_list[59] = 25;
+   node_list[60] = 23; node_list[61] = 26; elem_list[19] = 8;
+
+   node_list[62] = 25; node_list[63] = 24;
+   node_list[64] = 23;                     elem_list[20] = 8;
+
+   node_list[65] = 26; node_list[66] = 27;
+   node_list[67] = 28;                     elem_list[21] = 8;
+
+   node_ind[0] = 0;
+   node_ind[1] = 4;
+   node_ind[2] = 8;
+   node_ind[3] = 36;
+   node_ind[4] = 47;
+   node_ind[5] = 49;
+
+   num_elem_per_set[0] = 2; /* two sides uses 2 elements */
+   num_elem_per_set[1] = 2;
+   num_elem_per_set[2] = 7;
+   num_elem_per_set[3] = 4;
+   num_elem_per_set[4] = 2;
+   num_elem_per_set[5] = 5;
+   /* num_elem_per_set[5] = 0; Uncomment to test NULL side sets */
+
+   num_nodes_per_set[0] = 4;
+   num_nodes_per_set[1] = 4;
+   num_nodes_per_set[2] = 28;
+   num_nodes_per_set[3] = 12;
+   num_nodes_per_set[4] =  2;
+   num_nodes_per_set[5] = 18;
+
+   elem_ind[0] = 0;
+   elem_ind[1] = 2;
+   elem_ind[2] = 4;
+   elem_ind[3] = 11;
+   elem_ind[4] = 15;
+   elem_ind[5] = 17;
+
+/* side set 0 
+   side_list[0]= 4; side_list[1]= 2;*/
+/* side set 1
+   side_list[2]= 2; side_list[3]= 3; */
+/* side set 2 
+   side_list[4]= 5; side_list[5]= 3;
+   side_list[6]= 3; side_list[7]= 2;
+   side_list[8]= 4; side_list[9]= 1;
+   side_list[10]= 6;*/
+/* side set 3
+   side_list[11]= 1; side_list[12]= 2;
+   side_list[13]= 3; side_list[14]= 4; */
+/* side set 4
+   side_list[15] = 1; side_list[16] = 1; */
+/* side set 5 
+   side_list[17]= 1; side_list[18]= 2;
+   side_list[19]= 3; side_list[20]= 4;
+   side_list[21]= 5; */
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set,
+                         num_nodes_per_set,
+                         elem_ind,
+                         node_ind,
+                         elem_list,
+                         node_list,
+                         side_list);
+   printf ("after ex_cvt_nodes_to_sides, error = %d\n", error);
+
+   /* for (i=0;i<num_side_sets;i++)
+   {
+     printf("side set %d\n",i);
+     for (j=0;j<num_elem_per_set[i];j++)
+       printf("  side_list[%d]: %d\n",j,side_list[j+elem_ind[i]]);
+   } */
+
+   num_df_per_set[0] = 4;
+   num_df_per_set[1] = 4;
+   num_df_per_set[2] = 0;
+   num_df_per_set[3] = 0;
+   num_df_per_set[4] = 0;
+   num_df_per_set[5] = 0;
+
+   df_ind[0] = 0;
+   df_ind[1] = 4;
+
+   /* side set #1 df */
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1;
+   dist_fact[2] = 30.2; dist_fact[3] = 30.3;
+
+   /* side set #2 df */
+   dist_fact[4] = 31.0; dist_fact[5] = 31.1;
+   dist_fact[6] = 31.2; dist_fact[7] = 31.3;
+
+   error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set,
+                                    num_df_per_set, elem_ind, df_ind,
+                                    elem_list, side_list, dist_fact);
+   printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   /* END COMMENTED OUT SECTION */
+
+/* write QA records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT1";
+   qa_record[0][1] = "testwt1";
+   qa_record[0][2] = "03/16/94";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "FASTQ";
+   qa_record[1][1] = "fastq";
+   qa_record[1][2] = "07/07/93";
+   qa_record[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+
+/* write information records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "This is the second information record.";
+   info[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_name(exoid, "g", 1, var_names[0]);
+   printf ("after ex_put_var_name, error = %d\n", error);
+
+
+   num_nod_vars = 2;
+
+   var_names[0] = "nod_var0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k] = k+1;
+         k++;
+      }
+   }
+
+   truth_tab[6] = 0;
+
+   /* commented out to test ex_get_elem_var_tab in testrd1
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error); */
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         if (k == 1 && j == 2)
+           continue; /* skip element block 3, variable 1 */
+         else
+         {
+           error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+           printf ("after ex_put_elem_var, error = %d\n", error);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt2.c b/exodus/cbind/test/testwt2.c
new file mode 100644
index 0000000..cf1219c
--- /dev/null
+++ b/exodus/cbind/test/testwt2.c
@@ -0,0 +1,1279 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt2 - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines. It tests multiple simultaneous output files.
+*
+*
+*****************************************************************************/
+
+#define EX_TEST_INDIV_NODESET
+#define EX_TEST_INDIV_SIDESET
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "exodusII.h"
+#include "netcdf.h"
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int exoid2, num_dim2, num_nodes2, num_elem2,num_elem_blk2;
+   int num_elem_in_block[10], num_node_sets, num_nodes_per_elem[10];
+   int num_elem_in_block2[10], num_node_sets2, num_nodes_per_elem2[10];
+   int num_side_sets, error;
+   int num_side_sets2;
+   int i, j, k, m;
+   int *elem_map, *connect, node_list[100],elem_list[100],side_list[100];
+   int *elem_map2, *connect2, node_list2[100],elem_list2[100],side_list2[100];
+   int ebids[10];
+   int ebids2[10];
+   int num_qa_rec, num_info;
+   int num_qa_rec2,num_info2;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int num_glo_vars2, num_nod_vars2, num_ele_vars2;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float time_value;
+   float time_value2;
+   float x[100], y[100], z[100];
+   float attrib[1], dist_fact[100];
+   float attrib2[1], dist_fact2[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *coord_names2[3], *qa_record2[2][4], *info2[3], *var_names2[3];
+   char *prop_names[2];
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II files (a "regular" and a "history") */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   exoid2= ex_create ("test2.exo",      /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test2.exo, exoid = %d\n", exoid2);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 26;
+   num_elem = 5;
+   num_elem_blk = 5;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+
+
+/* initialize file 2 with parameters */
+
+   num_dim2 = 3;
+   num_nodes2 = 26;
+   num_elem2 = 5;
+   num_elem_blk2 = 5;
+   num_node_sets2 = 2;
+   num_side_sets2 = 5;
+
+   error = ex_put_init (exoid2, "This is test 2",num_dim2,num_nodes2,num_elem2,
+                        num_elem_blk2, num_node_sets2, num_side_sets2);
+
+   printf ("after ex_put_init (2), error = %d\n", error);
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+/* write nodal coordinates values and names to database 2 */
+
+   error = ex_put_coord (exoid2, x, y, z);
+   printf ("after ex_put_coord (2), error = %d\n", error);
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   coord_names2[0] = "xcoor";
+   coord_names2[1] = "ycoor";
+   coord_names2[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid2, coord_names2);
+   printf ("after ex_put_coord_names (2), error = %d\n", error);
+
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   free (elem_map);
+
+   elem_map2= (int *) calloc(num_elem2, sizeof(int));
+
+   for (i=1; i<=num_elem2; i++)
+   {
+      elem_map2[i-1] = i;
+   }
+
+   error = ex_put_map (exoid2, elem_map2);
+   printf ("after ex_put_map (2), error = %d\n", error);
+
+   free (elem_map2);
+
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #3 are 6-node wedges */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                              num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+/* write element block properties */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+
+
+   num_elem_in_block2[0] = 1;
+   num_elem_in_block2[1] = 1;
+   num_elem_in_block2[2] = 1;
+   num_elem_in_block2[3] = 1;
+   num_elem_in_block2[4] = 1;
+
+   num_nodes_per_elem2[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem2[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem2[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem2[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem2[4] = 6; /* elements in block #3 are 6-node wedges */
+
+   ebids2[0] = 10;
+   ebids2[1] = 11;
+   ebids2[2] = 12;
+   ebids2[3] = 13;
+   ebids2[4] = 14;
+
+
+   error = ex_put_elem_block (exoid2, ebids2[0], "quad", num_elem_in_block2[0],
+                              num_nodes_per_elem2[0], 1);
+   printf ("after ex_put_elem_block (2), error = %d\n", error);
+
+   error = ex_put_elem_block (exoid2, ebids2[1], "quad", num_elem_in_block2[1],
+                              num_nodes_per_elem2[1], 1);
+   printf ("after ex_put_elem_blocki (2), error = %d\n", error);
+
+   error = ex_put_elem_block (exoid2, ebids2[2], "hex", num_elem_in_block2[2],
+                               num_nodes_per_elem2[2], 1);
+   printf ("after ex_put_elem_blocki (2), error = %d\n", error);
+
+   error = ex_put_elem_block (exoid2, ebids2[3], "tetra", num_elem_in_block2[3],
+                               num_nodes_per_elem2[3], 1);
+   printf ("after ex_put_elem_block (2), error = %d\n", error);
+
+   error = ex_put_elem_block (exoid2, ebids2[4], "wedge", num_elem_in_block2[4],
+                               num_nodes_per_elem2[4], 1);
+   printf ("after ex_put_elem_block (2), error = %d\n", error);
+
+
+/* write element block properties for file 2 */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid2,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names (2), error = %d\n", error);
+
+   error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ebids[0], "MATL", 100);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+   error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ebids[1], "MATL", 200);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+   error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ebids[2], "MATL", 300);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+   error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ebids[3], "MATL", 400);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+   error = ex_put_prop(exoid2, EX_ELEM_BLOCK, ebids[4], "MATL", 500);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   free (connect);
+
+   connect2 = (int *) calloc(8, sizeof(int));
+   connect2[0] = 1; connect2[1] = 2; connect2[2] = 3; connect2[3] = 4;
+
+   error = ex_put_elem_conn (exoid2, ebids2[0], connect2);
+   printf ("after ex_put_elem_conn (2), error = %d\n", error);
+
+   connect2[0] = 5; connect2[1] = 6; connect2[2] = 7; connect2[3] = 8;
+
+   error = ex_put_elem_conn (exoid2, ebids2[1], connect2);
+   printf ("after ex_put_elem_conn (2), error = %d\n", error);
+
+   connect2[0] = 9; connect2[1] = 10; connect2[2] = 11; connect2[3] = 12;
+   connect2[4] = 13; connect2[5] = 14; connect2[6] = 15; connect2[7] = 16;
+
+   error = ex_put_elem_conn (exoid2, ebids2[2], connect2);
+   printf ("after ex_put_elem_conn (2), error = %d\n", error);
+
+   connect2[0] = 17; connect2[1] = 18; connect2[2] = 19; connect2[3] = 20;
+
+   error = ex_put_elem_conn (exoid2, ebids2[3], connect2);
+   printf ("after ex_put_elem_conn (2), error = %d\n", error);
+
+   connect2[0] = 21; connect2[1] = 22; connect2[2] = 23;
+   connect2[3] = 24; connect2[4] = 25; connect2[5] = 26;
+
+   error = ex_put_elem_conn (exoid2, ebids2[4], connect2);
+   printf ("after ex_put_elem_conn (2), error = %d\n", error);
+
+
+   free (connect2);
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   attrib2[0] = 3.;
+   error = ex_put_elem_attr (exoid2, ebids2[0], attrib2);
+   printf ("after ex_put_elem_attr (2), error = %d\n", error);
+
+   attrib2[0] = 6.;
+   error = ex_put_elem_attr (exoid2, ebids2[1], attrib2);
+   printf ("after ex_put_elem_attr (2), error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid2, ebids2[2], attrib2);
+   printf ("after ex_put_elem_attr (2), error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid2, ebids2[3], attrib2);
+   printf ("after ex_put_elem_attr (2), error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid2, ebids2[4], attrib2);
+   printf ("after ex_put_elem_attr (2), error = %d\n", error);
+
+#ifdef EX_TEST_INDIV_NODESET
+/* write individual node sets */
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set, error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+/* file 2 */
+   error = ex_put_node_set_param (exoid2, 20, 5, 5);
+   printf ("after ex_put_node_set_param (2), error = %d\n", error);
+
+   node_list2[0] = 10; node_list2[1] = 11; node_list2[2] = 12; 
+   node_list2[3] = 13; node_list2[4] = 14; 
+
+   dist_fact2[0] = 1.0; dist_fact2[1] = 2.0; dist_fact2[2] = 3.0;
+   dist_fact2[3] = 4.0; dist_fact2[4] = 5.0;
+
+   error = ex_put_node_set (exoid2, 20, node_list2);
+   printf ("after ex_put_node_set (2), error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid2, 20, dist_fact2);
+   printf ("after ex_put_node_set (2), error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid2, 21, 3, 3);
+   printf ("after ex_put_node_set_param (2), error = %d\n", error);
+
+   node_list2[0] = 20; node_list2[1] = 21; node_list2[2] = 22; 
+
+   dist_fact2[0] = 1.1; dist_fact2[1] = 2.1; dist_fact2[2] = 3.1;
+
+   error = ex_put_node_set (exoid2, 21, node_list2);
+   printf ("after ex_put_node_set (2), error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid2, 21, dist_fact2);
+   printf ("after ex_put_node_set (2), error = %d\n", error);
+
+   error = ex_put_prop(exoid2, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+
+   error = ex_put_prop(exoid2, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid2, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+
+#else /* EX_TEST_INDIV_NODESET */
+/* write concatenated node sets; this produces the same information as
+ * the above code which writes individual node sets
+ */
+
+   ids[0] = 20; ids[1] = 21;
+
+   num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3;
+
+   node_ind[0] = 0; node_ind[1] = 5;
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+   node_list[5] = 20; node_list[6] = 21; node_list[7] = 22;
+
+   num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+   df_ind[0] = 0; df_ind[1] = 5;
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; 
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0; 
+   dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1;
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set,
+                                    num_df_per_set, node_ind,
+                                    df_ind, node_list, dist_fact);
+   printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   error = ex_put_concat_node_sets (exoid2, ids, num_nodes_per_set,
+                                    num_df_per_set, node_ind,
+                                    df_ind, node_list, dist_fact);
+   printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+
+   error = ex_put_prop(exoid2, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid2, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop_array(exoid2, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+#endif /* EX_TEST_INDIV_NODESET */
+
+#ifdef EX_TEST_INDIV_SIDESET
+/* write individual side sets */
+
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 4, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* side set #5  - wedges */
+
+   error = ex_put_side_set_param (exoid, 34, 5, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+/* file 2 */
+   error = ex_put_side_set_param (exoid2, 30, 2, 4);
+   printf ("after ex_put_side_set_param (2), error = %d\n", error);
+
+   elem_list2[0] = 2; elem_list2[1] = 2;
+
+   side_list2[0] = 4; side_list2[1] = 2;
+
+   dist_fact2[0] = 30.0; dist_fact2[1] = 30.1; dist_fact2[2] = 30.2;
+   dist_fact2[3] = 30.3;
+
+   error = ex_put_side_set (exoid2, 30, elem_list2, side_list2);
+   printf ("after ex_put_side_set (2), error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid2, 30, dist_fact2);
+   printf ("after ex_put_side_set_dist_fact (2), error = %d\n", error);
+
+
+   error = ex_put_side_set_param (exoid2, 31, 2, 4);
+   printf ("after ex_put_side_set_param (2), error = %d\n", error);
+
+   elem_list2[0] = 1; elem_list2[1] = 2;
+
+   side_list2[0] = 2; side_list2[1] = 3;
+
+   dist_fact2[0] = 31.0; dist_fact2[1] = 31.1; dist_fact2[2] = 31.2;
+   dist_fact2[3] = 31.3;
+
+   error = ex_put_side_set (exoid2, 31, elem_list2, side_list2);
+   printf ("after ex_put_side_set (2), error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid2, 31, dist_fact2);
+   printf ("after ex_put_side_set_dist_fact (2), error = %d\n", error);
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid2, 32, 7, 0);
+   printf ("after ex_put_side_set_param (2), error = %d\n", error);
+
+   elem_list2[0] = 3; elem_list2[1] = 3;
+   elem_list2[2] = 3; elem_list2[3] = 3;
+   elem_list2[4] = 3; elem_list2[5] = 3;
+   elem_list2[6] = 3;
+
+   side_list2[0] = 5; side_list2[1] = 3;
+   side_list2[2] = 3; side_list2[3] = 2;
+   side_list2[4] = 4; side_list2[5] = 1;
+   side_list2[6] = 6;
+
+   error = ex_put_side_set (exoid2, 32, elem_list2, side_list2);
+   printf ("after ex_put_side_set (2), error = %d\n", error);
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid2, 33, 4, 0);
+   printf ("after ex_put_side_set_param (2), error = %d\n", error);
+
+   elem_list2[0] = 4; elem_list2[1] = 4;
+   elem_list2[2] = 4; elem_list2[3] = 4;
+
+   side_list2[0] = 1; side_list2[1] = 2;
+   side_list2[2] = 3; side_list2[3] = 4;
+
+   error = ex_put_side_set (exoid2, 33, elem_list2, side_list2);
+   printf ("after ex_put_side_set (2), error = %d\n", error);
+
+
+   /* side set #5  - wedges */
+
+   error = ex_put_side_set_param (exoid2, 34, 5, 0);
+   printf ("after ex_put_side_set_param (2), error = %d\n", error);
+
+   elem_list2[0] = 5; elem_list2[1] = 5;
+   elem_list2[2] = 5; elem_list2[3] = 5;
+   elem_list2[4] = 5;
+
+   side_list2[0] = 1; side_list2[1] = 2;
+   side_list2[2] = 3; side_list2[3] = 4;
+   side_list2[4] = 5;
+
+   error = ex_put_side_set (exoid2, 34, elem_list2, side_list2);
+   printf ("after ex_put_side_set (2), error = %d\n", error);
+
+#else /* EX_TEST_INDIV_SIDESET */
+
+/* write concatenated side sets; this produces the same information as
+ * the above code which writes individual side sets
+ */
+
+   ids[0] = 30;
+   ids[1] = 31;
+   ids[2] = 32;
+   ids[3] = 33;
+   ids[4] = 34;
+
+   node_list[0] = 8; node_list[1] = 5;
+   node_list[2] = 6; node_list[3] = 7;
+
+   node_list[4] = 2; node_list[5] = 3;
+   node_list[6] = 7; node_list[7] = 8;
+
+   node_list[8] = 9; node_list[9] = 12;
+   node_list[10] = 11; node_list[11] = 10;
+
+   node_list[12] = 11; node_list[13] = 12;
+   node_list[14] = 16; node_list[15] = 15;
+
+   node_list[16] = 16; node_list[17] = 15;
+   node_list[18] = 11; node_list[19] = 12;
+
+   node_list[20] = 10; node_list[21] = 11;
+   node_list[22] = 15; node_list[23] = 14;
+
+   node_list[24] = 13; node_list[25] = 16;
+   node_list[26] = 12; node_list[27] =  9;
+
+   node_list[28] = 14; node_list[29] = 13;
+   node_list[30] =  9; node_list[31] = 10;
+
+   node_list[32] = 16; node_list[33] = 13;
+   node_list[34] = 14; node_list[35] = 15;
+
+   node_list[36] = 17; node_list[37] = 18;
+   node_list[38] = 20;
+
+   node_list[39] = 18; node_list[40] = 19;
+   node_list[41] = 20;
+
+   node_list[42] = 20; node_list[43] = 19;
+   node_list[44] = 17;
+
+   node_list[45] = 19; node_list[46] = 18;
+   node_list[47] = 17;
+
+   node_list[48] = 25; node_list[49] = 24;
+   node_list[50] = 21; node_list[51] = 22;
+
+   node_list[52] = 26; node_list[53] = 25;
+   node_list[54] = 22; node_list[55] = 23;
+
+   node_list[56] = 26; node_list[57] = 23;
+   node_list[58] = 21; node_list[59] = 24;
+
+   node_list[60] = 23; node_list[61] = 22;
+   node_list[62] = 21;
+
+   node_list[63] = 24; node_list[64] = 25;
+   node_list[65] = 26;
+
+   node_ind[0] = 0;
+   node_ind[1] = 4;
+   node_ind[2] = 8;
+   node_ind[3] = 36;
+   node_ind[4] = 47;
+
+   num_elem_per_set[0] = 2;
+   num_elem_per_set[1] = 2;
+   num_elem_per_set[2] = 7;
+   num_elem_per_set[3] = 4;
+   num_elem_per_set[4] = 5;
+
+   num_nodes_per_set[0] = 4;
+   num_nodes_per_set[1] = 4;
+   num_nodes_per_set[2] = 28;
+   num_nodes_per_set[3] = 12;
+   num_nodes_per_set[4] = 18;
+
+   elem_ind[0] = 0;
+   elem_ind[1] = 2;
+   elem_ind[2] = 4;
+   elem_ind[3] = 11;
+   elem_ind[4] = 15;
+
+   elem_list[0] = 2; elem_list[1] = 2;
+   elem_list[2] = 1; elem_list[3] = 2;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3; elem_list[7] = 3;
+   elem_list[8] = 3; elem_list[9] = 3;
+   elem_list[10] = 3; elem_list[11] = 4;
+   elem_list[12] = 4; elem_list[13] = 4;
+   elem_list[14] = 4; elem_list[15] = 5;
+   elem_list[16] = 5; elem_list[17] = 5;
+   elem_list[18] = 5; elem_list[19] = 5;
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set,
+                         num_nodes_per_set,
+                         elem_ind,
+                         node_ind,
+                         elem_list,
+                         node_list,
+                         side_list);
+   printf ("after ex_cvt_nodes_to_sides, error = %d\n", error);
+
+   num_df_per_set[0] = 4;
+   num_df_per_set[1] = 4;
+   num_df_per_set[2] = 0;
+   num_df_per_set[3] = 0;
+   num_df_per_set[4] = 0;
+
+   df_ind[0] = 0;
+   df_ind[1] = 4;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1;
+   dist_fact[2] = 30.2; dist_fact[3] = 30.3;
+
+   dist_fact[4] = 31.0; dist_fact[5] = 31.1;
+   dist_fact[6] = 31.2; dist_fact[7] = 31.3;
+
+   error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set,
+                                    num_df_per_set, elem_ind, df_ind,
+                                    elem_list, side_list, dist_fact);
+   printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+/* file 2 */
+
+   ids2[0] = 30;
+   ids2[1] = 31;
+   ids2[2] = 32;
+   ids2[3] = 33;
+   ids2[4] = 34;
+
+   node_list2[0] = 8; node_list2[1] = 5;
+   node_list2[2] = 6; node_list2[3] = 7;
+
+   node_list2[4] = 2; node_list2[5] = 3;
+   node_list2[6] = 7; node_list2[7] = 8;
+
+   node_list2[8] = 9; node_list2[9] = 12;
+   node_list2[10] = 11; node_list2[11] = 10;
+
+   node_list2[12] = 11; node_list2[13] = 12;
+   node_list2[14] = 16; node_list2[15] = 15;
+
+   node_list2[16] = 16; node_list2[17] = 15;
+   node_list2[18] = 11; node_list2[19] = 12;
+
+   node_list2[20] = 10; node_list2[21] = 11;
+   node_list2[22] = 15; node_list2[23] = 14;
+
+   node_list2[24] = 13; node_list2[25] = 16;
+   node_list2[26] = 12; node_list2[27] =  9;
+
+   node_list2[28] = 14; node_list2[29] = 13;
+   node_list2[30] =  9; node_list2[31] = 10;
+
+   node_list2[32] = 16; node_list2[33] = 13;
+   node_list2[34] = 14; node_list2[35] = 15;
+
+   node_list2[36] = 17; node_list2[37] = 18;
+   node_list2[38] = 20;
+
+   node_list2[39] = 18; node_list2[40] = 19;
+   node_list2[41] = 20;
+
+   node_list2[42] = 20; node_list2[43] = 19;
+   node_list2[44] = 17;
+
+   node_list2[45] = 19; node_list2[46] = 18;
+   node_list2[47] = 17;
+
+   node_list2[48] = 25; node_list2[49] = 24;
+   node_list2[50] = 21; node_list2[51] = 22;
+
+   node_list2[52] = 26; node_list2[53] = 25;
+   node_list2[54] = 22; node_list2[55] = 23;
+
+   node_list2[56] = 26; node_list2[57] = 23;
+   node_list2[58] = 21; node_list2[59] = 24;
+
+   node_list2[60] = 23; node_list2[61] = 22;
+   node_list2[62] = 21;
+
+   node_list2[63] = 24; node_list2[64] = 25;
+   node_list2[65] = 26;
+
+   node_ind2[0] = 0;
+   node_ind2[1] = 4;
+   node_ind2[2] = 8;
+   node_ind2[3] = 36;
+   node_ind2[4] = 47;
+
+   num_elem_per_set2[0] = 2;
+   num_elem_per_set2[1] = 2;
+   num_elem_per_set2[2] = 7;
+   num_elem_per_set2[3] = 4;
+   num_elem_per_set2[4] = 5;
+
+   num_nodes_per_set2[0] = 4;
+   num_nodes_per_set2[1] = 4;
+   num_nodes_per_set2[2] = 28;
+   num_nodes_per_set2[3] = 12;
+   num_nodes_per_set2[4] = 18;
+
+   elem_ind2[0] = 0;
+   elem_ind2[1] = 2;
+   elem_ind2[2] = 4;
+   elem_ind2[3] = 11;
+   elem_ind2[4] = 15;
+
+   elem_list2[0] = 2; elem_list2[1] = 2;
+   elem_list2[2] = 1; elem_list2[3] = 2;
+   elem_list2[4] = 3; elem_list2[5] = 3;
+   elem_list2[6] = 3; elem_list2[7] = 3;
+   elem_list2[8] = 3; elem_list2[9] = 3;
+   elem_list2[10] = 3; elem_list2[11] = 4;
+   elem_list2[12] = 4; elem_list2[13] = 4;
+   elem_list2[14] = 4; elem_list2[15] = 5;
+   elem_list2[16] = 5; elem_list2[17] = 5;
+   elem_list2[18] = 5; elem_list2[19] = 5;
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set2,
+                         num_nodes_per_set2,
+                         elem_ind2,
+                         node_ind2,
+                         elem_list2,
+                         node_list2,
+                         side_list2);
+   printf ("after ex_cvt_nodes_to_sides (2), error = %d\n", error);
+
+   num_df_per_set2[0] = 4;
+   num_df_per_set2[1] = 4;
+   num_df_per_set2[2] = 0;
+   num_df_per_set2[3] = 0;
+   num_df_per_set2[4] = 0;
+
+   df_ind2[0] = 0;
+   df_ind2[1] = 4;
+
+   dist_fact2[0] = 30.0; dist_fact2[1] = 30.1;
+   dist_fact2[2] = 30.2; dist_fact2[3] = 30.3;
+
+   dist_fact2[4] = 31.0; dist_fact2[5] = 31.1;
+   dist_fact2[6] = 31.2; dist_fact2[7] = 31.3;
+
+   error = ex_put_concat_side_sets (exoid2, ids2, num_elem_per_set2,
+                                    num_df_per_set2, elem_ind2, df_ind2,
+                                    elem_list2, side_list2, dist_fact2);
+   printf ("after ex_put_concat_side_sets (2), error = %d\n", error);
+
+
+#endif /* EX_TEST_INDIV_SIDESET */
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid2, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+
+   error = ex_put_prop(exoid2, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop (2), error = %d\n", error);
+
+
+/* write QA records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT2";
+   qa_record[0][1] = "testwt2";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "FASTQ";
+   qa_record[1][1] = "fastq";
+   qa_record[1][2] = "07/07/93";
+   qa_record[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   num_qa_rec2 = 2;
+
+   qa_record2[0][0] = "TESTWT2";
+   qa_record2[0][1] = "testwt2";
+   qa_record2[0][2] = "07/07/93";
+   qa_record2[0][3] = "15:41:33";
+   qa_record2[1][0] = "FASTQ";
+   qa_record2[1][1] = "fastq";
+   qa_record2[1][2] = "07/07/93";
+   qa_record2[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid2, num_qa_rec2, qa_record2);
+   printf ("after ex_put_qa (2), error = %d\n", error);
+
+
+/* write information records */
+
+   num_info = 3;
+
+   info[0] = "This is the first information record.";
+   info[1] = "This is the second information record.";
+   info[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   num_info2 = 3;
+
+   info2[0] = "This is the first information record.";
+   info2[1] = "This is the second information record.";
+   info2[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid2, num_info2, info2);
+   printf ("after ex_put_info (2), error = %d\n", error);
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_glo_vars2 = 1;
+
+   var_names2[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid2, "g", num_glo_vars2);
+   printf ("after ex_put_var_param (2), error = %d\n", error);
+   error = ex_put_var_names (exoid2, "g", num_glo_vars2, var_names2);
+   printf ("after ex_put_var_names (2), error = %d\n", error);
+
+   num_nod_vars = 2;
+
+   var_names[0] = "nod_var0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_nod_vars2 = 2;
+
+   var_names2[0] = "nod_var0";
+   var_names2[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid2, "n", num_nod_vars2);
+   printf ("after ex_put_var_param (2), error = %d\n", error);
+   error = ex_put_var_names (exoid2, "n", num_nod_vars2, var_names2);
+   printf ("after ex_put_var_names (2), error = %d\n", error);
+
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_ele_vars2 = 3;
+
+   var_names2[0] = "ele_var20";
+   var_names2[1] = "ele_var21";
+   var_names2[2] = "ele_var22";
+
+   error = ex_put_var_param (exoid2, "e", num_ele_vars2);
+   printf ("after ex_put_var_param (2), error = %d\n", error);
+   error = ex_put_var_names (exoid2, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names (2), error = %d\n", error);
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   error = ex_put_elem_var_tab (exoid2, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab (2), error = %d\n", error);
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays hist_var_vals, glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, sizeof(CPU_word_size));
+   nodal_var_vals = (float *) calloc (num_nodes, sizeof(CPU_word_size));
+   elem_var_vals = (float *) calloc (4, sizeof(CPU_word_size));
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+     time_value2 = (float)(i+1)/100.;
+
+/* write time value to regular file */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     error = ex_put_time (exoid2, whole_time_step, &time_value2);
+     printf ("after ex_put_time (2), error = %d\n", error);
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     } 
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     error = ex_put_glob_vars (exoid2, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars (2), error = %d\n", error);
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+
+       error = ex_put_nodal_var (exoid2, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var (2), error = %d\n", error);
+     } 
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+
+         error = ex_put_elem_var (exoid2, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var (2), error = %d\n", error);
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     error = ex_update (exoid2);
+     printf ("after ex_update (2), error = %d\n", error);
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   error = ex_close (exoid2);
+   printf ("after ex_close (2), error = %d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt_clb.c b/exodus/cbind/test/testwt_clb.c
new file mode 100644
index 0000000..e03c4a8
--- /dev/null
+++ b/exodus/cbind/test/testwt_clb.c
@@ -0,0 +1,999 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+  int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+  int num_elem_in_block[10], num_nodes_per_elem[10];
+  int num_node_sets, num_side_sets, error;
+  int i, j, k, kk, m, *elem_map, *connect;
+  int node_list[100],elem_list[100],side_list[100];
+  int ebids[10], ssids[10], nsids[10], nattr[10];
+  int num_nodes_per_set[10], num_elem_per_set[10];
+  int num_df_per_set[10];
+  int  num_qa_rec, num_info;
+  int num_glo_vars, num_nod_vars, num_ele_vars, num_nset_vars, num_sset_vars;
+  int *truth_tab, *nset_tab, *sset_tab;
+  int whole_time_step, num_time_steps;
+  int CPU_word_size,IO_word_size;
+  int prop_array[2];
+
+  float *glob_var_vals, *nodal_var_vals, *elem_var_vals, *nset_var_vals, *sset_var_vals;
+  float time_value;
+  float x[100], y[100], z[100];
+  float attrib[1], dist_fact[100];
+  char *coord_names[3], *qa_record[2][4], *info[3], *var_names[7];
+  char *prop_names[2];
+  char *eb_type[10];
+   
+  ex_opts (EX_VERBOSE|EX_ABORT);
+
+  /* Specify compute and i/o word size */
+
+  CPU_word_size = 0;                   /* sizeof(float) */
+  IO_word_size = 4;                    /* (4 bytes) */
+
+  /* create EXODUS II file */
+
+  exoid = ex_create ("test.exo",       /* filename path */
+		     EX_CLOBBER,      /* create mode */
+		     &CPU_word_size,  /* CPU float word size in bytes */
+		     &IO_word_size);  /* I/O float word size in bytes */
+  printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+  printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+  /* ncopts = NC_VERBOSE; */
+
+  /* initialize file with parameters */
+
+  num_dim = 3;
+  num_nodes = 33;
+  num_elem = 7;
+  num_elem_blk = 7;
+  num_node_sets = 2;
+  num_side_sets = 5;
+
+  error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+		       num_elem_blk, num_node_sets, num_side_sets);
+
+  printf ("after ex_put_init, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  /* write nodal coordinates values and names to database */
+
+  /* Quad #1 */
+  x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+  x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+  x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+  x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+  /* Quad #2 */
+  x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+  x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+  x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+  x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+  /* Hex #1 */
+  x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+  x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+  x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+  x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+  x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+  x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+  x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+  x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+  /* Tetra #1 */
+  x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+  x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+  x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+  x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+  /* Wedge #1 */
+  x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+  x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+  x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+  x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+  x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+  x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+  /* Tetra #2 */
+  x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+  x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+  x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+  x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+  /* 3d Tri */
+  x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+  x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+  x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+  error = ex_put_coord (exoid, x, y, z);
+  printf ("after ex_put_coord, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  coord_names[0] = "xcoor";
+  coord_names[1] = "ycoor";
+  coord_names[2] = "zcoor";
+
+  error = ex_put_coord_names (exoid, coord_names);
+  printf ("after ex_put_coord_names, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  /* write element order map */
+
+  elem_map = (int *) calloc(num_elem, sizeof(int));
+
+  for (i=1; i<=num_elem; i++)
+    {
+      elem_map[i-1] = i;
+    }
+
+  error = ex_put_map (exoid, elem_map);
+  printf ("after ex_put_map, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  free (elem_map);
+
+
+  /* write element block parameters */
+
+  num_elem_in_block[0] = 1;
+  num_elem_in_block[1] = 1;
+  num_elem_in_block[2] = 1;
+  num_elem_in_block[3] = 1;
+  num_elem_in_block[4] = 1;
+  num_elem_in_block[5] = 1;
+  num_elem_in_block[6] = 1;
+
+  num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+  num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+  num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+  num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */
+  num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */
+  num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */
+  num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris   */
+
+  ebids[0] = 10;
+  ebids[1] = 11;
+  ebids[2] = 12;
+  ebids[3] = 13;
+  ebids[4] = 14;
+  ebids[5] = 15;
+  ebids[6] = 16;
+
+  nattr[0] = nattr[1] = nattr[2] = nattr[3] = 1;
+  nattr[4] = nattr[5] = nattr[6] = 1;
+   
+  eb_type[0] = "quad";
+  eb_type[1] = "quad";
+  eb_type[2] = "hex";
+  eb_type[3] = "tetra";
+  eb_type[4] = "wedge";
+  eb_type[5] = "tetra";
+  eb_type[6] = "tri";
+     
+  error = ex_put_concat_elem_block (exoid, ebids, eb_type,
+				    num_elem_in_block, num_nodes_per_elem,
+				    nattr, 0);
+  printf ("after ex_put_concat_elem_block, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  /* write element block properties */
+
+  prop_names[0] = "MATL";
+  prop_names[1] = "DENSITY";
+  error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+  printf ("after ex_put_prop_names, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], "MATL", 60);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], "MATL", 70);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* write element connectivity */
+
+  connect = (int *) calloc(8, sizeof(int));
+  connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+  error = ex_put_elem_conn (exoid, ebids[0], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+  error = ex_put_elem_conn (exoid, ebids[1], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+  connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+  error = ex_put_elem_conn (exoid, ebids[2], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+  error = ex_put_elem_conn (exoid, ebids[3], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  connect[0] = 21; connect[1] = 22; connect[2] = 23;
+  connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+  error = ex_put_elem_conn (exoid, ebids[4], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+  connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+  error = ex_put_elem_conn (exoid, ebids[5], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  connect[0] = 31; connect[1] = 32; connect[2] = 33;
+
+  error = ex_put_elem_conn (exoid, ebids[6], connect);
+  printf ("after ex_put_elem_conn, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  free (connect);
+
+
+  /* write element block attributes */
+
+  attrib[0] = 3.14159;
+  error = ex_put_elem_attr (exoid, ebids[0], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  attrib[0] = 6.14159;
+  error = ex_put_elem_attr (exoid, ebids[1], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_elem_attr (exoid, ebids[2], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_elem_attr (exoid, ebids[3], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_elem_attr (exoid, ebids[4], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_elem_attr (exoid, ebids[5], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_elem_attr (exoid, ebids[6], attrib);
+  printf ("after ex_put_elem_attr, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  /* write individual node sets */
+
+
+  nsids[0] = 20; nsids[1] = 21;
+  num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3;
+  num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+  error = ex_put_concat_node_sets (exoid, nsids, num_nodes_per_set,
+				   num_df_per_set, 0, 0, 0, 0);
+
+  printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+  node_list[3] = 13; node_list[4] = 14; 
+
+  dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+  dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+  error = ex_put_node_set (exoid, 20, node_list);
+  printf ("after ex_put_node_set, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+  printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+  dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+  error = ex_put_node_set (exoid, 21, node_list);
+  printf ("after ex_put_node_set, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+  printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+  printf ("after ex_put_prop, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+  printf ("after ex_put_prop, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  prop_array[0] = 1000;
+  prop_array[1] = 2000;
+
+  error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+  printf ("after ex_put_prop_array, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  /* Define the sideset params at one time, then write individually */
+  ssids[0] = 30;
+  ssids[1] = 31;
+  ssids[2] = 32;
+  ssids[3] = 33;
+  ssids[4] = 34;
+
+  num_elem_per_set[0] = 2;
+  num_elem_per_set[1] = 2;
+  num_elem_per_set[2] = 7;
+  num_elem_per_set[3] = 8;
+  num_elem_per_set[4] = 10;
+
+  num_df_per_set[0] = 4;
+  num_df_per_set[1] = 4;
+  num_df_per_set[2] = 0;
+  num_df_per_set[3] = 0;
+  num_df_per_set[4] = 0;
+
+  error = ex_put_concat_side_sets (exoid, ssids, num_elem_per_set,
+				   num_df_per_set, 0, 0, 0, 0, 0);
+  printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+  /* write individual side sets */
+
+  /* side set #1  - quad */
+
+  elem_list[0] = 2; elem_list[1] = 2;
+
+  side_list[0] = 4; side_list[1] = 2;
+
+  dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+  dist_fact[3] = 30.3;
+
+  error = ex_put_side_set (exoid, 30, elem_list, side_list);
+  printf ("after ex_put_side_set, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+  printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* side set #2  - quad, spanning 2 elements  */
+
+  elem_list[0] = 1; elem_list[1] = 2;
+
+  side_list[0] = 2; side_list[1] = 3;
+
+  dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+  dist_fact[3] = 31.3;
+
+  error = ex_put_side_set (exoid, 31, elem_list, side_list);
+  printf ("after ex_put_side_set, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+  printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* side set #3  - hex */
+
+  elem_list[0] = 3; elem_list[1] = 3;
+  elem_list[2] = 3; elem_list[3] = 3;
+  elem_list[4] = 3; elem_list[5] = 3;
+  elem_list[6] = 3;
+
+  side_list[0] = 5; side_list[1] = 3;
+  side_list[2] = 3; side_list[3] = 2;
+  side_list[4] = 4; side_list[5] = 1;
+  side_list[6] = 6;
+
+  error = ex_put_side_set (exoid, 32, elem_list, side_list);
+  printf ("after ex_put_side_set, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* side set #4  - tetras */
+
+  elem_list[0] = 4; elem_list[1] = 4;
+  elem_list[2] = 4; elem_list[3] = 4;
+  elem_list[4] = 6; elem_list[5] = 6;
+  elem_list[6] = 6; elem_list[7] = 6;
+
+  side_list[0] = 1; side_list[1] = 2;
+  side_list[2] = 3; side_list[3] = 4;
+  side_list[4] = 1; side_list[5] = 2;
+  side_list[6] = 3; side_list[7] = 4;
+
+  error = ex_put_side_set (exoid, 33, elem_list, side_list);
+  printf ("after ex_put_side_set, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* side set #5  - wedges and tris */
+
+  elem_list[0] = 5; elem_list[1] = 5;
+  elem_list[2] = 5; elem_list[3] = 5;
+  elem_list[4] = 5; elem_list[5] = 7;
+  elem_list[6] = 7; elem_list[7] = 7;
+  elem_list[8] = 7; elem_list[9] = 7;
+
+  side_list[0] = 1; side_list[1] = 2;
+  side_list[2] = 3; side_list[3] = 4;
+  side_list[4] = 5; side_list[5] = 1;
+  side_list[6] = 2; side_list[7] = 3;
+  side_list[8] = 4; side_list[9] = 5;
+
+  error = ex_put_side_set (exoid, 34, elem_list, side_list);
+  printf ("after ex_put_side_set, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+  printf ("after ex_put_prop, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+  printf ("after ex_put_prop, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* write QA records; test empty and just blank-filled records */
+
+  num_qa_rec = 2;
+
+
+  qa_record[0][0] = "TESTWT";
+  qa_record[0][1] = "testwt";
+  qa_record[0][2] = "07/07/93";
+  qa_record[0][3] = "15:41:33";
+  qa_record[1][0] = "";
+  qa_record[1][1] = "                            ";
+  qa_record[1][2] = "";
+  qa_record[1][3] = "                        ";
+
+  error = ex_put_qa (exoid, num_qa_rec, qa_record);
+  printf ("after ex_put_qa, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* write information records; test empty and just blank-filled records */
+
+  num_info = 3;
+
+
+  info[0] = "This is the first information record.";
+  info[1] = "";
+  info[2] = "                                     ";
+
+  error = ex_put_info (exoid, num_info, info);
+  printf ("after ex_put_info, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+
+  /* write results variables parameters and names */
+  num_glo_vars  = 1;
+  num_nod_vars  = 2;
+  num_ele_vars  = 3;
+  num_nset_vars = 4;
+  num_sset_vars = 7;
+
+  truth_tab = (int *) calloc ((num_elem_blk  * num_ele_vars),  sizeof(int));
+  nset_tab  = (int *) calloc ((num_node_sets * num_nset_vars), sizeof(int));
+  sset_tab  = (int *) calloc ((num_side_sets * num_sset_vars), sizeof(int));
+
+  k = 0;
+  for (i=0; i<num_elem_blk; i++) {
+    for (j=0; j<num_ele_vars; j++) {
+      truth_tab[k++] = 1;
+    }
+  }
+   
+  k = 0;
+  for (i=0; i<num_node_sets; i++) {
+    for (j=0; j<num_nset_vars; j++) {
+      if (k%2 == 0)
+	nset_tab[k++] = 1;
+      else
+	nset_tab[k++] = 0;
+    }
+  }
+   
+  k = 0;
+  for (i=0; i<num_side_sets; i++) {
+    for (j=0; j<num_sset_vars; j++) {
+      if (k%2 == 0)
+	sset_tab[k++] = 0;
+      else
+	sset_tab[k++] = 1;
+    }
+  }
+   
+  ex_put_all_var_param(exoid, num_glo_vars, num_nod_vars, num_ele_vars, truth_tab,
+		       num_nset_vars, nset_tab, num_sset_vars, sset_tab);
+  printf ("after ex_put_all_var_param, error = %d\n", error);
+
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  free (truth_tab);
+  free (nset_tab);
+  free (sset_tab);
+   
+  var_names[0] = "glo_vars";
+  error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+  printf ("after ex_put_var_names, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  /*              12345678901234567890123456789012 */
+  var_names[0] = "node_variable_a_very_long_name_0";
+  var_names[1] = "nod_var1";
+  error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+  printf ("after ex_put_var_names, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+
+  var_names[0] = "ele_var0";
+  var_names[1] = "ele_var1";
+  var_names[2] = "ele_var2";
+  error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+  printf ("after ex_put_var_names, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  var_names[0] = "nset_var0";
+  var_names[1] = "nset_var1";
+  var_names[2] = "nset_var2";
+  var_names[3] = "nset_var3";
+  error = ex_put_var_names (exoid, "m", num_nset_vars, var_names);
+  printf ("after ex_put_var_names, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+  var_names[0] = "sset_var0";
+  var_names[1] = "sset_var1";
+  var_names[2] = "sset_var2";
+  var_names[3] = "sset_var3";
+  var_names[4] = "sset_var4";
+  var_names[5] = "sset_var5";
+  var_names[6] = "sset_var6";
+  error = ex_put_var_names (exoid, "s", num_sset_vars, var_names);
+  printf ("after ex_put_var_names, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+
+
+  /* for each time step, write the analysis results;
+   * the code below fills the arrays glob_var_vals, 
+   * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+   * obviously the analysis code will populate these arrays
+   */
+
+  whole_time_step = 1;
+  num_time_steps = 10;
+
+  glob_var_vals =  (float *) calloc (num_glo_vars, CPU_word_size);
+  nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+  elem_var_vals =  (float *) calloc (4, CPU_word_size);
+  nset_var_vals =  (float *) calloc (5, CPU_word_size);
+  sset_var_vals =  (float *) calloc (10, CPU_word_size);
+
+  for (i=0; i<num_time_steps; i++)
+    {
+      time_value = (float)(i+1)/100.;
+
+      /* write time value */
+
+      error = ex_put_time (exoid, whole_time_step, &time_value);
+      printf ("after ex_put_time, error = %d\n", error);
+
+      if (error) {
+	ex_close (exoid);
+	exit(-1);
+      }
+
+      /* write global variables */
+
+      for (j=0; j<num_glo_vars; j++) {
+	glob_var_vals[j] = (float)(j+2) * time_value;
+      }
+
+      error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+				glob_var_vals);
+      printf ("after ex_put_glob_vars, error = %d\n", error);
+
+      if (error) {
+	ex_close (exoid);
+	exit(-1);
+      }
+
+      /* write nodal variables */
+
+      for (k=1; k<=num_nod_vars; k++) {
+	for (j=0; j<num_nodes; j++) {
+	  nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+	}
+
+	error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+				  nodal_var_vals);
+	printf ("after ex_put_nodal_var, error = %d\n", error);
+	if (error) {
+	  ex_close (exoid);
+	  exit(-1);
+	}
+
+      }
+
+      /* write element variables */
+
+      for (k=1; k<=num_ele_vars; k++) {
+	for (j=0; j<num_elem_blk; j++) {
+	  for (m=0; m<num_elem_in_block[j]; m++) {
+	    elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+	      ((float)(m+1)*time_value);
+	  }
+	  error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+				   num_elem_in_block[j], elem_var_vals);
+	  printf ("after ex_put_elem_var, error = %d\n", error);
+	  if (error) {
+	    ex_close (exoid);
+	    exit(-1);
+	  }
+	}
+      }
+
+      /* write nodeset variables */
+
+      kk = 0;
+      for (j=0; j<num_node_sets; j++) {
+	for (k=0; k<num_nset_vars; k++) {
+	  if (kk++ % 2 == 0) {
+	    for (m=0; m<num_nodes_per_set[j]; m++) {
+	      nset_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+		((float)(m+1)*time_value);
+	    }
+	    error = ex_put_nset_var (exoid, whole_time_step, k+1, nsids[j],
+				     num_nodes_per_set[j], nset_var_vals);
+	    printf ("after ex_put_nset_var, error = %d\n", error);
+	    if (error) {
+	      ex_close (exoid);
+	      exit(-1);
+	    }
+	  }
+	}
+      }
+
+      /* write sideset variables */
+
+      kk = 0;
+      for (j=0; j<num_side_sets; j++) {
+	for (k=0; k<num_sset_vars; k++) {
+	  if (kk++ % 2 != 0) {
+	    for (m=0; m<num_elem_per_set[j]; m++) {
+	      sset_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+		((float)(m+1)*time_value);
+	    }
+	    error = ex_put_sset_var (exoid, whole_time_step, k+1, ssids[j],
+				     num_elem_per_set[j], sset_var_vals);
+	    printf ("after ex_put_sset_var, error = %d\n", error);
+	    if (error) {
+	      ex_close (exoid);
+	      exit(-1);
+	    }
+	  }
+	}
+      }
+
+      whole_time_step++;
+
+      /* update the data file; this should be done at the end of every time step
+       * to ensure that no data is lost if the analysis dies
+       */
+      error = ex_update (exoid);
+      printf ("after ex_update, error = %d\n", error);
+      if (error) {
+	ex_close (exoid);
+	exit(-1);
+      }
+    }
+  free(glob_var_vals);
+  free(nodal_var_vals);
+  free(elem_var_vals);
+  free(nset_var_vals);
+  free(sset_var_vals);
+
+  /* close the EXODUS files
+   */
+  error = ex_close (exoid);
+  printf ("after ex_close, error = %d\n", error);
+  if (error) {
+    ex_close (exoid);
+    exit(-1);
+  }
+  return 0;
+}
diff --git a/exodus/cbind/test/testwt_nc.c b/exodus/cbind/test/testwt_nc.c
new file mode 100644
index 0000000..c12fefa
--- /dev/null
+++ b/exodus/cbind/test/testwt_nc.c
@@ -0,0 +1,1236 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+/* #include "netcdf.h" */
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_face_in_sset[10], num_nodes_in_nset[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ssids[10], nsids[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars, num_sset_vars, num_nset_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float *sset_var_vals, *nset_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float attrib[1], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *block_names[10], *nset_names[10], *sset_names[10];
+   char *prop_names[2], *attrib_names[2];
+
+   ex_opts (EX_VERBOSE | EX_ABORT );
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 7;
+   num_elem_blk = 7;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* 3d Tri */
+   x[30] =  0.0; y[30] =  0.0; z[30] =  0.0;
+   x[31] = 10.0; y[31] =  0.0; z[31] =  0.0;
+   x[32] = 10.0; y[32] = 10.0; z[32] = 10.0;
+
+   error = ex_put_coord (exoid, NULL, NULL, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+   error = ex_put_coord (exoid, x,    NULL, NULL);
+   printf ("after ex_put_coord, error = %d\n", error);
+   error = ex_put_coord (exoid, NULL, y,    NULL);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodal attributes */
+   error = ex_put_attr_param(exoid, EX_NODAL, 0, 2);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 1, x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_one_attr(exoid, EX_NODAL, 0, 2, y);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Node_attr_1";
+     attrib_names[1] = "Node_attr_2";
+     error = ex_put_attr_names (exoid, EX_NODAL, 0, attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (elem_map);
+
+
+/* write element block parameters */
+
+   block_names[0] = "block_1";
+   block_names[1] = "block_2";
+   block_names[2] = "block_3";
+   block_names[3] = "block_4";
+   block_names[4] = "block_5";
+   block_names[5] = "block_6";
+   block_names[6] = "block_7";
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+   num_elem_in_block[5] = 1;
+   num_elem_in_block[6] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */
+   num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */
+   num_nodes_per_elem[6] = 3; /* elements in block #7 are 3-node tris   */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+   ebids[5] = 15;
+   ebids[6] = 16;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5],
+                               num_nodes_per_elem[5], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[6], "tri", num_elem_in_block[6],
+                               num_nodes_per_elem[6], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write element block names */
+   error = ex_put_names(exoid, EX_ELEM_BLOCK, block_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+/* write element block properties */
+
+   /*               12345678901234567890123456789012 */
+   prop_names[0] = "MATERIAL_PROPERTY_LONG_NAME_32CH";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], prop_names[0], 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], prop_names[0], 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], prop_names[0], 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], prop_names[0], 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], prop_names[0], 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], prop_names[0], 60);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], prop_names[0], 70);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+   connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+   error = ex_put_elem_conn (exoid, ebids[5], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 31; connect[1] = 32; connect[2] = 33;
+
+   error = ex_put_elem_conn (exoid, ebids[6], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[5], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_attr (exoid, ebids[6], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   attrib_names[0] = "THICKNESS";
+   for (i=0; i < 7; i++) {
+     error = ex_put_elem_attr_names (exoid, ebids[i], attrib_names);
+     printf ("after ex_put_elem_attr_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual node sets */
+
+
+   num_nodes_in_nset[0] = 5;
+   num_nodes_in_nset[1] = 3;
+
+   nsids[0] = 20;
+   nsids[1] = 21;
+
+   error = ex_put_node_set_param (exoid, nsids[0], 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, nsids[0], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[0], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   error = ex_put_node_set_param (exoid, nsids[1], 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, nsids[1], node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_node_set_dist_fact (exoid, nsids[1], dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* Write node set names */
+   nset_names[0] = "nset_1";
+   nset_names[1] = "nset_2";
+
+   error = ex_put_names(exoid, EX_NODE_SET, nset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[0], "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_NODE_SET, nsids[1], "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Add nodeset attributes */
+   error = ex_put_attr_param(exoid, EX_NODE_SET, nsids[0], 1);
+   printf ("after ex_put_attr_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_attr(exoid, EX_NODE_SET, nsids[0], x);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   {
+     attrib_names[0] = "Nodeset_attribute";
+     error = ex_put_attr_names (exoid, EX_NODE_SET, nsids[0], attrib_names);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+/* write individual side sets */
+   num_face_in_sset[0] =  2;
+   num_face_in_sset[1] =  2;
+   num_face_in_sset[2] =  7;
+   num_face_in_sset[3] =  8;
+   num_face_in_sset[4] = 10;
+   
+   ssids[0] = 30;
+   ssids[1] = 31;
+   ssids[2] = 32;
+   ssids[3] = 33;
+   ssids[4] = 34;
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, ssids[0], 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 8, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+   elem_list[4] = 6; elem_list[5] = 6;
+   elem_list[6] = 6; elem_list[7] = 6;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 1; side_list[5] = 2;
+   side_list[6] = 3; side_list[7] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   /* side set #5  - wedges and tris */
+
+   error = ex_put_side_set_param (exoid, 34, 10, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5; elem_list[5] = 7;
+   elem_list[6] = 7; elem_list[7] = 7;
+   elem_list[8] = 7; elem_list[9] = 7;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5; side_list[5] = 1;
+   side_list[6] = 2; side_list[7] = 3;
+   side_list[8] = 4; side_list[9] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   /* Write side set names */
+   sset_names[0] = "sset_1";
+   sset_names[1] = "sset_2";
+   sset_names[2] = "sset_3";
+   sset_names[3] = "sset_4";
+   sset_names[4] = "sset_5";
+
+   error = ex_put_names(exoid, EX_SIDE_SET, sset_names);
+   printf ("after ex_put_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+
+   num_nod_vars = 2;
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "node_variable_a_very_long_name_0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   num_ele_vars = 3;
+
+   /*              0        1         2         3   */
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "this_variable_name_is_short";
+   var_names[1] = "this_variable_name_is_just_right";
+   var_names[2] = "this_variable_name_is_tooooo_long";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   {
+     num_nset_vars = 3;
+     
+     var_names[0] = "ns_var0";
+     var_names[1] = "ns_var1";
+     var_names[2] = "ns_var2";
+     
+     error = ex_put_var_param (exoid, "m", num_nset_vars);
+     printf ("after ex_put_var_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_var_names (exoid, "m", num_nset_vars, var_names);
+     printf ("after ex_put_var_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     num_sset_vars = 3;
+
+     var_names[0] = "ss_var0";
+     var_names[1] = "ss_var1";
+     var_names[2] = "ss_var2";
+     
+     error = ex_put_var_param (exoid, "s", num_sset_vars);
+     printf ("after ex_put_var_param, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     error = ex_put_var_names (exoid, "s", num_sset_vars, var_names);
+     printf ("after ex_put_var_names, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+   sset_var_vals = (float *) calloc (10, CPU_word_size);
+   nset_var_vals = (float *) calloc (10, CPU_word_size);
+   
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+       if (error) {
+         ex_close (exoid);
+         exit(-1);
+       }
+
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write sideset variables */
+
+     for (k=1; k<=num_sset_vars; k++)
+     {
+       for (j=0; j<num_side_sets; j++)
+       {
+         for (m=0; m<num_face_in_sset[j]; m++)
+         {
+           sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+                              ((float)(m+1)*time_value);
+           /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+         }
+         error = ex_put_sset_var (exoid, whole_time_step, k, ssids[j],
+                                  num_face_in_sset[j], sset_var_vals);
+         printf ("after ex_put_sset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write nodeset variables */
+
+     for (k=1; k<=num_nset_vars; k++)
+     {
+       for (j=0; j<num_node_sets; j++)
+       {
+         for (m=0; m<num_nodes_in_nset[j]; m++)
+         {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+                              ((float)(m+1)*time_value);
+           /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+         }
+         error = ex_put_nset_var (exoid, whole_time_step, k, nsids[j],
+                                  num_nodes_in_nset[j], nset_var_vals);
+         printf ("after ex_put_nset_var, error = %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+   free(sset_var_vals);
+   free(nset_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt_nossnsdf.c b/exodus/cbind/test/testwt_nossnsdf.c
new file mode 100644
index 0000000..fdfe8b6
--- /dev/null
+++ b/exodus/cbind/test/testwt_nossnsdf.c
@@ -0,0 +1,889 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt1 - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10], num_attr[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect, *node_map;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ids[10];
+   int num_nodes_per_set[10], num_elem_per_set[10];
+   int num_df_per_set[10];
+   int df_ind[10], node_ind[10], elem_ind[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float time_value;
+   float x[100], y[100], z[100];
+   float attrib[100], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *prop_names[2];
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* float or double */
+   IO_word_size = 0;                    /* use system default (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 28;
+   num_elem = 8;
+   num_elem_blk = 7;
+   num_node_sets = 2;
+   num_side_sets = 5;
+   /* num_side_sets = 6; Uncomment to test NULL side sets */
+
+   error = ex_put_init (exoid, "This is testwt1", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Circle #1 */
+   x[20] = 100.0; y[20] = 100.0; z[20] = 0.0;
+
+/* Sphere #1 */
+   x[21] = 50.0; y[21] = 50.0; z[21] = 20.0;
+
+/* Wedge #1 */
+   x[22] =  3.0; y[22] =  0.0; z[22] =  6.0;
+   x[23] =  6.0; y[23] =  0.0; z[23] =  0.0;
+   x[24] =  0.0; y[24] =  0.0; z[24] =  0.0;
+   x[25] =  3.0; y[25] =  2.0; z[25] =  6.0;
+   x[26] =  6.0; y[26] =  2.0; z[26] =  2.0;
+   x[27] =  0.0; y[27] =  2.0; z[27] =  0.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   free (elem_map);
+
+/* write element numbering map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i*2;
+   }
+
+   error = ex_put_elem_num_map (exoid, elem_map);
+   printf ("after ex_put_elem_num_map, error = %d\n", error);
+
+   free (elem_map);
+
+
+/* write node numbering map */
+
+   node_map = (int *) calloc(num_nodes, sizeof(int));
+
+   for (i=1; i<=num_nodes; i++)
+   {
+      node_map[i-1] = i*3;
+   }
+
+   error = ex_put_node_num_map (exoid, node_map);
+   printf ("after ex_put_node_num_map, error = %d\n", error);
+
+   free (node_map);
+
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1; /* element 1: Quad 1 */
+   num_elem_in_block[1] = 2; /* elements 2, 3: Quad 1 & 2 */
+   num_elem_in_block[2] = 1; /* element 4: Hex    */
+   num_elem_in_block[3] = 1; /* element 5: Tetra  */
+   num_elem_in_block[4] = 1; /* element 6: Circle */
+   num_elem_in_block[5] = 1; /* element 7: Sphere */
+   num_elem_in_block[6] = 1; /* element 8: Wedge  */
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem[4] = 1; /* elements in block #4 are 1-node circles */
+   num_nodes_per_elem[5] = 1; /* elements in block #5 are 1-node spheres */
+   num_nodes_per_elem[6] = 6; /* elements in block #6 are 6-node wedges */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+   ebids[5] = 15;
+   ebids[6] = 16;
+
+   num_attr[0] = 3;
+   num_attr[1] = 3;
+   num_attr[2] = 3;
+   num_attr[3] = 3;
+   num_attr[4] = 3;
+   num_attr[5] = 3;
+   num_attr[6] = 3;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], num_attr[0]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], num_attr[1]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], num_attr[2]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], num_attr[3]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[4], "circle", num_elem_in_block[4],
+                               num_nodes_per_elem[4], num_attr[4]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[5], "sphere", num_elem_in_block[5],
+                               num_nodes_per_elem[5], num_attr[5]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[6], "wedge", num_elem_in_block[6],
+                               num_nodes_per_elem[6], num_attr[6]);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+/* write element block properties */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[5], "MATL", 60);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[6], "MATL", 70);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+   connect[4] = 5; connect[5] = 6; connect[6] = 7; connect[7] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 21;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 22;
+
+   error = ex_put_elem_conn (exoid, ebids[5], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 23; connect[1] = 24; connect[2] = 25;
+   connect[3] = 26; connect[4] = 27; connect[5] = 28;
+
+   error = ex_put_elem_conn (exoid, ebids[6], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   free (connect);
+
+
+/* write element block attributes  (3 per block) */
+
+   attrib[0] = 1.0; attrib[1] = 2.0; attrib[2] = 3.0;
+   attrib[3] = 1.11; attrib[4] = 2.11; attrib[5] = 3.11;
+   attrib[6] = 1.12; attrib[7] = 2.12; attrib[8] = 3.12;
+   attrib[9] = 1.2; attrib[10] = 2.2; attrib[11] = 3.2;
+   attrib[12] = 1.3; attrib[13] = 2.3; attrib[14] = 3.3;
+   attrib[15] = 1.4; attrib[16] = 2.4; attrib[17] = 3.4;
+   attrib[18] = 1.5; attrib[19] = 2.5; attrib[20] = 3.5;
+   attrib[21] = 1.6; attrib[22] = 2.6; attrib[23] = 3.6;
+
+   error = ex_put_elem_attr (exoid, ebids[0], &attrib[0]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[1], &attrib[3]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[2], &attrib[9]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[3], &attrib[12]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[4], &attrib[15]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[5], &attrib[18]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[6], &attrib[21]);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+/* write individual node sets */
+
+   /* COMMENTED OUT ...
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   END COMMENTED OUT SECTION */
+
+/* write concatenated node sets; this produces the same information as
+ * the above code which writes individual node sets
+ */
+
+/* THIS SECTION IS NOT COMMENTED OUT */
+
+   ids[0] = 20; ids[1] = 21;
+
+   num_nodes_per_set[0] = 5;
+   num_nodes_per_set[1] = 3;
+   /* num_nodes_per_set[1] = 0; Uncomment to test NULL node sets */
+
+   node_ind[0] = 0; node_ind[1] = 5;
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+   node_list[5] = 20; node_list[6] = 21; node_list[7] = 22;
+
+   num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+   df_ind[0] = 0; df_ind[1] = 5;
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; 
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0; 
+   dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1;
+
+   error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set,
+                                    num_df_per_set, node_ind,
+                                    df_ind, node_list, dist_fact);
+   printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   /* END NOT COMMENTED OUT SECTION */
+
+
+/* write individual side sets */
+
+   /* COMMENTED OUT SECTION ...
+
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 1; elem_list[1] = 1;
+
+   node_list[0] = 1; node_list[1] = 2;
+   node_list[2] = 5; node_list[3] = 6;
+
+   side_list[0] = 1; side_list[1] = 1;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   node_list[0] = 6; node_list[1] = 7;
+   node_list[2] = 7; node_list[3] = 8;
+
+   side_list[0] = 3; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   END COMMENTED OUT SECTION */
+
+/* write concatenated side sets; this produces the same information as
+ * the above code which writes individual side sets
+ */
+
+/* THIS SECTION IS NOT COMMENTED OUT */
+
+   ids[0] = 30;
+   ids[1] = 31;
+   ids[2] = 32;
+   ids[3] = 33;
+   ids[4] = 34;
+   ids[5] = 35;
+
+   /* side set #1  - quad */
+   node_list[0] = 8; node_list[1] = 5;
+   node_list[2] = 6; node_list[3] = 7;
+
+   /* side set #2  - quad/hex, spanning 2 element types  */
+   node_list[4] = 2; node_list[5] = 3;
+   node_list[6] = 7; node_list[7] = 8;
+
+   /* side set #3  - hex */
+   node_list[8] = 9; node_list[9] = 12;
+   node_list[10] = 11; node_list[11] = 10;
+
+
+   node_list[12] = 11; node_list[13] = 12;
+   node_list[14] = 16; node_list[15] = 15;
+ 
+   node_list[16] = 16; node_list[17] = 15;
+   node_list[18] = 11; node_list[19] = 12;
+
+   node_list[20] = 10; node_list[21] = 11;
+   node_list[22] = 15; node_list[23] = 14;
+
+   node_list[24] = 13; node_list[25] = 16;
+   node_list[26] = 12; node_list[27] =  9;
+
+   node_list[28] = 14; node_list[29] = 13;
+   node_list[30] =  9; node_list[31] = 10;
+
+   node_list[32] = 16; node_list[33] = 13;
+   node_list[34] = 14; node_list[35] = 15;
+
+   /* side set #4  - tetras */
+   node_list[36] = 17; node_list[37] = 18;
+   node_list[38] = 20;
+
+   node_list[39] = 18; node_list[40] = 19;
+   node_list[41] = 20;
+
+   node_list[42] = 20; node_list[43] = 19;
+   node_list[44] = 17;
+
+   node_list[45] = 19; node_list[46] = 18;
+   node_list[47] = 17;
+
+   /* side set #5  - circle and sphere */
+   node_list[48] = 21; 
+   node_list[49] = 22;
+
+   /* side set #6  - wedges */
+   node_list[50] = 27; node_list[51] = 26;
+   node_list[52] = 23; node_list[53] = 24;
+
+   node_list[54] = 28; node_list[55] = 27;
+   node_list[56] = 24; node_list[57] = 25;
+
+   node_list[58] = 28; node_list[59] = 25;
+   node_list[60] = 23; node_list[61] = 26;
+
+   node_list[62] = 25; node_list[63] = 24;
+   node_list[64] = 23;
+
+   node_list[65] = 26; node_list[66] = 27;
+   node_list[67] = 28;
+
+   node_ind[0] = 0;
+   node_ind[1] = 4;
+   node_ind[2] = 8;
+   node_ind[3] = 36;
+   node_ind[4] = 47;
+   node_ind[5] = 49;
+
+   num_elem_per_set[0] = 2; /* two sides uses 2 elements */
+   num_elem_per_set[1] = 2;
+   num_elem_per_set[2] = 7;
+   num_elem_per_set[3] = 4;
+   num_elem_per_set[4] = 2;
+   num_elem_per_set[5] = 5;
+   /* num_elem_per_set[5] = 0; Uncomment to test NULL side sets */
+
+   num_nodes_per_set[0] = 4;
+   num_nodes_per_set[1] = 4;
+   num_nodes_per_set[2] = 28;
+   num_nodes_per_set[3] = 12;
+   num_nodes_per_set[4] =  2;
+   num_nodes_per_set[5] = 18;
+
+   elem_ind[0] = 0;
+   elem_ind[1] = 2;
+   elem_ind[2] = 4;
+   elem_ind[3] = 11;
+   elem_ind[4] = 15;
+   elem_ind[5] = 17;
+
+   elem_list[0] = 3; elem_list[1] = 3; /* side set 1: Quad #2 */
+   elem_list[2] = 1; elem_list[3] = 3; /* side set 2: Quad #1 & #2 */
+   elem_list[4] = 4; elem_list[5] = 4; /* side set 3: Hex */
+   elem_list[6] = 4; elem_list[7] = 4;
+   elem_list[8] = 4; elem_list[9] = 4;
+   elem_list[10] = 4; 
+   elem_list[11] = 5; elem_list[12] = 5; /* side set 4: Tetra */
+   elem_list[13] = 5; elem_list[14] = 5; 
+   elem_list[15] = 6; elem_list[16] = 7; /* side set 5: Circle & Sphere */
+   elem_list[17] = 8; elem_list[18] = 8; /* side set 6: Wedge  */
+   elem_list[19] = 8; elem_list[20] = 8; 
+   elem_list[21] = 8;
+
+#if 0
+   /* side set 0 */
+     side_list[0]= 4; side_list[1]= 2;
+   /* side set 1 */
+     side_list[2]= 2; side_list[3]= 3; 
+   /* side set 2 */
+     side_list[4]= 5; side_list[5]= 3;
+   side_list[6]= 3; side_list[7]= 2;
+   side_list[8]= 4; side_list[9]= 1;
+   side_list[10]= 6;
+   /* side set 3 */
+     side_list[11]= 1; side_list[12]= 2;
+   side_list[13]= 3; side_list[14]= 4; 
+   /* side set 4 */
+     side_list[15] = 1; side_list[16] = 1;
+   /*   side set 5  */
+     side_list[17]= 1; side_list[18]= 2;
+   side_list[19]= 3; side_list[20]= 4;
+   side_list[21]= 5;
+#endif
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set,
+                         num_nodes_per_set,
+                         elem_ind,
+                         node_ind,
+                         elem_list,
+                         node_list,
+                         side_list);
+   printf ("after ex_cvt_nodes_to_sides, error = %d\n", error);
+
+#if 0
+   for (i=0;i<num_side_sets;i++)
+   {
+     printf("side set %d\n",i);
+     for (j=0;j<num_elem_per_set[i];j++)
+       printf("  side_list[%d]: %d\n",j,side_list[j+elem_ind[i]]);
+   }
+#endif
+
+   num_df_per_set[0] = 4;
+   num_df_per_set[1] = 4;
+   num_df_per_set[2] = 0;
+   num_df_per_set[3] = 0;
+   num_df_per_set[4] = 0;
+   num_df_per_set[5] = 0;
+
+   df_ind[0] = 0;
+   df_ind[1] = 4;
+
+   /* side set #1 df */
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1;
+   dist_fact[2] = 30.2; dist_fact[3] = 30.3;
+
+   /* side set #2 df */
+   dist_fact[4] = 31.0; dist_fact[5] = 31.1;
+   dist_fact[6] = 31.2; dist_fact[7] = 31.3;
+
+   error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set,
+                                    num_df_per_set, elem_ind, df_ind,
+                                    elem_list, side_list, dist_fact);
+   printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   /* END COMMENTED OUT SECTION */
+
+/* write QA records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT1";
+   qa_record[0][1] = "testwt1";
+   qa_record[0][2] = "03/16/94";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "FASTQ";
+   qa_record[1][1] = "fastq";
+   qa_record[1][2] = "07/07/93";
+   qa_record[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+
+/* write information records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "This is the second information record.";
+   info[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_name(exoid, "g", 1, var_names[0]);
+   printf ("after ex_put_var_name, error = %d\n", error);
+
+
+   num_nod_vars = 2;
+
+   var_names[0] = "nod_var0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k] = k+1;
+         k++;
+      }
+   }
+
+   truth_tab[6] = 0;
+
+   /* commented out to test ex_get_elem_var_tab in testrd1
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error); */
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         if (k == 1 && j == 2)
+           continue; /* skip element block 3, variable 1 */
+         else
+         {
+           error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+           printf ("after ex_put_elem_var, error = %d\n", error);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt_ss.c b/exodus/cbind/test/testwt_ss.c
new file mode 100644
index 0000000..2f45f96
--- /dev/null
+++ b/exodus/cbind/test/testwt_ss.c
@@ -0,0 +1,835 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwt_ss - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+/* #include "netcdf.h" */
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_node_sets, num_side_sets, error;
+   int *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ids[10];
+   int num_nodes_per_set[10], num_elem_per_set[10];
+   int num_df_per_set[10];
+   int df_ind[10], node_ind[10], elem_ind[10]; 
+   int  num_qa_rec, num_info;
+   int CPU_word_size,IO_word_size;
+
+   float x[100], y[100], z[100];
+   float dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3];
+
+   ex_opts (EX_VERBOSE|EX_ABORT); 
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 33;
+   num_elem = 8;
+   num_elem_blk = 8;
+   num_node_sets = 2;
+   num_side_sets = 9;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+/* Tetra #2 */
+   x[26] =  2.7; y[26] =  1.7; z[26] =  2.7;
+   x[27] =  6.0; y[27] =  1.7; z[27] =  3.3;
+   x[28] =  5.7; y[28] =  1.7; z[28] =  1.7;
+   x[29] =  3.7; y[29] =  0.0; z[29] =  2.3;
+
+/* TriShell #1 */
+   x[30] =  2.7; y[30] =  1.7; z[30] =  2.7;
+   x[31] =  6.0; y[31] =  1.7; z[31] =  3.3;
+   x[32] =  5.7; y[32] =  1.7; z[32] =  1.7;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+   num_elem_in_block[5] = 1;
+   num_elem_in_block[6] = 1;
+   num_elem_in_block[7] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #4 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #5 are 6-node wedges */
+   num_nodes_per_elem[5] = 8; /* elements in block #6 are 8-node tetras */
+   num_nodes_per_elem[6] = 4; /* elements in block #7 are 4-node shells */
+   num_nodes_per_elem[7] = 3; /* elements in block #8 are 3-node shells */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+   ebids[5] = 15;
+   ebids[6] = 16;
+   ebids[7] = 17;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[5], "tetra", num_elem_in_block[5],
+                               num_nodes_per_elem[5], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[6], "shell", num_elem_in_block[6],
+                               num_nodes_per_elem[6], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_elem_block (exoid, ebids[7], "triangle",
+                              num_elem_in_block[7], num_nodes_per_elem[7], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+   connect[4] = 27; connect[5] = 28; connect[6] = 30; connect[7] = 29;
+
+   error = ex_put_elem_conn (exoid, ebids[5], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[6], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   connect[0] = 30; connect[1] = 31; connect[2] = 32;
+
+   error = ex_put_elem_conn (exoid, ebids[7], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   free (connect);
+
+
+/* write individual side sets */
+
+   /* side set #1  - quad */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+    END COMMENTED OUT SECTION */
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+    END COMMENTED OUT SECTION */
+
+   /* side set #3  - hex */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+    END COMMENTED OUT SECTION */
+
+   /* side set #4  - 4-node tetras */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   error = ex_put_side_set_param (exoid, 33, 4, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+    END COMMENTED OUT SECTION */
+
+   /* side set #5  - shells; front and back faces */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   error = ex_put_side_set_param (exoid, 34, 2, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 7; elem_list[1] = 7;
+
+   side_list[0] = 1; side_list[1] = 2;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+    END COMMENTED OUT SECTION */
+
+   /* side set #6  - shells; edges */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   error = ex_put_side_set_param (exoid, 35, 4, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   elem_list[0] = 7; elem_list[1] = 7;
+   elem_list[2] = 7; elem_list[3] = 7;
+
+   side_list[0] = 3; side_list[1] = 4;
+   side_list[2] = 5; side_list[3] = 6;
+
+   error = ex_put_side_set (exoid, 35, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+    END COMMENTED OUT SECTION */
+
+/* write concatenated side sets; this produces the same information as
+ * the above code which writes individual side sets
+ */
+
+
+   ids[0] = 30;
+   ids[1] = 31;
+   ids[2] = 32;
+   ids[3] = 33;
+   ids[4] = 34;
+   ids[5] = 35;
+   ids[6] = 36;
+   ids[7] = 37;
+   ids[8] = 38;
+
+   /* side set #1  - NULL side set */
+   /* do nothing except set num_elem_per_set to 0 */
+ 
+   /* side set #2  - NULL side set */
+   /* do nothing except set num_elem_per_set to 0 */
+ 
+   /* side set #3  - quad; 2 sides */
+
+   node_list[0] = 8; node_list[1] = 5;
+   elem_list[0] = 2; 
+
+   node_list[2] = 6; node_list[3] = 7;
+   elem_list[1] = 2;
+
+   /* side set #4  - quad; 2 sides spanning 2 elements  */
+
+   node_list[4] = 2; node_list[5] = 3;
+   elem_list[2] = 1; 
+
+   node_list[6] = 7; node_list[7] = 8;
+   elem_list[3] = 2;
+
+   /* side set #5  - hex; 7 sides */
+
+   node_list[8] = 9; node_list[9] = 12;
+   node_list[10] = 11; node_list[11] = 10;
+   elem_list[4] = 3; 
+
+   node_list[12] = 11; node_list[13] = 12;
+   node_list[14] = 16; node_list[15] = 15;
+   elem_list[5] = 3;
+ 
+   node_list[16] = 16; node_list[17] = 15;
+   node_list[18] = 11; node_list[19] = 12;
+   elem_list[6] = 3; 
+
+   node_list[20] = 10; node_list[21] = 11;
+   node_list[22] = 15; node_list[23] = 14;
+   elem_list[7] = 3;
+
+   node_list[24] = 13; node_list[25] = 16;
+   node_list[26] = 12; node_list[27] =  9;
+   elem_list[8] = 3; 
+
+   node_list[28] = 14; node_list[29] = 13;
+   node_list[30] =  9; node_list[31] = 10;
+   elem_list[9] = 3;
+
+   node_list[32] = 16; node_list[33] = 13;
+   node_list[34] = 14; node_list[35] = 15;
+   elem_list[10] = 3; 
+
+   /* side set #6  - 4-node tetras; 4 sides */
+
+   node_list[36] = 17; node_list[37] = 18;
+   node_list[38] = 20;
+   elem_list[11] = 4; 
+
+   node_list[39] = 18; node_list[40] = 19;
+   node_list[41] = 20;
+   elem_list[12] = 4; 
+
+   node_list[42] = 17; node_list[43] = 20;
+   node_list[44] = 19;
+   elem_list[13] = 4; 
+
+   node_list[45] = 17; node_list[46] = 19;
+   node_list[47] = 18;
+   elem_list[14] = 4; 
+
+   /* side set #7  - shells; front and back faces */
+
+   node_list[48] = 1; node_list[49] = 2;
+   node_list[50] = 3; node_list[51] = 4;
+   elem_list[15] = 7; 
+
+   node_list[52] = 4; node_list[53] = 3;
+   node_list[54] = 2; node_list[55] = 1;
+   elem_list[16] = 7; 
+
+   /* side set #8  - shells; 4 edges */
+
+   node_list[56] = 1; node_list[57] = 2;
+   elem_list[17] = 7; 
+
+   node_list[58] = 2; node_list[59] = 3;
+   elem_list[18] = 7; 
+
+   node_list[60] = 3; node_list[61] = 4;
+   elem_list[19] = 7; 
+
+   node_list[62] = 4; node_list[63] = 1;
+   elem_list[20] = 7;
+
+   /* side set #9 --  3-node shells -- front and back */
+
+   node_list[64] = 30;
+   node_list[65] = 31;
+   node_list[66] = 32; 
+   elem_list[21] = 8; 
+
+   node_list[67] = 32;
+   node_list[68] = 31;
+   node_list[69] = 30; 
+   elem_list[22] = 8; 
+
+   /* set up indices */
+   node_ind[0] = 0;
+   node_ind[1] = 0;
+   node_ind[2] = 0;
+   node_ind[3] = 4;
+   node_ind[4] = 8;
+   node_ind[5] = 36;
+   node_ind[6] = 48;
+   node_ind[7] = 56;
+   node_ind[8] = 64;
+     
+   num_elem_per_set[0] = 0;
+   num_elem_per_set[1] = 0;
+   num_elem_per_set[2] = 2;
+   num_elem_per_set[3] = 2;
+   num_elem_per_set[4] = 7;
+   num_elem_per_set[5] = 4;
+   num_elem_per_set[6] = 2;
+   num_elem_per_set[7] = 4;
+   num_elem_per_set[8] = 2;
+   
+   num_nodes_per_set[0] = 0;
+   num_nodes_per_set[1] = 0;
+   num_nodes_per_set[2] = 4;
+   num_nodes_per_set[3] = 4;
+   num_nodes_per_set[4] = 28;
+   num_nodes_per_set[5] = 12;
+   num_nodes_per_set[6] = 8;
+   num_nodes_per_set[7] = 8;
+   num_nodes_per_set[8] = 6;
+
+   elem_ind[0] = 0;
+   elem_ind[1] = 0;
+   elem_ind[2] = 0;
+   elem_ind[3] = 2;
+   elem_ind[4] = 4;
+   elem_ind[5] = 11;
+   elem_ind[6] = 15;
+   elem_ind[7] = 17;
+   elem_ind[8] = 21;
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set,
+                         num_nodes_per_set,
+                         elem_ind,
+                         node_ind,
+                         elem_list,
+                         node_list,
+                         side_list);
+   printf ("after ex_cvt_nodes_to_sides, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   num_df_per_set[0] = 0;
+   num_df_per_set[1] = 0;
+   num_df_per_set[2] = 4;
+   num_df_per_set[3] = 4;
+   num_df_per_set[4] = 0;
+   num_df_per_set[5] = 0;
+   num_df_per_set[6] = 0;
+   num_df_per_set[7] = 0;
+   num_df_per_set[8] = 0;
+
+   df_ind[0] = 0;
+   df_ind[1] = 0;
+   df_ind[2] = 0;
+   df_ind[3] = 4;
+   df_ind[4] = 0;
+   df_ind[5] = 0;
+   df_ind[6] = 0;
+   df_ind[7] = 0;
+   df_ind[8] = 0;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1;
+   dist_fact[2] = 30.2; dist_fact[3] = 30.3;
+
+   dist_fact[4] = 31.0; dist_fact[5] = 31.1;
+   dist_fact[6] = 31.2; dist_fact[7] = 31.3;
+
+
+   error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set,
+                                    num_df_per_set, elem_ind, df_ind,
+                                    elem_list, side_list, dist_fact);
+   printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+/* THIS SECTION IS COMMENTED OUT
+    END COMMENTED OUT SECTION */
+
+
+/* write QA records; test empty and just blank-filled records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "";
+   qa_record[1][1] = "                            ";
+   qa_record[1][2] = "";
+   qa_record[1][3] = "                        ";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* write information records; test empty and just blank-filled records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "";
+   info[2] = "                                     ";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/testwt_ss.dmp b/exodus/cbind/test/testwt_ss.dmp
new file mode 100644
index 0000000..458162b
--- /dev/null
+++ b/exodus/cbind/test/testwt_ss.dmp
@@ -0,0 +1,295 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 8 ;
+	num_el_blk = 8 ;
+	num_node_sets = 2 ;
+	num_side_sets = 9 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 8 ;
+	num_att_in_blk6 = 1 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 4 ;
+	num_att_in_blk7 = 1 ;
+	num_el_in_blk8 = 1 ;
+	num_nod_per_el8 = 3 ;
+	num_att_in_blk8 = 1 ;
+	num_side_ss3 = 2 ;
+	num_df_ss3 = 4 ;
+	num_side_ss4 = 2 ;
+	num_df_ss4 = 4 ;
+	num_side_ss5 = 7 ;
+	num_side_ss6 = 4 ;
+	num_side_ss7 = 2 ;
+	num_side_ss8 = 4 ;
+	num_side_ss9 = 2 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "tetra" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "shell" ;
+	float attrib8(num_el_in_blk8, num_att_in_blk8) ;
+	char attrib_name8(num_att_in_blk8, len_name) ;
+	int connect8(num_el_in_blk8, num_nod_per_el8) ;
+		connect8:elem_type = "triangle" ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	float dist_fact_ss3(num_df_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	float dist_fact_ss4(num_df_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int elem_ss6(num_side_ss6) ;
+	int side_ss6(num_side_ss6) ;
+	int elem_ss7(num_side_ss7) ;
+	int side_ss7(num_side_ss7) ;
+	int elem_ss8(num_side_ss8) ;
+	int side_ss8(num_side_ss8) ;
+	int elem_ss9(num_side_ss9) ;
+	int side_ss9(num_side_ss9) ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16, 17 ;
+
+ ns_status = 0, 0 ;
+
+ ns_prop1 = -1, -1 ;
+
+ ss_status = 0, 0, 1, 1, 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34, 35, 36, 37, 38 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 2.7, 6, 5.7 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 1.7, 1.7, 1.7 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 2.7, 3.3, 1.7 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ attrib1 =
+  0 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  0 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  0 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  0 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  0 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ attrib6 =
+  0 ;
+
+ attrib_name6 =
+  "" ;
+
+ connect6 =
+  17, 18, 19, 20, 27, 28, 30, 29 ;
+
+ attrib7 =
+  0 ;
+
+ attrib_name7 =
+  "" ;
+
+ connect7 =
+  1, 2, 3, 4 ;
+
+ attrib8 =
+  0 ;
+
+ attrib_name8 =
+  "" ;
+
+ connect8 =
+  30, 31, 32 ;
+
+ elem_ss3 = 2, 2 ;
+
+ side_ss3 = 4, 2 ;
+
+ dist_fact_ss3 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss4 = 1, 2 ;
+
+ side_ss4 = 2, 3 ;
+
+ dist_fact_ss4 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss5 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss5 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss6 = 4, 4, 4, 4 ;
+
+ side_ss6 = 1, 2, 3, 4 ;
+
+ elem_ss7 = 7, 7 ;
+
+ side_ss7 = 1, 2 ;
+
+ elem_ss8 = 7, 7, 7, 7 ;
+
+ side_ss8 = 3, 4, 5, 6 ;
+
+ elem_ss9 = 8, 8 ;
+
+ side_ss9 = 1, 2 ;
+
+ qa_records =
+  "TESTWT",
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "",
+  "                            ",
+  "",
+  "                        " ;
+
+ info_records =
+  "This is the first information record.",
+  "",
+  "                                     " ;
+}
diff --git a/exodus/cbind/test/testwtbig.c b/exodus/cbind/test/testwtbig.c
new file mode 100644
index 0000000..721a0c3
--- /dev/null
+++ b/exodus/cbind/test/testwtbig.c
@@ -0,0 +1,776 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwtbig - test write a BIG ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+#define BIG 100000
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_node_sets, num_sides, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int node_list[100],elem_list[100],side_list[100];
+   int ebids[10], ids[10];
+   int num_sides_per_set[10], num_nodes_per_set[10], num_elem_per_set[10];
+   int num_df_per_set[10];
+   int df_ind[10], node_ind[10], elem_ind[10], side_ind[10];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int ndims, nvars, ngatts, recdim;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float time_value;
+   float *x, *y, *z, *dummy;
+   float attrib[1], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char tmpstr[80];
+   char *prop_names[2];
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+   dummy = 0; /* assign this so the Cray compiler doesn't complain */
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = BIG;
+   num_elem = BIG;
+   num_elem_blk = 5;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+/* write nodal coordinates values and names to database */
+
+   if (!(x = (float *) calloc(BIG, sizeof(float))))
+   {
+     printf ("couldn't allocate memory for x node array%d\n");
+     exit(1);
+   }
+
+   if (!(y = (float *) calloc(BIG, sizeof(float))))
+   {
+     printf ("couldn't allocate memory for y node array%d\n");
+     exit(1);
+   }
+
+   if (!(z = (float *) calloc(BIG, sizeof(float))))
+   {
+     printf ("couldn't allocate memory for z node array%d\n");
+     exit(1);
+   }
+
+   for (i=0; i<num_nodes; i++)
+   {
+     /* dummy up the coordinate space */
+     x[i]=i;
+     y[i]=i+.1;
+     z[i]=i+.2;
+   }
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   free (elem_map);
+
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #3 are 6-node wedges */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                               num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+/* write element block properties */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   free (connect);
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+/* write individual node sets */
+
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+
+/* write concatenated node sets; this produces the same information as
+ * the above code which writes individual node sets
+ */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   ids[0] = 20; ids[1] = 21;
+
+   num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3;
+
+   node_ind[0] = 0; node_ind[1] = 5;
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+   node_list[5] = 20; node_list[6] = 21; node_list[7] = 22;
+
+   num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+   df_ind[0] = 0; df_ind[1] = 5;
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; 
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0; 
+   dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1;
+
+   error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set,
+                                    num_df_per_set, node_ind,
+                                    df_ind, node_list, dist_fact);
+   printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   END COMMENTED OUT SECTION */
+
+
+/* write individual side sets */
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 4, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+
+   /* side set #5  - wedges */
+
+   error = ex_put_side_set_param (exoid, 34, 5, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* END COMMENTED OUT SECTION */
+
+/* write concatenated side sets; this produces the same information as
+ * the above code which writes individual side sets
+ */
+
+/* THIS SECTION IS COMMENTED OUT
+
+   ids[0] = 30;
+   ids[1] = 31;
+   ids[2] = 32;
+   ids[3] = 33;
+   ids[4] = 34;
+
+   node_list[0] = 8; node_list[1] = 5;
+   node_list[2] = 6; node_list[3] = 7;
+
+   node_list[4] = 2; node_list[5] = 3;
+   node_list[6] = 7; node_list[7] = 8;
+
+   node_list[8] = 9; node_list[9] = 12;
+   node_list[10] = 11; node_list[11] = 10;
+
+   node_list[12] = 11; node_list[13] = 12;
+   node_list[14] = 16; node_list[15] = 15;
+ 
+   node_list[16] = 16; node_list[17] = 15;
+   node_list[18] = 11; node_list[19] = 12;
+
+   node_list[20] = 10; node_list[21] = 11;
+   node_list[22] = 15; node_list[23] = 14;
+
+   node_list[24] = 13; node_list[25] = 16;
+   node_list[26] = 12; node_list[27] =  9;
+
+   node_list[28] = 14; node_list[29] = 13;
+   node_list[30] =  9; node_list[31] = 10;
+
+   node_list[32] = 16; node_list[33] = 13;
+   node_list[34] = 14; node_list[35] = 15;
+
+   node_list[36] = 17; node_list[37] = 18;
+   node_list[38] = 20;
+
+   node_list[39] = 18; node_list[40] = 19;
+   node_list[41] = 20;
+
+   node_list[42] = 20; node_list[43] = 19;
+   node_list[44] = 17;
+
+   node_list[45] = 19; node_list[46] = 18;
+   node_list[47] = 17;
+
+   node_list[48] = 25; node_list[49] = 24;
+   node_list[50] = 21; node_list[51] = 22;
+
+   node_list[52] = 26; node_list[53] = 25;
+   node_list[54] = 22; node_list[55] = 23;
+
+   node_list[56] = 26; node_list[57] = 23;
+   node_list[58] = 21; node_list[59] = 24;
+
+   node_list[60] = 23; node_list[61] = 22;
+   node_list[62] = 21;
+
+   node_list[63] = 24; node_list[64] = 25;
+   node_list[65] = 26;
+
+   node_ind[0] = 0;
+   node_ind[1] = 4;
+   node_ind[2] = 8;
+   node_ind[3] = 36;
+   node_ind[4] = 47;
+
+   num_elem_per_set[0] = 2;
+   num_elem_per_set[1] = 2;
+   num_elem_per_set[2] = 7;
+   num_elem_per_set[3] = 4;
+   num_elem_per_set[4] = 5;
+
+   num_nodes_per_set[0] = 4;
+   num_nodes_per_set[1] = 4;
+   num_nodes_per_set[2] = 28;
+   num_nodes_per_set[3] = 12;
+   num_nodes_per_set[4] = 18;
+
+   elem_ind[0] = 0;
+   elem_ind[1] = 2;
+   elem_ind[2] = 4;
+   elem_ind[3] = 11;
+   elem_ind[4] = 15;
+
+   elem_list[0] = 2; elem_list[1] = 2;
+   elem_list[2] = 1; elem_list[3] = 2;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3; elem_list[7] = 3;
+   elem_list[8] = 3; elem_list[9] = 3;
+   elem_list[10] = 3; elem_list[11] = 4;
+   elem_list[12] = 4; elem_list[13] = 4;
+   elem_list[14] = 4; elem_list[15] = 5;
+   elem_list[16] = 5; elem_list[17] = 5;
+   elem_list[18] = 5; elem_list[19] = 5;
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set,
+                         num_nodes_per_set,
+                         elem_ind,
+                         node_ind,
+                         elem_list,
+                         node_list,
+                         side_list);
+   printf ("after ex_cvt_nodes_to_sides, error = %d\n", error);
+
+   num_df_per_set[0] = 4;
+   num_df_per_set[1] = 4;
+   num_df_per_set[2] = 0;
+   num_df_per_set[3] = 0;
+   num_df_per_set[4] = 0;
+
+   df_ind[0] = 0;
+   df_ind[1] = 4;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1;
+   dist_fact[2] = 30.2; dist_fact[3] = 30.3;
+
+   dist_fact[4] = 31.0; dist_fact[5] = 31.1;
+   dist_fact[6] = 31.2; dist_fact[7] = 31.3;
+
+   error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set,
+                                    num_df_per_set, elem_ind, df_ind,
+                                    elem_list, side_list, dist_fact);
+   printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+   /* END COMMENTED OUT SECTION */
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+
+/* write QA records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWT";
+   qa_record[0][1] = "testwt";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "FASTQ";
+   qa_record[1][1] = "fastq";
+   qa_record[1][2] = "07/07/93";
+   qa_record[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+
+/* write information records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "This is the second information record.";
+   info[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+
+   num_nod_vars = 2;
+
+   var_names[0] = "nod_var0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (float *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (float *) calloc (4, CPU_word_size);
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testwtd.c b/exodus/cbind/test/testwtd.c
new file mode 100644
index 0000000..63984f3
--- /dev/null
+++ b/exodus/cbind/test/testwtd.c
@@ -0,0 +1,602 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwtd - test write an ExodusII database file
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines.
+*
+*
+*****************************************************************************/
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "netcdf.h"
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int num_elem_in_block[10], num_nodes_per_elem[10];
+   int num_node_sets, num_side_sets, error;
+   int i, j, k, m, *elem_map, *connect;
+   int  node_list[100],elem_list[100],side_list[100];
+   int ebids[100];
+   int  num_qa_rec, num_info;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   double *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   double time_value;
+   double x[100], y[100], z[100];
+   double attrib[1], dist_fact[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *prop_names[2];
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 8;                   /* double */
+   IO_word_size = 8;                    /* use double size (8 bytes) */
+
+/* create EXODUS II file */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 26;
+   num_elem = 5;
+   num_elem_blk = 5;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   free (elem_map);
+
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #3 are 6-node wedges */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+
+
+/* write element block properties */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+
+   free (connect);
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+
+/* write individual node sets */
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set_dist_fact, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+
+   /* write individual side sets */
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   /* side set #1  - quad */
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   /* side set #2  - quad, spanning 2 elements  */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   /* side set #3  - hex */
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 4, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* side set #5  - wedges */
+
+   error = ex_put_side_set_param (exoid, 34, 5, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   /* END COMMENTED OUT SECTION */
+
+/* write QA records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWTD";
+   qa_record[0][1] = "testwtd";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "FASTQ";
+   qa_record[1][1] = "fastq";
+   qa_record[1][2] = "07/07/93";
+   qa_record[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+
+/* write information records */
+
+   num_info = 3;
+
+
+   info[0] = "This is the first information record.";
+   info[1] = "This is the second information record.";
+   info[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+
+   num_nod_vars = 2;
+
+   var_names[0] = "nod_var0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (double *) calloc (num_glo_vars, CPU_word_size);
+   nodal_var_vals = (double *) calloc (num_nodes, CPU_word_size);
+   elem_var_vals = (double *) calloc (4, CPU_word_size);
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (double)(i+1)/100.;
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   return 0;
+}
diff --git a/exodus/cbind/test/testwtm.c b/exodus/cbind/test/testwtm.c
new file mode 100644
index 0000000..b55cf8e
--- /dev/null
+++ b/exodus/cbind/test/testwtm.c
@@ -0,0 +1,1405 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************
+*
+* testwtm - test write many ExodusII database files
+*
+* author - Sandia National Laboratories
+*          Larry A. Schoof - Original
+*          Vic Yarberry    - Added headers and error logging
+*               7/7/93          Modified for use with Exodus 2.00
+*
+*          
+* environment - UNIX
+*
+* entry conditions - 
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*  This is a test program for the C binding of the EXODUS II 
+*  database write routines. It tests multiple simultaneous output files.
+*
+*
+*****************************************************************************/
+
+#define EX_TEST_INDIV_NODESET
+#define EX_TEST_INDIV_SIDESET
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "exodusII.h"
+#include "netcdf.h"
+int main (int argc, char **argv)
+{
+   int exoid, num_dim, num_nodes, num_elem, num_elem_blk;
+   int exoidm[10], num_dim2, num_nodes2, num_elem2,num_elem_blk2;
+   int num_elem_in_block[10], num_node_sets, num_nodes_per_elem[10];
+   int num_elem_in_block2[10], num_node_sets2, num_nodes_per_elem2[10];
+   int num_side_sets, error;
+   int num_side_sets2, nexofiles = 5;
+   int i, j, k, m, n;
+   int *elem_map, *connect, node_list[100],elem_list[100],side_list[100];
+   int *elem_map2, *connect2, node_list2[100],elem_list2[100],side_list2[100];
+   int ebids[10], ids[10];
+   int ebids2[10], ids2[10];
+   int num_nodes_per_set[10], num_elem_per_set[10];
+   int num_nodes_per_set2[10], num_elem_per_set2[10];
+   int num_df_per_set[10], num_df_per_set2[10];
+   int df_ind[10], node_ind[10], elem_ind[10];
+   int df_ind2[10],node_ind2[10],elem_ind2[10];
+   int num_qa_rec, num_info;
+   int num_qa_rec2,num_info2;
+   int num_glo_vars, num_nod_vars, num_ele_vars;
+   int num_glo_vars2, num_nod_vars2, num_ele_vars2;
+   int *truth_tab;
+   int whole_time_step, num_time_steps;
+   int CPU_word_size,IO_word_size;
+   int prop_array[2];
+
+   float *glob_var_vals, *nodal_var_vals, *elem_var_vals;
+   float time_value;
+   float time_value2;
+   float x[100], y[100], z[100];
+   float attrib[1], dist_fact[1008];
+   float attrib2[1], dist_fact2[100];
+   char *coord_names[3], *qa_record[2][4], *info[3], *var_names[3];
+   char *coord_names2[3], *qa_record2[2][4], *info2[3], *var_names2[3];
+   char tmpstr[80];
+   char *prop_names[2];
+   char exofname[256];
+
+   ex_opts (EX_VERBOSE | EX_ABORT);
+
+/* Specify compute and i/o word size */
+
+   CPU_word_size = 0;                   /* sizeof(float) */
+   IO_word_size = 4;                    /* (4 bytes) */
+
+/* create EXODUS II files */
+
+   exoid = ex_create ("test.exo",       /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for test.exo, exoid = %d\n", exoid);
+   printf (" cpu word size: %d io word size: %d\n",CPU_word_size,IO_word_size);
+
+   for (n=0; n<nexofiles; n++)
+   {
+     sprintf(exofname,"test%d.exo",n);
+     printf("test file name: %s\n",exofname);
+     exoidm[n]= ex_create (exofname,    /* filename path */
+                       EX_CLOBBER,      /* create mode */
+                       &CPU_word_size,  /* CPU float word size in bytes */
+                       &IO_word_size);  /* I/O float word size in bytes */
+   printf ("after ex_create for %s, exoid = %d\n", exofname,exoidm[n]);
+
+   }
+
+   /* ncopts = NC_VERBOSE; */
+
+/* initialize file with parameters */
+
+   num_dim = 3;
+   num_nodes = 26;
+   num_elem = 5;
+   num_elem_blk = 5;
+   num_node_sets = 2;
+   num_side_sets = 5;
+
+   error = ex_put_init (exoid, "This is a test", num_dim, num_nodes, num_elem,
+                        num_elem_blk, num_node_sets, num_side_sets);
+
+   printf ("after ex_put_init, error = %d\n", error);
+
+
+
+/* initialize file n with parameters */
+
+   num_dim2 = 3;
+   num_nodes2 = 26;
+   num_elem2 = 5;
+   num_elem_blk2 = 5;
+   num_node_sets2 = 2;
+   num_side_sets2 = 5;
+
+   for (n=0; n<nexofiles; n++)
+   {
+     sprintf(tmpstr,"This is test %d",n);
+
+     error=ex_put_init (exoidm[n],tmpstr,num_dim2,num_nodes2,num_elem2,
+                        num_elem_blk2, num_node_sets2, num_side_sets2);
+
+     printf ("after ex_put_init (%d), error = %d\n", n, error);
+   }
+
+/* write nodal coordinates values and names to database */
+
+/* Quad #1 */
+   x[0] = 0.0; y[0] = 0.0; z[0] = 0.0;
+   x[1] = 1.0; y[1] = 0.0; z[1] = 0.0;
+   x[2] = 1.0; y[2] = 1.0; z[2] = 0.0;
+   x[3] = 0.0; y[3] = 1.0; z[3] = 0.0;
+
+/* Quad #2 */
+   x[4]  =  1.0; y[4]  =  0.0; z[4]  =  0.0;
+   x[5]  =  2.0; y[5]  =  0.0; z[5]  =  0.0;
+   x[6]  =  2.0; y[6]  =  1.0; z[6]  =  0.0;
+   x[7]  =  1.0; y[7]  =  1.0; z[7]  =  0.0;
+
+/* Hex #1 */
+   x[8]  =  0.0; y[8]  =  0.0; z[8]  =  0.0;
+   x[9]  = 10.0; y[9]  =  0.0; z[9]  =  0.0;
+   x[10] = 10.0; y[10] =  0.0; z[10] =-10.0;
+   x[11] =  1.0; y[11] =  0.0; z[11] =-10.0;
+   x[12] =  1.0; y[12] = 10.0; z[12] =  0.0;
+   x[13] = 10.0; y[13] = 10.0; z[13] =  0.0;
+   x[14] = 10.0; y[14] = 10.0; z[14] =-10.0;
+   x[15] =  1.0; y[15] = 10.0; z[15] =-10.0;
+
+/* Tetra #1 */
+   x[16] =  0.0; y[16] =  0.0; z[16] =  0.0;
+   x[17] =  1.0; y[17] =  0.0; z[17] =  5.0;
+   x[18] = 10.0; y[18] =  0.0; z[18] =  2.0;
+   x[19] =  7.0; y[19] =  5.0; z[19] =  3.0;
+
+/* Wedge #1 */
+   x[20] =  3.0; y[20] =  0.0; z[20] =  6.0;
+   x[21] =  6.0; y[21] =  0.0; z[21] =  0.0;
+   x[22] =  0.0; y[22] =  0.0; z[22] =  0.0;
+   x[23] =  3.0; y[23] =  2.0; z[23] =  6.0;
+   x[24] =  6.0; y[24] =  2.0; z[24] =  2.0;
+   x[25] =  0.0; y[25] =  2.0; z[25] =  0.0;
+
+   error = ex_put_coord (exoid, x, y, z);
+   printf ("after ex_put_coord, error = %d\n", error);
+
+/* write nodal coordinates values and names to database */
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_coord (exoidm[n], x, y, z);
+     printf ("after ex_put_coord (%d), error = %d\n", n,error);
+   }
+
+   coord_names[0] = "xcoor";
+   coord_names[1] = "ycoor";
+   coord_names[2] = "zcoor";
+
+   error = ex_put_coord_names (exoid, coord_names);
+   printf ("after ex_put_coord_names, error = %d\n", error);
+
+   coord_names2[0] = "xcoor";
+   coord_names2[1] = "ycoor";
+   coord_names2[2] = "zcoor";
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_coord_names (exoidm[n], coord_names2);
+     printf ("after ex_put_coord_names (%d), error = %d\n", n, error);
+   }
+
+
+/* write element order map */
+
+   elem_map = (int *) calloc(num_elem, sizeof(int));
+
+   for (i=1; i<=num_elem; i++)
+   {
+      elem_map[i-1] = i;
+   }
+
+   error = ex_put_map (exoid, elem_map);
+   printf ("after ex_put_map, error = %d\n", error);
+
+   free (elem_map);
+
+   elem_map2= (int *) calloc(num_elem2, sizeof(int));
+
+   for (i=1; i<=num_elem2; i++)
+   {
+      elem_map2[i-1] = i;
+   }
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_map (exoidm[n], elem_map2);
+     printf ("after ex_put_map (%d), error = %d\n", n, error);
+   }
+
+   free (elem_map2);
+
+
+/* write element block parameters */
+
+   num_elem_in_block[0] = 1;
+   num_elem_in_block[1] = 1;
+   num_elem_in_block[2] = 1;
+   num_elem_in_block[3] = 1;
+   num_elem_in_block[4] = 1;
+
+   num_nodes_per_elem[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem[4] = 6; /* elements in block #3 are 6-node wedges */
+
+   ebids[0] = 10;
+   ebids[1] = 11;
+   ebids[2] = 12;
+   ebids[3] = 13;
+   ebids[4] = 14;
+
+   error = ex_put_elem_block (exoid, ebids[0], "quad", num_elem_in_block[0],
+                              num_nodes_per_elem[0], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[1], "quad", num_elem_in_block[1],
+                              num_nodes_per_elem[1], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[2], "hex", num_elem_in_block[2],
+                               num_nodes_per_elem[2], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[3], "tetra", num_elem_in_block[3],
+                               num_nodes_per_elem[3], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+   error = ex_put_elem_block (exoid, ebids[4], "wedge", num_elem_in_block[4],
+                               num_nodes_per_elem[4], 1);
+   printf ("after ex_put_elem_block, error = %d\n", error);
+
+/* write element block properties */
+
+   prop_names[0] = "MATL";
+   prop_names[1] = "DENSITY";
+   error = ex_put_prop_names(exoid,EX_ELEM_BLOCK,2,prop_names);
+   printf ("after ex_put_prop_names, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[0], "MATL", 10);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[1], "MATL", 20);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[2], "MATL", 30);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[3], "MATL", 40);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_ELEM_BLOCK, ebids[4], "MATL", 50);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+/* files n */
+
+   num_elem_in_block2[0] = 1;
+   num_elem_in_block2[1] = 1;
+   num_elem_in_block2[2] = 1;
+   num_elem_in_block2[3] = 1;
+   num_elem_in_block2[4] = 1;
+
+   num_nodes_per_elem2[0] = 4; /* elements in block #1 are 4-node quads  */
+   num_nodes_per_elem2[1] = 4; /* elements in block #2 are 4-node quads  */
+   num_nodes_per_elem2[2] = 8; /* elements in block #3 are 8-node hexes  */
+   num_nodes_per_elem2[3] = 4; /* elements in block #3 are 4-node tetras */
+   num_nodes_per_elem2[4] = 6; /* elements in block #3 are 6-node wedges */
+
+   ebids2[0] = 10;
+   ebids2[1] = 11;
+   ebids2[2] = 12;
+   ebids2[3] = 13;
+   ebids2[4] = 14;
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error=ex_put_elem_block(exoidm[n],ebids2[0], "quad", num_elem_in_block2[0],
+                              num_nodes_per_elem2[0], 1);
+     printf ("after ex_put_elem_block (%d), error = %d\n", n, error);
+
+     error=ex_put_elem_block(exoidm[n],ebids2[1], "quad", num_elem_in_block2[1],
+                              num_nodes_per_elem2[1], 1);
+     printf ("after ex_put_elem_block (%d), error = %d\n", n, error);
+
+     error=ex_put_elem_block(exoidm[n],ebids2[2], "hex", num_elem_in_block2[2],
+                              num_nodes_per_elem2[2], 1);
+     printf ("after ex_put_elem_block (%d), error = %d\n", n, error);
+
+     error=ex_put_elem_block(exoidm[n],ebids2[3], "tetra",num_elem_in_block2[3],
+                              num_nodes_per_elem2[3], 1);
+     printf ("after ex_put_elem_block (%d), error = %d\n", n, error);
+
+     error=ex_put_elem_block(exoidm[n],ebids2[4], "wedge",num_elem_in_block2[4],
+                              num_nodes_per_elem2[4], 1);
+     printf ("after ex_put_elem_block (%d), error = %d\n", n, error);
+
+/* write element block properties */
+
+     prop_names[0] = "MATL";
+     prop_names[1] = "DENSITY";
+     error = ex_put_prop_names(exoidm[n],EX_ELEM_BLOCK,2,prop_names);
+     printf ("after ex_put_prop_names (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[0], "MATL", 100);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+     error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[1], "MATL", 200);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+     error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[2], "MATL", 300);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+     error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[3], "MATL", 400);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+     error = ex_put_prop(exoidm[n], EX_ELEM_BLOCK, ebids2[4], "MATL", 500);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+   }
+
+/* write element connectivity */
+
+   connect = (int *) calloc(8, sizeof(int));
+   connect[0] = 1; connect[1] = 2; connect[2] = 3; connect[3] = 4;
+
+   error = ex_put_elem_conn (exoid, ebids[0], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 5; connect[1] = 6; connect[2] = 7; connect[3] = 8;
+
+   error = ex_put_elem_conn (exoid, ebids[1], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 9; connect[1] = 10; connect[2] = 11; connect[3] = 12;
+   connect[4] = 13; connect[5] = 14; connect[6] = 15; connect[7] = 16;
+
+   error = ex_put_elem_conn (exoid, ebids[2], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 17; connect[1] = 18; connect[2] = 19; connect[3] = 20;
+
+   error = ex_put_elem_conn (exoid, ebids[3], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   connect[0] = 21; connect[1] = 22; connect[2] = 23;
+   connect[3] = 24; connect[4] = 25; connect[5] = 26;
+
+   error = ex_put_elem_conn (exoid, ebids[4], connect);
+   printf ("after ex_put_elem_conn, error = %d\n", error);
+
+   free (connect);
+
+   for (n=0; n<nexofiles; n++)
+   {
+     connect2 = (int *) calloc(8, sizeof(int));
+     connect2[0] = 1; connect2[1] = 2; connect2[2] = 3; connect2[3] = 4;
+
+     error = ex_put_elem_conn (exoidm[n], ebids[0], connect2);
+     printf ("after ex_put_elem_conn (%d), error = %d\n", n, error);
+
+     connect2[0] = 5; connect2[1] = 6; connect2[2] = 7; connect2[3] = 8;
+
+     error = ex_put_elem_conn (exoidm[n], ebids[1], connect2);
+     printf ("after ex_put_elem_conn (%d), error = %d\n", n, error);
+
+     connect2[0] = 9; connect2[1] = 10; connect2[2] = 11; connect2[3] = 12;
+     connect2[4] = 13; connect2[5] = 14; connect2[6] = 15; connect2[7] = 16;
+
+     error = ex_put_elem_conn (exoidm[n], ebids2[2], connect2);
+     printf ("after ex_put_elem_conn (%d), error = %d\n", n, error);
+
+     connect2[0] = 17; connect2[1] = 18; connect2[2] = 19; connect2[3] = 20;
+
+     error = ex_put_elem_conn (exoidm[n], ebids2[3], connect2);
+     printf ("after ex_put_elem_conn (%d), error = %d\n", n, error);
+
+     connect2[0] = 21; connect2[1] = 22; connect2[2] = 23;
+     connect2[3] = 24; connect2[4] = 25; connect2[5] = 26;
+
+     error = ex_put_elem_conn (exoidm[n], ebids2[4], connect2);
+     printf ("after ex_put_elem_conn (%d), error = %d\n", n, error);
+
+     free (connect2);
+   }
+
+
+/* write element block attributes */
+
+   attrib[0] = 3.14159;
+   error = ex_put_elem_attr (exoid, ebids[0], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   attrib[0] = 6.14159;
+   error = ex_put_elem_attr (exoid, ebids[1], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[2], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[3], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   error = ex_put_elem_attr (exoid, ebids[4], attrib);
+   printf ("after ex_put_elem_attr, error = %d\n", error);
+
+   for (n=0; n<nexofiles; n++)
+   {
+     attrib2[0] = 3.;
+     error = ex_put_elem_attr (exoidm[n], ebids[0], attrib2);
+     printf ("after ex_put_elem_attr (%d), error = %d\n", n, error);
+
+     attrib2[0] = 6.;
+     error = ex_put_elem_attr (exoidm[n], ebids[1], attrib2);
+     printf ("after ex_put_elem_attr (%d), error = %d\n", n, error);
+
+     error = ex_put_elem_attr (exoidm[n], ebids[2], attrib2);
+     printf ("after ex_put_elem_attr (%d), error = %d\n", n, error);
+
+     error = ex_put_elem_attr (exoidm[n], ebids[3], attrib2);
+     printf ("after ex_put_elem_attr (%d), error = %d\n", n, error);
+
+     error = ex_put_elem_attr (exoidm[n], ebids[4], attrib2);
+     printf ("after ex_put_elem_attr (%d), error = %d\n", n, error);
+   }
+
+#ifdef EX_TEST_INDIV_NODESET
+/* write individual node sets */
+
+   error = ex_put_node_set_param (exoid, 20, 5, 5);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0;
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0;
+
+   error = ex_put_node_set (exoid, 20, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 20, dist_fact);
+   printf ("after ex_put_node_set, error = %d\n", error);
+
+   error = ex_put_node_set_param (exoid, 21, 3, 3);
+   printf ("after ex_put_node_set_param, error = %d\n", error);
+
+   node_list[0] = 20; node_list[1] = 21; node_list[2] = 22; 
+
+   dist_fact[0] = 1.1; dist_fact[1] = 2.1; dist_fact[2] = 3.1;
+
+   error = ex_put_node_set (exoid, 21, node_list);
+   printf ("after ex_put_node_set, error = %d\n", error);
+   error = ex_put_node_set_dist_fact (exoid, 21, dist_fact);
+   printf ("after ex_put_node_set, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+/* file 2 */
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_node_set_param (exoidm[n], 20, 5, 5);
+     printf ("after ex_put_node_set_param (%d), error = %d\n", n, error);
+
+     node_list2[0] = 10; node_list2[1] = 11; node_list2[2] = 12; 
+     node_list2[3] = 13; node_list2[4] = 14; 
+
+     dist_fact2[0] = 1.0; dist_fact2[1] = 2.0; dist_fact2[2] = 3.0;
+     dist_fact2[3] = 4.0; dist_fact2[4] = 5.0;
+
+     error = ex_put_node_set (exoidm[n], 20, node_list2);
+     printf ("after ex_put_node_set (%d), error = %d\n", n, error);
+     error = ex_put_node_set_dist_fact (exoidm[n], 20, dist_fact2);
+     printf ("after ex_put_node_set (%d), error = %d\n", n, error);
+
+     error = ex_put_node_set_param (exoidm[n], 21, 3, 3);
+     printf ("after ex_put_node_set_param (%d), error = %d\n", n, error);
+
+     node_list2[0] = 20; node_list2[1] = 21; node_list2[2] = 22; 
+
+     dist_fact2[0] = 1.1; dist_fact2[1] = 2.1; dist_fact2[2] = 3.1;
+
+     error = ex_put_node_set (exoidm[n], 21, node_list2);
+     printf ("after ex_put_node_set (%d), error = %d\n", n, error);
+     error = ex_put_node_set_dist_fact (exoidm[n], 21, dist_fact2);
+     printf ("after ex_put_node_set (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_NODE_SET, 20, "FACE", 4);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_NODE_SET, 21, "FACE", 5);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+
+     prop_array[0] = 1000;
+     prop_array[1] = 2000;
+
+     error = ex_put_prop_array(exoidm[n], EX_NODE_SET, "VELOCITY", prop_array);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+   }
+
+#else /* EX_TEST_INDIV_NODESET */
+/* write concatenated node sets; this produces the same information as
+ * the above code which writes individual node sets
+ */
+
+   ids[0] = 20; ids[1] = 21;
+
+   num_nodes_per_set[0] = 5; num_nodes_per_set[1] = 3;
+
+   node_ind[0] = 0; node_ind[1] = 5;
+
+   node_list[0] = 10; node_list[1] = 11; node_list[2] = 12; 
+   node_list[3] = 13; node_list[4] = 14; 
+   node_list[5] = 20; node_list[6] = 21; node_list[7] = 22;
+
+   num_df_per_set[0] = 5; num_df_per_set[1] = 3;
+
+   df_ind[0] = 0; df_ind[1] = 5;
+
+   dist_fact[0] = 1.0; dist_fact[1] = 2.0; dist_fact[2] = 3.0; 
+   dist_fact[3] = 4.0; dist_fact[4] = 5.0; 
+   dist_fact[5] = 1.1; dist_fact[6] = 2.1; dist_fact[7] = 3.1;
+
+   error = ex_put_concat_node_sets (exoid, ids, num_nodes_per_set, node_ind, 
+                                    node_list, dist_fact);
+   printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_NODE_SET, 20, "FACE", 4);
+   printf ("after ex_put_prop, error = %d\n", error);
+   error = ex_put_prop(exoid, EX_NODE_SET, 21, "FACE", 5);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   prop_array[0] = 1000;
+   prop_array[1] = 2000;
+
+   error = ex_put_prop_array(exoid, EX_NODE_SET, "VELOCITY", prop_array);
+   printf ("after ex_put_prop_array, error = %d\n", error);
+
+   ids2[0] = 20; ids2[1] = 21;
+
+   num_nodes_per_set2[0] = 5; num_nodes_per_set2[1] = 3;
+
+   node_ind2[0] = 0; node_ind2[1] = 5;
+
+   node_list2[0] = 10; node_list2[1] = 11; node_list2[2] = 12;
+   node_list2[3] = 13; node_list2[4] = 14;
+   node_list2[5] = 20; node_list2[6] = 21; node_list2[7] = 22;
+
+   num_df_per_set2[0] = 5; num_df_per_set2[1] = 3;
+
+   df_ind2[0] = 0; df_ind2[1] = 5;
+
+   dist_fact2[0] = 1.0; dist_fact2[1] = 2.0; dist_fact2[2] = 3.0;
+   dist_fact2[3] = 4.0; dist_fact2[4] = 5.0;
+   dist_fact2[5] = 1.1; dist_fact2[6] = 2.1; dist_fact2[7] = 3.1;
+
+   prop_array2[0] = 1000;
+   prop_array2[1] = 2000;
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_concat_node_sets (exoidm[n], ids2, num_nodes_per_set2,
+                                      num_df_per_set2, node_ind2,
+                                      df_ind2, node_list2, dist_fact2);
+     printf ("after ex_put_concat_node_sets, error = %d\n", error);
+
+
+     error = ex_put_prop(exoidm[n], EX_NODE_SET, 20, "FACE", 4);
+     printf ("after ex_put_prop, error = %d\n", error);
+     error = ex_put_prop(exoidm[n], EX_NODE_SET, 21, "FACE", 5);
+     printf ("after ex_put_prop, error = %d\n", error);
+
+     error = ex_put_prop_array(exoidm[n], EX_NODE_SET, "VELOCITY", prop_array2);
+     printf ("after ex_put_prop_array, error = %d\n", error);
+   }
+
+#endif /* EX_TEST_INDIV_NODESET */
+
+#ifdef TEST_INDIV_SIDESET
+/* write individual side sets */
+
+   /* side set #1  - quad */
+
+   error = ex_put_side_set_param (exoid, 30, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 2; elem_list[1] = 2;
+
+   side_list[0] = 4; side_list[1] = 2;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1; dist_fact[2] = 30.2;
+   dist_fact[3] = 30.3;
+
+   error = ex_put_side_set (exoid, 30, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 30, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   /* side set #2  - quad  spanning elements */
+
+   error = ex_put_side_set_param (exoid, 31, 2, 4);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 1; elem_list[1] = 2;
+
+   side_list[0] = 2; side_list[1] = 3;
+
+   dist_fact[0] = 31.0; dist_fact[1] = 31.1; dist_fact[2] = 31.2;
+   dist_fact[3] = 31.3;
+
+   error = ex_put_side_set (exoid, 31, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_side_set_dist_fact (exoid, 31, dist_fact);
+   printf ("after ex_put_side_set_dist_fact, error = %d\n", error);
+
+   /* side set #3  - hex */
+
+   error = ex_put_side_set_param (exoid, 32, 7, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 3; elem_list[1] = 3;
+   elem_list[2] = 3; elem_list[3] = 3;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3;
+
+   side_list[0] = 5; side_list[1] = 3;
+   side_list[2] = 3; side_list[3] = 2;
+   side_list[4] = 4; side_list[5] = 1;
+   side_list[6] = 6;
+
+   error = ex_put_side_set (exoid, 32, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* side set #4  - tetras */
+
+   error = ex_put_side_set_param (exoid, 33, 4, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 4; elem_list[1] = 4;
+   elem_list[2] = 4; elem_list[3] = 4;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+
+   error = ex_put_side_set (exoid, 33, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   /* side set #5  - wedges */
+
+   error = ex_put_side_set_param (exoid, 34, 5, 0);
+   printf ("after ex_put_side_set_param, error = %d\n", error);
+
+   elem_list[0] = 5; elem_list[1] = 5;
+   elem_list[2] = 5; elem_list[3] = 5;
+   elem_list[4] = 5;
+
+   side_list[0] = 1; side_list[1] = 2;
+   side_list[2] = 3; side_list[3] = 4;
+   side_list[4] = 5;
+
+   error = ex_put_side_set (exoid, 34, elem_list, side_list);
+   printf ("after ex_put_side_set, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+
+/* file 2 */
+
+   for (n=0; n<nexofiles; n++)
+   {
+     /* side set 1 */
+
+     error = ex_put_side_set_param (exoidm[n], 30, 2, 4);
+     printf ("after ex_put_side_set_param (%d), error = %d\n", n, error);
+
+     elem_list2[0] = 2; elem_list2[1] = 2;
+
+     side_list2[0] = 4; side_list2[1] = 2;
+
+     dist_fact2[0] = 30.0; dist_fact2[1] = 30.1;
+     dist_fact2[2] = 30.2; dist_fact2[3] = 30.3;
+
+     error = ex_put_side_set (exoidm[n], 30, elem_list2, side_list2);
+     printf ("after ex_put_side_set (%d), error = %d\n", n, error);
+
+     error = ex_put_side_set_dist_fact (exoidm[n], 30, dist_fact2);
+     printf ("after ex_put_side_set_dist_fact (%d), error = %d\n", n, error);
+
+     /* side set 2 */
+
+     error = ex_put_side_set_param (exoidm[n], 31, 2, 4);
+     printf ("after ex_put_side_set_param (%d), error = %d\n", n, error);
+
+     elem_list2[0] = 1; elem_list2[1] = 2;
+
+     side_list2[0] = 2; side_list2[1] = 3;
+
+     dist_fact2[0] = 31.0; dist_fact2[1] = 31.1;
+     dist_fact2[2] = 31.2; dist_fact2[3] = 31.3;
+
+     error = ex_put_side_set (exoidm[n], 31, elem_list2, side_list2);
+     printf ("after ex_put_side_set (%d), error = %d\n", n, error);
+
+     error = ex_put_side_set_dist_fact (exoidm[n], 31, dist_fact2);
+     printf ("after ex_put_side_set_dist_fact (%d), error = %d\n", n, error);
+
+     /* side set #3  - hex */
+
+     error = ex_put_side_set_param (exoidm[n], 32, 7, 0);
+     printf ("after ex_put_side_set_param (%d), error = %d\n", n, error);
+
+     elem_list2[0] = 3; elem_list2[1] = 3;
+     elem_list2[2] = 3; elem_list2[3] = 3;
+     elem_list2[4] = 3; elem_list2[5] = 3;
+     elem_list2[6] = 3;
+
+     side_list2[0] = 5; side_list2[1] = 3;
+     side_list2[2] = 3; side_list2[3] = 2;
+     side_list2[4] = 4; side_list2[5] = 1;
+     side_list2[6] = 6;
+
+     error = ex_put_side_set (exoidm[n], 32, elem_list2, side_list2);
+     printf ("after ex_put_side_set (%d), error = %d\n", n, error);
+
+     /* side set #4  - tetras */
+
+     error = ex_put_side_set_param (exoidm[n], 33, 4, 0);
+     printf ("after ex_put_side_set_param (%d), error = %d\n", n, error);
+
+     elem_list2[0] = 4; elem_list2[1] = 4;
+     elem_list2[2] = 4; elem_list2[3] = 4;
+
+     side_list2[0] = 1; side_list2[1] = 2;
+     side_list2[2] = 3; side_list2[3] = 4;
+
+     error = ex_put_side_set (exoidm[n], 33, elem_list2, side_list2);
+     printf ("after ex_put_side_set (%d), error = %d\n", n, error);
+
+     /* side set #5  - wedges */
+
+     error = ex_put_side_set_param (exoidm[n], 34, 5, 0);
+     printf ("after ex_put_side_set_param (%d), error = %d\n", n, error);
+
+     elem_list2[0] = 5; elem_list2[1] = 5;
+     elem_list2[2] = 5; elem_list2[3] = 5;
+     elem_list2[4] = 5;
+
+     side_list2[0] = 1; side_list2[1] = 2;
+     side_list2[2] = 3; side_list2[3] = 4;
+     side_list2[4] = 5;
+
+     error = ex_put_side_set (exoidm[n], 34, elem_list2, side_list2);
+     printf ("after ex_put_side_set (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_SIDE_SET, 30, "COLOR", 100);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_SIDE_SET, 31, "COLOR", 101);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+
+   }
+
+#else /* TEST_INDIV_SIDESET */
+/* write concatenated side sets; this produces the same information as
+ * the above code which writes individual side sets
+ */
+
+   ids[0] = 30;
+   ids[1] = 31;
+   ids[2] = 32;
+   ids[3] = 33;
+   ids[4] = 34;
+
+   node_list[0] = 8; node_list[1] = 5;
+   node_list[2] = 6; node_list[3] = 7;
+
+   node_list[4] = 2; node_list[5] = 3;
+   node_list[6] = 7; node_list[7] = 8;
+
+   node_list[8] = 9; node_list[9] = 12;
+   node_list[10] = 11; node_list[11] = 10;
+
+   node_list[12] = 11; node_list[13] = 12;
+   node_list[14] = 16; node_list[15] = 15;
+
+   node_list[16] = 16; node_list[17] = 15;
+   node_list[18] = 11; node_list[19] = 12;
+
+   node_list[20] = 10; node_list[21] = 11;
+   node_list[22] = 15; node_list[23] = 14;
+
+   node_list[24] = 13; node_list[25] = 16;
+   node_list[26] = 12; node_list[27] =  9;
+
+   node_list[28] = 14; node_list[29] = 13;
+   node_list[30] =  9; node_list[31] = 10;
+
+   node_list[32] = 16; node_list[33] = 13;
+   node_list[34] = 14; node_list[35] = 15;
+
+   node_list[36] = 17; node_list[37] = 18;
+   node_list[38] = 20;
+
+   node_list[39] = 18; node_list[40] = 19;
+   node_list[41] = 20;
+
+   node_list[42] = 20; node_list[43] = 19;
+   node_list[44] = 17;
+
+   node_list[45] = 19; node_list[46] = 18;
+   node_list[47] = 17;
+
+   node_list[48] = 25; node_list[49] = 24;
+   node_list[50] = 21; node_list[51] = 22;
+
+   node_list[52] = 26; node_list[53] = 25;
+   node_list[54] = 22; node_list[55] = 23;
+
+   node_list[56] = 26; node_list[57] = 23;
+   node_list[58] = 21; node_list[59] = 24;
+
+   node_list[60] = 23; node_list[61] = 22;
+   node_list[62] = 21;
+
+   node_list[63] = 24; node_list[64] = 25;
+   node_list[65] = 26;
+
+   node_ind[0] = 0;
+   node_ind[1] = 4;
+   node_ind[2] = 8;
+   node_ind[3] = 36;
+   node_ind[4] = 47;
+
+   num_elem_per_set[0] = 2;
+   num_elem_per_set[1] = 2;
+   num_elem_per_set[2] = 7;
+   num_elem_per_set[3] = 4;
+   num_elem_per_set[4] = 5;
+
+   num_nodes_per_set[0] = 4;
+   num_nodes_per_set[1] = 4;
+   num_nodes_per_set[2] = 28;
+   num_nodes_per_set[3] = 12;
+   num_nodes_per_set[4] = 18;
+
+   elem_ind[0] = 0;
+   elem_ind[1] = 2;
+   elem_ind[2] = 4;
+   elem_ind[3] = 11;
+   elem_ind[4] = 15;
+
+   elem_list[0] = 2; elem_list[1] = 2;
+   elem_list[2] = 1; elem_list[3] = 2;
+   elem_list[4] = 3; elem_list[5] = 3;
+   elem_list[6] = 3; elem_list[7] = 3;
+   elem_list[8] = 3; elem_list[9] = 3;
+   elem_list[10] = 3; elem_list[11] = 4;
+   elem_list[12] = 4; elem_list[13] = 4;
+   elem_list[14] = 4; elem_list[15] = 5;
+   elem_list[16] = 5; elem_list[17] = 5;
+   elem_list[18] = 5; elem_list[19] = 5;
+
+   error = ex_cvt_nodes_to_sides(exoid,
+                         num_elem_per_set,
+                         num_nodes_per_set,
+                         elem_ind,
+                         node_ind,
+                         elem_list,
+                         node_list,
+                         side_list);
+   printf ("after ex_cvt_nodes_to_sides, error = %d\n", error);
+
+   num_df_per_set[0] = 4;
+   num_df_per_set[1] = 4;
+   num_df_per_set[2] = 0;
+   num_df_per_set[3] = 0;
+   num_df_per_set[4] = 0;
+
+   df_ind[0] = 0;
+   df_ind[1] = 4;
+
+   dist_fact[0] = 30.0; dist_fact[1] = 30.1;
+   dist_fact[2] = 30.2; dist_fact[3] = 30.3;
+
+   dist_fact[4] = 31.0; dist_fact[5] = 31.1;
+   dist_fact[6] = 31.2; dist_fact[7] = 31.3;
+
+   error = ex_put_concat_side_sets (exoid, ids, num_elem_per_set,
+                                    num_df_per_set, elem_ind, df_ind,
+                                    elem_list, side_list, dist_fact);
+   printf ("after ex_put_concat_side_sets, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 30, "COLOR", 100);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+   error = ex_put_prop(exoid, EX_SIDE_SET, 31, "COLOR", 101);
+   printf ("after ex_put_prop, error = %d\n", error);
+
+
+/* file 2 */
+
+   ids2[0] = 30;
+   ids2[1] = 31;
+   ids2[2] = 32;
+   ids2[3] = 33;
+   ids2[4] = 34;
+
+   node_list2[0] = 8; node_list2[1] = 5;
+   node_list2[2] = 6; node_list2[3] = 7;
+
+   node_list2[4] = 2; node_list2[5] = 3;
+   node_list2[6] = 7; node_list2[7] = 8;
+
+   node_list2[8] = 9; node_list2[9] = 12;
+   node_list2[10] = 11; node_list2[11] = 10;
+
+   node_list2[12] = 11; node_list2[13] = 12;
+   node_list2[14] = 16; node_list2[15] = 15;
+
+   node_list2[16] = 16; node_list2[17] = 15;
+   node_list2[18] = 11; node_list2[19] = 12;
+
+   node_list2[20] = 10; node_list2[21] = 11;
+   node_list2[22] = 15; node_list2[23] = 14;
+
+   node_list2[24] = 13; node_list2[25] = 16;
+   node_list2[26] = 12; node_list2[27] =  9;
+
+   node_list2[28] = 14; node_list2[29] = 13;
+   node_list2[30] =  9; node_list2[31] = 10;
+
+   node_list2[32] = 16; node_list2[33] = 13;
+   node_list2[34] = 14; node_list2[35] = 15;
+
+   node_list2[36] = 17; node_list2[37] = 18;
+   node_list2[38] = 20;
+
+   node_list2[39] = 18; node_list2[40] = 19;
+   node_list2[41] = 20;
+
+   node_list2[42] = 20; node_list2[43] = 19;
+   node_list2[44] = 17;
+
+   node_list2[45] = 19; node_list2[46] = 18;
+   node_list2[47] = 17;
+
+   node_list2[48] = 25; node_list2[49] = 24;
+   node_list2[50] = 21; node_list2[51] = 22;
+
+   node_list2[52] = 26; node_list2[53] = 25;
+   node_list2[54] = 22; node_list2[55] = 23;
+
+   node_list2[56] = 26; node_list2[57] = 23;
+   node_list2[58] = 21; node_list2[59] = 24;
+
+   node_list2[60] = 23; node_list2[61] = 22;
+   node_list2[62] = 21;
+
+   node_list2[63] = 24; node_list2[64] = 25;
+   node_list2[65] = 26;
+
+   node_ind2[0] = 0;
+   node_ind2[1] = 4;
+   node_ind2[2] = 8;
+   node_ind2[3] = 36;
+   node_ind2[4] = 47;
+
+   num_elem_per_set2[0] = 2;
+   num_elem_per_set2[1] = 2;
+   num_elem_per_set2[2] = 7;
+   num_elem_per_set2[3] = 4;
+   num_elem_per_set2[4] = 5;
+
+   num_nodes_per_set2[0] = 4;
+   num_nodes_per_set2[1] = 4;
+   num_nodes_per_set2[2] = 28;
+   num_nodes_per_set2[3] = 12;
+   num_nodes_per_set2[4] = 18;
+
+   elem_ind2[0] = 0;
+   elem_ind2[1] = 2;
+   elem_ind2[2] = 4;
+   elem_ind2[3] = 11;
+   elem_ind2[4] = 15;
+
+   elem_list2[0] = 2; elem_list2[1] = 2;
+   elem_list2[2] = 1; elem_list2[3] = 2;
+   elem_list2[4] = 3; elem_list2[5] = 3;
+   elem_list2[6] = 3; elem_list2[7] = 3;
+   elem_list2[8] = 3; elem_list2[9] = 3;
+   elem_list2[10] = 3; elem_list2[11] = 4;
+   elem_list2[12] = 4; elem_list2[13] = 4;
+   elem_list2[14] = 4; elem_list2[15] = 5;
+   elem_list2[16] = 5; elem_list2[17] = 5;
+   elem_list2[18] = 5; elem_list2[19] = 5;
+
+   num_df_per_set2[0] = 4;
+   num_df_per_set2[1] = 4;
+   num_df_per_set2[2] = 0;
+   num_df_per_set2[3] = 0;
+   num_df_per_set2[4] = 0;
+
+   df_ind2[0] = 0;
+   df_ind2[1] = 4;
+
+   dist_fact2[0] = 30.0; dist_fact2[1] = 30.1;
+   dist_fact2[2] = 30.2; dist_fact2[3] = 30.3;
+
+   dist_fact2[4] = 31.0; dist_fact2[5] = 31.1;
+   dist_fact2[6] = 31.2; dist_fact2[7] = 31.3;
+
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_cvt_nodes_to_sides(exoidm[n],
+                         num_elem_per_set2,
+                         num_nodes_per_set2,
+                         elem_ind2,
+                         node_ind2,
+                         elem_list2,
+                         node_list2,
+                         side_list2);
+     printf ("after ex_cvt_nodes_to_sides (%d), error = %d\n", n, error);
+
+     error = ex_put_concat_side_sets (exoidm[n], ids2, num_elem_per_set2,
+                                      num_df_per_set2, elem_ind2, df_ind2,
+                                      elem_list2, side_list2, dist_fact2);
+     printf ("after ex_put_concat_side_sets (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_SIDE_SET, 30, "COLOR", 100);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+
+     error = ex_put_prop(exoidm[n], EX_SIDE_SET, 31, "COLOR", 101);
+     printf ("after ex_put_prop (%d), error = %d\n", n, error);
+
+
+   }
+
+
+
+   /* END COMMENTED OUT SECTION */
+
+#endif /* TEST_INDIV_SIDESET */
+
+/* write QA records */
+
+   num_qa_rec = 2;
+
+
+   qa_record[0][0] = "TESTWTM";
+   qa_record[0][1] = "testwtm";
+   qa_record[0][2] = "07/07/93";
+   qa_record[0][3] = "15:41:33";
+   qa_record[1][0] = "FASTQ";
+   qa_record[1][1] = "fastq";
+   qa_record[1][2] = "07/07/93";
+   qa_record[1][3] = "16:41:33";
+
+   error = ex_put_qa (exoid, num_qa_rec, qa_record);
+   printf ("after ex_put_qa, error = %d\n", error);
+
+   num_qa_rec2 = 2;
+
+   qa_record2[0][0] = "TESTWTM";
+   qa_record2[0][1] = "testwtm";
+   qa_record2[0][2] = "07/07/93";
+   qa_record2[0][3] = "15:41:33";
+   qa_record2[1][0] = "FASTQ";
+   qa_record2[1][1] = "fastq";
+   qa_record2[1][2] = "07/07/93";
+   qa_record2[1][3] = "16:41:33";
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_qa (exoidm[n], num_qa_rec2, qa_record2);
+     printf ("after ex_put_qa (%d), error = %d\n", n, error);
+   }
+
+
+/* write information records */
+
+   num_info = 3;
+
+   info[0] = "This is the first information record.";
+   info[1] = "This is the second information record.";
+   info[2] = "This is the third information record.";
+
+   error = ex_put_info (exoid, num_info, info);
+   printf ("after ex_put_info, error = %d\n", error);
+
+   num_info2 = 3;
+
+   info2[0] = "This is the first information record.";
+   info2[1] = "This is the second information record.";
+   info2[2] = "This is the third information record.";
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_info (exoidm[n], num_info2, info2);
+     printf ("after ex_put_info (%d), error = %d\n", n, error);
+   }
+
+
+/* write results variables parameters and names */
+
+   num_glo_vars = 1;
+
+   var_names[0] = "glo_vars";
+
+   error = ex_put_var_param (exoid, "g", num_glo_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "g", num_glo_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_glo_vars2 = 1;
+
+   var_names2[0] = "glo_vars";
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_var_param (exoidm[n], "g", num_glo_vars2);
+     printf ("after ex_put_var_param (%d), error = %d\n", n, error);
+     error = ex_put_var_names (exoidm[n], "g", num_glo_vars2, var_names2);
+     printf ("after ex_put_var_names (%d), error = %d\n", n, error);
+   }
+
+   num_nod_vars = 2;
+
+   var_names[0] = "nod_var0";
+   var_names[1] = "nod_var1";
+
+   error = ex_put_var_param (exoid, "n", num_nod_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "n", num_nod_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_nod_vars2 = 2;
+
+   var_names2[0] = "nod_var0";
+   var_names2[1] = "nod_var1";
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_var_param (exoidm[n], "n", num_nod_vars2);
+     printf ("after ex_put_var_param (%d), error = %d\n", n, error);
+     error = ex_put_var_names (exoidm[n], "n", num_nod_vars2, var_names2);
+     printf ("after ex_put_var_names (%d), error = %d\n", n, error);
+   }
+
+
+   num_ele_vars = 3;
+
+   var_names[0] = "ele_var0";
+   var_names[1] = "ele_var1";
+   var_names[2] = "ele_var2";
+
+   error = ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, error = %d\n", error);
+   error = ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, error = %d\n", error);
+
+   num_ele_vars2 = 3;
+
+   var_names2[0] = "ele_var20";
+   var_names2[1] = "ele_var21";
+   var_names2[2] = "ele_var22";
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_put_var_param (exoidm[n], "e", num_ele_vars2);
+     printf ("after ex_put_var_param (%d), error = %d\n", n, error);
+     error = ex_put_var_names (exoidm[n], "e", num_ele_vars, var_names);
+     printf ("after ex_put_var_names (%d), error = %d\n", n, error);
+   }
+
+
+
+/* write element variable truth table */
+
+   truth_tab = (int *) calloc ((num_elem_blk*num_ele_vars), sizeof(int));
+
+   k = 0;
+   for (i=0; i<num_elem_blk; i++)
+   {
+      for (j=0; j<num_ele_vars; j++)
+      {
+         truth_tab[k++] = 1;
+      }
+   }
+
+   error = ex_put_elem_var_tab (exoid, num_elem_blk, num_ele_vars, truth_tab);
+   printf ("after ex_put_elem_var_tab, error = %d\n", error);
+
+   for (n=0; n<nexofiles; n++)
+   {
+     error=ex_put_elem_var_tab(exoidm[n],num_elem_blk,num_ele_vars,truth_tab);
+     printf ("after ex_put_elem_var_tab (%d), error = %d\n", n, error);
+   }
+
+   free (truth_tab);
+
+
+/* for each time step, write the analysis results;
+ * the code below fills the arrays  glob_var_vals, 
+ * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+ * obviously the analysis code will populate these arrays
+ */
+
+   whole_time_step = 1;
+   num_time_steps = 10;
+
+   glob_var_vals = (float *) calloc (num_glo_vars, sizeof(CPU_word_size));
+   nodal_var_vals = (float *) calloc (num_nodes, sizeof(CPU_word_size));
+   elem_var_vals = (float *) calloc (4, sizeof(CPU_word_size));
+
+   for (i=0; i<num_time_steps; i++)
+   {
+     time_value = (float)(i+1)/100.;
+     time_value2 = (float)(i+1)/100.;
+
+
+/* write time value */
+
+     error = ex_put_time (exoid, whole_time_step, &time_value);
+     printf ("after ex_put_time, error = %d\n", error);
+
+
+     for (n=0; n<nexofiles; n++)
+     {
+       error = ex_put_time (exoidm[n], whole_time_step, &time_value2);
+       printf ("after ex_put_time (%d), error = %d\n", n, error);
+     }
+
+/* write global variables */
+
+     for (j=0; j<num_glo_vars; j++)
+     {
+       glob_var_vals[j] = (float)(j+2) * time_value;
+     }
+
+     error = ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, 
+                               glob_var_vals);
+     printf ("after ex_put_glob_vars, error = %d\n", error);
+
+     for (n=0; n<nexofiles; n++)
+     {
+       error = ex_put_glob_vars (exoidm[n], whole_time_step, num_glo_vars, 
+                                 glob_var_vals);
+       printf ("after ex_put_glob_vars (%d), error = %d\n", n, error);
+
+     }
+/* write nodal variables */
+
+     for (k=1; k<=num_nod_vars; k++)
+     {
+       for (j=0; j<num_nodes; j++)
+       {
+         nodal_var_vals[j] = (float)k + ((float)(j+1) * time_value);
+       }
+
+       error = ex_put_nodal_var (exoid, whole_time_step, k, num_nodes,
+                                 nodal_var_vals);
+       printf ("after ex_put_nodal_var, error = %d\n", error);
+
+       for (n=0; n<nexofiles; n++)
+       {
+         error = ex_put_nodal_var (exoidm[n], whole_time_step, k, num_nodes,
+                                   nodal_var_vals);
+         printf ("after ex_put_nodal_var (%d), error = %d\n", n, error);
+       }
+     }
+
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                                ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         error = ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, error = %d\n", error);
+
+         for (n=0; n<nexofiles; n++)
+         {
+           error = ex_put_elem_var (exoidm[n], whole_time_step, k, ebids[j],
+                                    num_elem_in_block[j], elem_var_vals);
+           printf ("after ex_put_elem_var (%d), error = %d\n", n, error);
+         }
+       }
+     }
+
+     whole_time_step++;
+
+/* update the data file; this should be done at the end of every time step
+ * to ensure that no data is lost if the analysis dies
+ */
+     error = ex_update (exoid);
+     printf ("after ex_update, error = %d\n", error);
+     for (n=0; n<nexofiles; n++)
+     {
+       error = ex_update (exoidm[n]);
+       printf ("after ex_update (%d), error = %d\n", n, error);
+     }
+   }
+   free(glob_var_vals);
+   free(nodal_var_vals);
+   free(elem_var_vals);
+
+
+/* close the EXODUS files
+ */
+   error = ex_close (exoid);
+   printf ("after ex_close, error = %d\n", error);
+   for (n=0; n<nexofiles; n++)
+   {
+     error = ex_close (exoidm[n]);
+     printf ("after ex_close (%d), error = %d\n", n, error);
+   }
+   return 0;
+}
diff --git a/exodus/cbind/test/twod.c b/exodus/cbind/test/twod.c
new file mode 100644
index 0000000..47caa10
--- /dev/null
+++ b/exodus/cbind/test/twod.c
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "exodusII.h"
+
+int main (int argc, char **argv)
+{
+  int num_glo_vars = 10;
+  int num_nod_vars = 2;
+  int CPU_word_size = 8; 
+  int IO_word_size = 8;
+  const char* title = "This is a 2D mesh example with tri, quad, beam, truss, circle";
+  int ebids[] = {100, 200, 300, 400, 500};
+  int num_dim   =  2;
+  int num_nodes = 13;
+  int num_elem  = 20;
+  int num_elem_blk = 5;
+  int num_node_sets = 2;
+  int num_side_sets = 2;
+
+  /* create EXODUS II file */
+  int exoid = ex_create ("twod.e",       /* filename path */
+			 EX_CLOBBER,      /* create mode */
+			 &CPU_word_size,  /* CPU float word size in bytes */
+			 &IO_word_size);  /* I/O float word size in bytes */
+
+   ex_opts(EX_VERBOSE);
+
+   /* initialize file with parameters */
+     ex_put_init (exoid, title, num_dim, num_nodes, num_elem,
+			  num_elem_blk, num_node_sets, num_side_sets);
+
+     /* write nodal coordinates values and names to database */
+     {
+       double x[13], y[13];
+       x[0]  =  0.0; y[0]  =  0.0;
+       x[1]  = -0.5; y[1]  = -0.5;
+       x[2]  =  0.5; y[2]  = -0.5;
+       x[3]  =  0.5; y[3]  =  0.5;
+       x[4]  = -0.5; y[4]  =  0.5;
+       x[5]  = -1.0; y[5]  = -1.0;
+       x[6]  =  1.0; y[6]  = -1.0;
+       x[7]  =  1.0; y[7]  =  1.0;
+       x[8]  = -1.0; y[8]  =  1.0;
+       x[9]  = -2.0; y[9]  =  0.0;
+       x[10] =  0.0; y[10] = -2.0;
+       x[11] =  2.0; y[11] =  0.0;
+       x[12] =  0.0; y[12] =  2.0;
+
+       ex_put_coord (exoid, x, y, 0);
+     }
+
+     {
+       const char* coord_names[] = {"xcoor", "ycoor"};
+       ex_put_coord_names (exoid, (char**)coord_names);
+     }
+
+
+     {
+       int node_map[] = {10,20,30,40,50,60,70,80,90,100,110,120,130};
+       ex_put_node_num_map(exoid, node_map);
+     }
+
+     /* write element order map */
+     {
+       int elem_map[] = {11,21,31,41, 52, 62, 72, 82, 93,103,113,123,133,143,153,163,  174,184,194,204};
+       ex_put_elem_num_map (exoid, elem_map);
+     }
+
+     /* write element block parameters */
+     {
+       const char* block_names[] = {"Triangles", "Quadrilaterals", "", "Trusses", "Circles"};
+       int num_elem_in_block[] = {4, 4, 4, 4, 4};
+       int num_nodes_per_elem[] = {3, 4, 2, 2, 1};
+
+       ex_put_elem_block (exoid, ebids[0], "triangle", num_elem_in_block[0], num_nodes_per_elem[0], 0);
+       ex_put_elem_block (exoid, ebids[1], "quad",     num_elem_in_block[1], num_nodes_per_elem[1], 0);
+       ex_put_elem_block (exoid, ebids[2], "beam",     num_elem_in_block[2], num_nodes_per_elem[2], 3);
+       ex_put_elem_block (exoid, ebids[3], "truss",    num_elem_in_block[3], num_nodes_per_elem[3], 1);
+       ex_put_elem_block (exoid, ebids[4], "circle",   num_elem_in_block[4], num_nodes_per_elem[4], 2);
+
+       /* Write element block names */
+       ex_put_names(exoid, EX_ELEM_BLOCK, (char**)block_names);
+     }
+
+     /* write element connectivity */
+     {
+       int conn_t[] = {2,3,1,  3,4,1,  4,5,1,  5,2,1};
+       int conn_q[] = {6,7,3,2,  7,8,4,3,  8,9,5,4,  9,6,2,5};
+       int conn_B[] = {11,7,  8,13,  13,9,  6,11};
+       int conn_T[] = {10,6,  9,10,  7,12,  12,8};
+       int conn_c[] = {6,7,8,9};
+       
+       ex_put_elem_conn (exoid, ebids[0], conn_t);
+       ex_put_elem_conn (exoid, ebids[1], conn_q);
+       ex_put_elem_conn (exoid, ebids[2], conn_B);
+       ex_put_elem_conn (exoid, ebids[3], conn_T);
+       ex_put_elem_conn (exoid, ebids[4], conn_c);
+     }
+
+     /* write element block attributes */
+     {
+       const char* attn_T[] = {"Area"};
+       double attr_T[] = {1.0, 1.1, 1.2, 1.3};
+
+       const char* attn_B[] = {"A", "I", "J"};
+       double attr_B[] = {1.0, 100.0, 200.0,   1.1, 100.1, 200.1,  1.2, 100.2, 200.2,  1.3, 100.3, 200.3};
+
+       const char* attn_c[] = {"Radius", "A"};
+       double attr_c[] = {1.0, 3.14, 1.1, 4.14, 1.2, 5.14, 1.3, 6.14};
+     
+       ex_put_elem_attr (exoid, ebids[2], attr_B);
+       ex_put_elem_attr (exoid, ebids[3], attr_T);
+       ex_put_elem_attr (exoid, ebids[4], attr_c);
+
+       ex_put_elem_attr_names (exoid, ebids[2], (char**)attn_B);
+       ex_put_elem_attr_names (exoid, ebids[3], (char**)attn_T);
+       ex_put_elem_attr_names (exoid, ebids[4], (char**)attn_c);
+     }
+
+     /* write individual node sets */
+     {
+       int num_nodes_in_nset[] = {5, 8};
+       int nsids[] = {20, 22};
+       int nod1[] = {5,4,3,2,1};
+       int nod2[] = {6,7,8,9,2,3,4,5};
+       const char* nset_names[] = {"Triangle_Nodes", "Quadrilateral_Nodes"};
+
+       ex_put_set_param (exoid, EX_NODE_SET, nsids[0], num_nodes_in_nset[0], 0);
+       ex_put_set_param (exoid, EX_NODE_SET, nsids[1], num_nodes_in_nset[1], 0);
+
+       ex_put_set (exoid, EX_NODE_SET, nsids[0], nod1, 0);
+       ex_put_set (exoid, EX_NODE_SET, nsids[1], nod2, 0);
+       ex_put_names(exoid, EX_NODE_SET, (char**)nset_names);
+     }
+
+     {
+       /* write individual side sets */
+       int num_face_in_sset[] =  {4,4};
+       int ssids[] = {100,200};
+       int ss1el[] = {1,2,3,4};
+       int ss1si[] = {1,1,1,1};
+       
+       int ss2el[] = {5,7,6,8};
+       int ss2si[] = {1,1,1,1};
+       const char* sset_names[] = {"A", "B"};
+       
+       ex_put_set_param (exoid, EX_SIDE_SET, ssids[0], num_face_in_sset[0], 0);
+       ex_put_set_param (exoid, EX_SIDE_SET, ssids[1], num_face_in_sset[1], 0);
+       
+       ex_put_set (exoid, EX_SIDE_SET, ssids[0], ss1el, ss1si);
+       ex_put_set (exoid, EX_SIDE_SET, ssids[1], ss2el, ss2si);
+       ex_put_names(exoid, EX_SIDE_SET, (char**)sset_names);
+     }
+
+
+     /* write results variables parameters and names */
+     {
+       const char* gvarn[] = {"g_01", "g_02", "g_03", "g_04", "g_05", "g_06", "g_07", "g_08", "g_09", "g_10"};
+       ex_put_variable_param (exoid, EX_GLOBAL, num_glo_vars);
+       ex_put_variable_names (exoid, EX_GLOBAL, num_glo_vars, (char**)gvarn);
+     }
+
+     {
+       const char* nvarn[] = {"disp_x", "disp_y"};
+       ex_put_variable_param (exoid, EX_NODAL, num_nod_vars);
+       ex_put_variable_names (exoid, EX_NODAL, num_nod_vars, (char**)nvarn);
+     }
+
+     
+#if 0
+   num_ele_vars = 3;
+   /*              0        1         2         3   */
+   /*              12345678901234567890123456789012 */
+   var_names[0] = "this_variable_name_is_short";
+   var_names[1] = "this_variable_name_is_just_right";
+   var_names[2] = "this_variable_name_is_tooooo_long";
+
+   ex_put_var_param (exoid, "e", num_ele_vars);
+   printf ("after ex_put_var_param, %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   ex_put_var_names (exoid, "e", num_ele_vars, var_names);
+   printf ("after ex_put_var_names, %d\n", error);
+   if (error) {
+     ex_close (exoid);
+     exit(-1);
+   }
+
+   {
+     num_nset_vars = 3;
+     
+     var_names[0] = "ns_var0";
+     var_names[1] = "ns_var1";
+     var_names[2] = "ns_var2";
+     
+     ex_put_var_param (exoid, "m", num_nset_vars);
+     printf ("after ex_put_var_param, %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     ex_put_var_names (exoid, "m", num_nset_vars, var_names);
+     printf ("after ex_put_var_names, %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+   
+   {
+     num_sset_vars = 3;
+
+     var_names[0] = "ss_var0";
+     var_names[1] = "ss_var1";
+     var_names[2] = "ss_var2";
+     
+     ex_put_var_param (exoid, "s", num_sset_vars);
+     printf ("after ex_put_var_param, %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+     
+     ex_put_var_names (exoid, "s", num_sset_vars, var_names);
+     printf ("after ex_put_var_names, %d\n", error);
+     if (error) {
+       ex_close (exoid);
+       exit(-1);
+     }
+   }
+#endif
+   
+   /* for each time step, write the analysis results;
+    * the code below fills the arrays glob_var_vals, 
+    * nodal_var_vals, and elem_var_vals with values for debugging purposes;
+    * obviously the analysis code will populate these arrays
+    */
+
+   {
+     int i, j, k;
+     int whole_time_step = 1;
+     int num_time_steps = 10;
+
+     double gvar[10];
+     double nvar[20];
+   
+     for (i=0; i<num_time_steps; i++) {
+       double time_value = (double)(i)/100.;
+
+       ex_put_time (exoid, whole_time_step, &time_value);
+
+       for (j=0; j<num_glo_vars; j++) {
+	 gvar[j] = (double)(j+2) * time_value;
+       }
+       ex_put_glob_vars (exoid, whole_time_step, num_glo_vars, gvar);
+
+       /* write nodal variables */
+       for (k=0; k < num_nod_vars; k++) {
+	 for (j=0; j<num_nodes; j++) {
+	   nvar[j] = (double)k + ((double)(j+1) * time_value);
+	 }
+	 
+	 ex_put_nodal_var (exoid, whole_time_step, k+1, num_nodes, nvar);
+       }
+       
+#if 0
+/* write element variables */
+
+     for (k=1; k<=num_ele_vars; k++)
+     {
+       for (j=0; j<num_elem_blk; j++)
+       {
+         for (m=0; m<num_elem_in_block[j]; m++)
+         {
+           elem_var_vals[m] = (float)(k+1) + (float)(j+2) + 
+                              ((float)(m+1)*time_value);
+           /* printf("elem_var_vals[%d]: %f\n",m,elem_var_vals[m]); */
+         }
+         ex_put_elem_var (exoid, whole_time_step, k, ebids[j],
+                                  num_elem_in_block[j], elem_var_vals);
+         printf ("after ex_put_elem_var, %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write sideset variables */
+
+     for (k=1; k<=num_sset_vars; k++)
+     {
+       for (j=0; j<num_side_sets; j++)
+       {
+         for (m=0; m<num_face_in_sset[j]; m++)
+         {
+           sset_var_vals[m] = (float)(k+2) + (float)(j+3) + 
+                              ((float)(m+1)*time_value);
+           /* printf("sset_var_vals[%d]: %f\n",m,sset_var_vals[m]); */
+         }
+         ex_put_sset_var (exoid, whole_time_step, k, ssids[j],
+                                  num_face_in_sset[j], sset_var_vals);
+         printf ("after ex_put_sset_var, %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+
+/* write nodeset variables */
+
+     for (k=1; k<=num_nset_vars; k++)
+     {
+       for (j=0; j<num_node_sets; j++)
+       {
+         for (m=0; m<num_nodes_in_nset[j]; m++)
+         {
+           nset_var_vals[m] = (float)(k+3) + (float)(j+4) + 
+                              ((float)(m+1)*time_value);
+           /* printf("nset_var_vals[%d]: %f\n",m,nset_var_vals[m]); */
+         }
+         ex_put_nset_var (exoid, whole_time_step, k, nsids[j],
+                                  num_nodes_in_nset[j], nset_var_vals);
+         printf ("after ex_put_nset_var, %d\n", error);
+         if (error) {
+           ex_close (exoid);
+           exit(-1);
+         }
+       }
+     }
+#endif
+
+     whole_time_step++;
+   }
+   }
+   ex_close (exoid);
+   return 0;
+}
diff --git a/exodus/cbind/test/update_all_tests b/exodus/cbind/test/update_all_tests
new file mode 100644
index 0000000..e848df8
--- /dev/null
+++ b/exodus/cbind/test/update_all_tests
@@ -0,0 +1,232 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SRCDIR = .
+set NCDUMP = /Users/gdsjaar/src/SEACAS/bin/ncdump
+echo "************************************************************************"
+echo "************************************************************************"
+rm -f test.output
+echo "testwt - single precision write test..."
+echo "begin testwt" > test.output
+${PREFIX} ${SRCDIR}/testwt >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/test.dmp
+
+echo "testrd - single precision read test..."
+echo "begin testrd" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd.dmp 
+echo "end testrd" >> test.output
+
+echo "testrdv - single precision read test with varid..."
+echo "begin testrdv" >> test.output
+${PREFIX} ${SRCDIR}/testrdv | grep -v version > ${SRCDIR}/testrdv.dmp
+echo "end testrdv" >> test.output
+
+echo "testcp_ss - single-to-single precision copy test..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version > ${SRCDIR}/testcp_ss.dmp
+
+echo "testcp_sd - single-to-double precision copy test..."
+echo "begin testcp_sd" >> test.output
+${PREFIX} ${SRCDIR}/testcpd >> test.output
+echo "end testcp_sd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version > ${SRCDIR}/testcp_sd.dmp
+
+echo "testcp_ln - large model to normal model single precision copy test..."
+echo "begin testcp_ln" >> test.output
+${PREFIX} ${SRCDIR}/testcp_ln >> test.output
+echo "end testcp_ln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version > ${SRCDIR}/testcp_ln.dmp
+
+echo "testcp_nl - normal_model to large_model single precision copy test..."
+echo "begin testcp_nl" >> test.output
+${PREFIX} ${SRCDIR}/testcp_nl >> test.output
+echo "end testcp_nl" >> test.output
+${NCDUMP} -d5,5 testcp_nl.exo | grep -v version > ${SRCDIR}/testcp_nl.dmp 
+
+echo "testwt_clb - single precision write test using concatenated puts..."
+echo "begin testwt_clb" >> test.output
+${PREFIX} ${SRCDIR}/testwt_clb >> test.output
+echo "end testwt_clb" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/test_clb.dmp
+
+echo "testwtd - double precision write test..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${SRCDIR}/testwtd >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/testd.dmp
+
+echo "testrdd - double precision read test..."
+echo "begin testrdd" >> test.output
+${PREFIX} ${SRCDIR}/testrdd | grep -v version >- ${SRCDIR}/testrdd.dmp
+echo "end testrdd" >> test.output
+
+echo "testcp_dd - double-to-double precision copy test..."
+echo "begin testcp_dd" >> test.output
+${PREFIX} ${SRCDIR}/testcpd >> test.output
+echo "end testcp_dd" >> test.output
+${NCDUMP} -d5,5 testcpd.exo | grep -v version > ${SRCDIR}/testcp_dd.dmp
+
+echo "testcp_ds - double-to-single precision copy test..."
+echo "begin testcp_ds" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ds" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version > ${SRCDIR}/testcp_ds.dmp
+
+echo "testwt1 - single precision write files with several side sets..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${SRCDIR}/testwt1 >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/test1.dmp 
+
+echo "testrd1 - single precision read test of a file with several side sets..."
+echo "testrd1 ... [Expect file create failure error, NOCLOBBER]"
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+echo "begin testrd1" >> test.output
+${PREFIX} ${SRCDIR}/testrd1 | grep -v version > ${SRCDIR}/testrd1.dmp 
+echo "end testrd1" >> test.output
+
+echo "testwt_ss - write files to test side sets..."
+echo "testwt_ss ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt_ss" >> test.output
+${PREFIX} ${SRCDIR}/testwt_ss >> test.output
+echo "end testwt_ss" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/testwt_ss.dmp
+
+echo "testrd_ss - read test of a file with several side sets..."
+echo "testrd_ss ... [Expect warning for NULL sidesets 30 and 31]"
+echo "begin testrd_ss" >> test.output
+${PREFIX} ${SRCDIR}/testrd_ss | grep -v version > ${SRCDIR}/testrd_ss.dmp
+echo "end testrd_ss" >> test.output
+
+echo "testwt2 - single precision write 2 files (simultaneously open) test..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${SRCDIR}/testwt2 >> test.output
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/test2-1.dmp
+${NCDUMP} -d5,5 test2.exo | grep -v version > ${SRCDIR}/test2-2.dmp
+
+echo "testrdwt - read from one and write to another (simutaneously open) file..."
+echo "begin testrdwt" >> test.output
+${PREFIX} ${SRCDIR}/testrdwt >> test.output
+echo "end testrdwt" >> test.output
+${NCDUMP} -d5,5 test2.exo | grep -v version > ${SRCDIR}/test2.dmp
+
+echo "testwt_nc - write x y z components of coordinates separately..."
+echo "begin testwt_nc" >> test.output
+${PREFIX} ${SRCDIR}/testwt_nc >> test.output
+echo "end testwt_nc" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/test.dmp
+
+echo "testrd_nc - read x y z components of coordinates separately..."
+echo "begin testrd_nc" >> test.output
+${PREFIX} ${SRCDIR}/testrd_nc | grep -v version > ${SRCDIR}/testrd_nc.dmp
+echo "end testrd" >> test.output
+
+echo "testwt-zeron - write file with zero nodes and elements..."
+echo "begin testwt-zeron" >> test.output
+${PREFIX} ${SRCDIR}/testwt-zeron >> test.output
+echo "end testwt-zeron" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/testwt-zeron.dmp
+
+echo "testrd - read test of file with zero nodes and elements..."
+echo "begin testrd zero nodes" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd_zeron.dmp
+echo "end testrd zero nodes" >> test.output
+
+echo "testwt-zeroe - write file with zero elements..."
+echo "begin testwt-zeroe" >> test.output
+${PREFIX} ${SRCDIR}/testwt-zeroe >> test.output
+echo "end testwt-zeroe" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/testwt-zeroe.dmp
+
+echo "testrd - read test of file with zero elements..."
+echo "begin testrd zero elements" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd_zeroe.dmp 
+echo "end testrd zero elements" >> test.output
+
+echo "testwt-one-attrib - read/write test of element attributes - read one at a time..."
+echo "begin testwt-one-attrib - read attributes one at a time" >> test.output
+${PREFIX} ${SRCDIR}/testwt-one-attrib | tee testrd_zeroe.res
+echo "end testwt-one-attrib - read attributes one at a time" >> test.output
+
+echo "testwt-nsided - write file with nsided elements..."
+echo "begin testwt-nsided" >> test.output
+${PREFIX} ${SRCDIR}/testwt-nsided >> test.output
+echo "end testwt-nsided" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version > ${SRCDIR}/testwt-nsided.dmp
+
+echo "testrd-nsided - read file with nsided elements..."
+echo "begin testrd-nsided" >> test.output
+${PREFIX} ${SRCDIR}/testrd-nsided | grep -v version > ${SRCDIR}/testrd-nsided.dmp
+echo "end testrd-nsided" >> test.output
+
+echo "testwt-nfaced - write file with nfaced elements..."
+echo "begin testwt-nfaced" >> test.output
+${PREFIX} ${SRCDIR}/testwt-nfaced >> test.output
+echo "end testwt-nfaced" >> test.output
+${NCDUMP} -d5,5 test-nfaced.exo | grep -v version > ${SRCDIR}/testwt-nfaced.dmp
+
+echo "testrd-nfaced - read file with nfaced elements..."
+echo "begin testrd-nfaced" >> test.output
+${PREFIX} ${SRCDIR}/testrd-nfaced | grep -v version > ${SRCDIR}/testrd-nfaced.dmp
+echo "end testrd-nfaced" >> test.output
+
+echo "testwt-long-name - write file with long (64-character) names..."
+echo "begin testwt-long-name" >> test.output
+${PREFIX} ${SRCDIR}/testwt-long-name >> test.output
+echo "end testwt-long-name" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version > ${SRCDIR}/testwt-long-name.dmp
+
+echo "testrd - read long name file truncating to 32 characters on read..."
+echo "begin testrd (truncate)" >> test.output
+${PREFIX} ${SRCDIR}/testrd | grep -v version > ${SRCDIR}/testrd-nm32.dmp 
+echo "end testrd (truncate)" >> test.output
+
+echo "testrd-long-name - read long name file..."
+echo "begin testrd-long-name" >> test.output
+${PREFIX} ${SRCDIR}/testrd-long-name | grep -v version > ${SRCDIR}/testrd-long-name.dmp
+echo "end testrd-long-name" >> test.output
+
+echo "************************************************************************"
+echo "************************************************************************"
diff --git a/exodus/cmake-script b/exodus/cmake-script
new file mode 100755
index 0000000..9c53d67
--- /dev/null
+++ b/exodus/cmake-script
@@ -0,0 +1,36 @@
+EXTRA_ARGS=$@
+
+# Fortran compiler
+FC=/opt/local/bin/gfortran-mp-4.8
+
+# Root to where netcdf and hdf5 libraries and includes 
+# are installed. Libraries will be in LIB_ROOT/lib and 
+# includes will be in LIB_ROOT/include
+LIB_ROOT=/usr/local/lib
+
+# Root of where to install the exodus libraries and
+# include files.  Library will be in INSTALL_ROOT/lib
+# and include file in INSTALL_ROOT/include
+INSTALL_ROOT=/usr/local/lib
+
+# Complete path to where the exodus.py file should be installed
+PYTHON_INSTALL=${INSTALL_ROOT}/python
+
+rm -f CMakeCache.txt
+
+cmake  \
+-DBUILD_SHARED=ON \
+-DCMAKE_INSTALL_PREFIX:PATH=${INSTALL_ROOT} \
+-DCMAKE_Fortran_COMPILER:FILEPATH=${FC} \
+-DNETCDF_NCDUMP:PATH=${LIB_ROOT}/bin/ncdump \
+-DNETCDF_SO_ROOT:PATH=${LIB_ROOT}/lib/shared \
+-DNETCDF_INCLUDE_DIR:PATH=${LIB_ROOT}/include \
+-DNETCDF_LIBRARY:PATH=${LIB_ROOT}/lib/libnetcdf.a \
+-DHDF5HL_LIBRARY:PATH=${LIB_ROOT}/lib/libhdf5_hl.a \
+-DHDF5_LIBRARY:PATH=${LIB_ROOT}/lib/libhdf5.a \
+-DPYTHON_INSTALL:PATH=${PYTHON_INSTALL} \
+$EXTRA_ARGS
+
+
+
+
diff --git a/exodus/cmake/Dependencies.cmake b/exodus/cmake/Dependencies.cmake
new file mode 100644
index 0000000..7b12519
--- /dev/null
+++ b/exodus/cmake/Dependencies.cmake
@@ -0,0 +1,8 @@
+SET(LIB_REQUIRED_DEP_PACKAGES)
+SET(LIB_OPTIONAL_DEP_PACKAGES)
+SET(TEST_REQUIRED_DEP_PACKAGES)
+SET(TEST_OPTIONAL_DEP_PACKAGES)
+SET(LIB_REQUIRED_DEP_TPLS Netcdf)
+SET(LIB_OPTIONAL_DEP_TPLS HDF5 MPI)
+SET(TEST_REQUIRED_DEP_TPLS Netcdf)
+SET(TEST_OPTIONAL_DEP_TPLS)
diff --git a/exodus/customdoxygen.css b/exodus/customdoxygen.css
new file mode 100644
index 0000000..27dfe7f
--- /dev/null
+++ b/exodus/customdoxygen.css
@@ -0,0 +1,686 @@
+/* The standard CSS for doxygen */
+
+body, table, div, p, dl {
+	font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
+	font-size: 12px;
+}
+
+/* @group Heading Levels */
+
+h1 {
+	font-size: 150%;
+}
+
+h2 {
+	font-size: 120%;
+}
+
+h3 {
+	font-size: 100%;
+}
+
+dt {
+	font-weight: bold;
+}
+
+div.multicol {
+	-moz-column-gap: 1em;
+	-webkit-column-gap: 1em;
+	-moz-column-count: 3;
+	-webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+	margin-top: 2px;
+}
+
+p.endli {
+	margin-bottom: 0px;
+}
+
+p.enddd {
+	margin-bottom: 4px;
+}
+
+p.endtd {
+	margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+	font-weight: bold;
+}
+
+span.legend {
+        font-size: 70%;
+        text-align: center;
+}
+
+h3.version {
+        font-size: 90%;
+        text-align: center;
+}
+
+div.qindex, div.navtab{
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+}
+
+div.qindex, div.navpath {
+	width: 100%;
+	line-height: 140%;
+}
+
+div.navtab {
+	margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+	color: #3D578C;
+	font-weight: normal;
+	text-decoration: none;
+}
+
+.contents a:visited {
+	color: #4665A2;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+a.qindex {
+	font-weight: bold;
+}
+
+a.qindexHL {
+	font-weight: bold;
+	background-color: #9CAFD4;
+	color: #ffffff;
+	border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+        color: #ffffff;
+}
+
+a.el {
+	font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code {
+	color: #4665A2;
+}
+
+a.codeRef {
+	color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+	margin-left: -1cm;
+}
+
+.fragment {
+	font-family: monospace, fixed;
+	font-size: 105%;
+}
+
+pre.fragment {
+	border: 1px solid #C4CFE5;
+	background-color: #EEEEFF;
+	padding: 4px 6px;
+	margin: 4px 8px 4px 8px;
+	overflow: auto;
+	word-wrap: break-word;
+	font-size:  9pt;
+	line-height: 125%;
+}
+
+div.ah {
+	background-color: black;
+	font-weight: bold;
+	color: #ffffff;
+	margin-bottom: 3px;
+	margin-top: 3px;
+	padding: 0.2em;
+	border: solid thin #333;
+	border-radius: 0.5em;
+	-webkit-border-radius: .5em;
+	-moz-border-radius: .5em;
+	box-shadow: 2px 2px 3px #999;
+	-webkit-box-shadow: 2px 2px 3px #999;
+	-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+	background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+body {
+	background: white;
+	color: black;
+        margin: 0;
+}
+
+div.contents {
+	margin-top: 10px;
+	margin-left: 10px;
+	margin-right: 10px;
+}
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+/* @end */
+
+/*
+.search {
+	color: #003399;
+	font-weight: bold;
+}
+
+form.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+
+input.search {
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+	font-size: 75%;
+}
+
+.dirtab {
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+	background: #EBEFF6;
+	font-weight: bold;
+}
+
+hr {
+	height: 0px;
+	border: none;
+	border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+	height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+	border-spacing: 0px;
+	padding: 0px;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+	background-color: #F9FAFC;
+	border: none;
+	margin: 4px;
+	padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+	padding: 0px 8px 4px 8px;
+	color: #555;
+}
+
+.memItemLeft, .memItemRight, .memTemplParams {
+	border-top: 1px solid #C4CFE5;
+}
+
+.memItemLeft, .memTemplItemLeft {
+        white-space: nowrap;
+}
+
+.memTemplParams {
+	color: #4665A2;
+        white-space: nowrap;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+	font-size: 80%;
+	color: #4665A2;
+	font-weight: normal;
+	margin-left: 9px;
+}
+
+.memnav {
+	background-color: #EBEFF6;
+	border: 1px solid #A3B4D7;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+
+.memitem {
+	padding: 0;
+	margin-bottom: 10px;
+}
+
+.memname {
+        white-space: nowrap;
+        font-weight: bold;
+        margin-left: 6px;
+}
+
+.memproto {
+        border-top: 1px solid #A8B8D9;
+        border-left: 1px solid #A8B8D9;
+        border-right: 1px solid #A8B8D9;
+        padding: 6px 0px 6px 0px;
+        color: #253555;
+        font-weight: bold;
+        text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+        /* opera specific markup */
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        border-top-right-radius: 8px;
+        border-top-left-radius: 8px;
+        /* firefox specific markup */
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        -moz-border-radius-topright: 8px;
+        -moz-border-radius-topleft: 8px;
+        /* webkit specific markup */
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        -webkit-border-top-right-radius: 8px;
+        -webkit-border-top-left-radius: 8px;
+        background-image:url('nav_f.png');
+        background-repeat:repeat-x;
+        background-color: #E2E8F2;
+
+}
+
+.memdoc {
+        border-bottom: 1px solid #A8B8D9;      
+        border-left: 1px solid #A8B8D9;      
+        border-right: 1px solid #A8B8D9; 
+        padding: 2px 5px;
+        background-color: #FBFCFD;
+        border-top-width: 0;
+        /* opera specific markup */
+        border-bottom-left-radius: 8px;
+        border-bottom-right-radius: 8px;
+        box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        /* firefox specific markup */
+        -moz-border-radius-bottomleft: 8px;
+        -moz-border-radius-bottomright: 8px;
+        -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+        background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
+        /* webkit specific markup */
+        -webkit-border-bottom-left-radius: 8px;
+        -webkit-border-bottom-right-radius: 8px;
+        -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+        background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
+}
+
+.paramkey {
+	text-align: right;
+}
+
+.paramtype {
+	white-space: nowrap;
+}
+
+.paramname {
+	color: #602020;
+	white-space: nowrap;
+}
+.paramname em {
+	font-style: normal;
+}
+
+.params, .retval, .exception, .tparams {
+        border-spacing: 6px 2px;
+}       
+
+.params .paramname, .retval .paramname {
+        font-weight: bold;
+        vertical-align: top;
+}
+        
+.params .paramtype {
+        font-style: italic;
+        vertical-align: top;
+}       
+        
+.params .paramdir {
+        font-family: "courier new",courier,monospace;
+        vertical-align: top;
+}
+
+
+
+
+/* @end */
+
+/* @group Directory (tree) */
+
+/* for the tree view */
+
+.ftvtree {
+	font-family: sans-serif;
+	margin: 0px;
+}
+
+/* these are for tree view when used as main index */
+
+.directory {
+	font-size: 9pt;
+	font-weight: bold;
+	margin: 5px;
+}
+
+.directory h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+/*
+The following two styles can be used to replace the root node title
+with an image of your choice.  Simply uncomment the next two styles,
+specify the name of your image and be sure to set 'height' to the
+proper pixel height of your image.
+*/
+
+/*
+.directory h3.swap {
+	height: 61px;
+	background-repeat: no-repeat;
+	background-image: url("yourimage.gif");
+}
+.directory h3.swap span {
+	display: none;
+}
+*/
+
+.directory > h3 {
+	margin-top: 0;
+}
+
+.directory p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory div {
+	display: none;
+	margin: 0px;
+}
+
+.directory img {
+	vertical-align: -30%;
+}
+
+/* these are for tree view when not used as main index */
+
+.directory-alt {
+	font-size: 100%;
+	font-weight: bold;
+}
+
+.directory-alt h3 {
+	margin: 0px;
+	margin-top: 1em;
+	font-size: 11pt;
+}
+
+.directory-alt > h3 {
+	margin-top: 0;
+}
+
+.directory-alt p {
+	margin: 0px;
+	white-space: nowrap;
+}
+
+.directory-alt div {
+	display: none;
+	margin: 0px;
+}
+
+.directory-alt img {
+	vertical-align: -30%;
+}
+
+/* @end */
+
+div.dynheader {
+        margin-top: 8px;
+}
+
+address {
+	font-style: normal;
+	color: #2A3D61;
+}
+
+table.doxtable {
+	border-collapse:collapse;
+}
+
+table.doxtable td, table.doxtable th {
+	border: 1px solid #2D4068;
+	padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+	background-color: #374F7F;
+	color: #FFFFFF;
+	font-size: 110%;
+	padding-bottom: 4px;
+	padding-top: 5px;
+	text-align:left;
+}
+
+.tabsearch {
+	top: 0px;
+	left: 10px;
+	height: 36px;
+	background-image: url('tab_b.png');
+	z-index: 101;
+	overflow: hidden;
+	font-size: 13px;
+}
+
+.navpath ul
+{
+	font-size: 11px;
+	background-image:url('tab_b.png');
+	background-repeat:repeat-x;
+	height:30px;
+	line-height:30px;
+	color:#8AA0CC;
+	border:solid 1px #C2CDE4;
+	overflow:hidden;
+	margin:0px;
+	padding:0px;
+}
+
+.navpath li
+{
+	list-style-type:none;
+	float:left;
+	padding-left:10px;
+	padding-right: 15px;
+	background-image:url('bc_s.png');
+	background-repeat:no-repeat;
+	background-position:right;
+	color:#364D7C;
+}
+
+.navpath a
+{
+	height:32px;
+	display:block;
+	text-decoration: none;
+	outline: none;
+}
+
+.navpath a:hover
+{
+	color:#6884BD;
+}
+
+div.summary
+{
+	float: right;
+	font-size: 8pt;
+	padding-right: 5px;
+	width: 50%;
+	text-align: right;
+}       
+
+div.summary a
+{
+	white-space: nowrap;
+}
+
+div.header
+{
+        background-image:url('nav_h.png');
+        background-repeat:repeat-x;
+	background-color: #F9FAFC;
+	margin:  0px;
+	border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+	padding: 5px 5px 5px 10px;
+}
+
diff --git a/exodus/doc/doc.poly.txt b/exodus/doc/doc.poly.txt
new file mode 100644
index 0000000..1f0153e
--- /dev/null
+++ b/exodus/doc/doc.poly.txt
@@ -0,0 +1,216 @@
+Storage of 3d arbitrary polyhedra elements in exodusII.
+
+The 3d polyhedra elements are represented as elements with a variable
+number of faces in their connectivity.  The faces can either be
+regular faces such as quadrilateral or triangles; or they can be
+topologically two-dimensional arbitary polyhedra themselves.
+
+An arbitrary polyhedra 3D element block will have an element type of
+"nfaced" or "NFACED".  
+
+The faces that are used in the connectivity of this block should be
+defined in one or more face blocks.  If the faces are arbitrary
+polyhedra, then they will have a face type of "nsided" or "NSIDED".
+
+An annotated example of defining an arbitrary polyhedral element block
+consisting of 3 elements is shown below.  The geometry is shown in
+Figure 1.
+
+The three elements have the following geometry:
+* Element 1: 5 faces.
+	* Face 1: triangle with nodes 5, 6, 8
+	* Face 2: triangle with nodes 2, 1, 4
+	* Face 3: quadrilateral with nodes 6, 2, 4, 8
+	* Face 4: quadrilateral with nodes 8, 4, 1, 5
+	* Face 5: quadrilateral with nodes 1, 2, 6, 5
+
+* Element 2: 5 faces.
+	* Face 6: triangle with nodes 5, 8, 7
+	* Face 7: triangle with nodes 1, 3, 4
+	* Face 8: quadrilateral with nodes 7, 8, 4, 3
+	* Face 9: quadrilateral with nodes 7, 3, 1, 5
+	* Face 4: quadrilateral with nodes 8, 4, 1, 5 (shared with element 1)
+
+Element 3: 7 faces.
+	* Face 8: quadrilateral with nodes 7, 8, 4, 3 (shared with element 2)
+	* Face 10: pentagonal with nodes 8, 4, 14, 10, 12
+	* Face 11: pentagonal with nodes 7, 11, 9, 13, 3
+	* Face 12: quadrilateral with nodes 7, 8, 12, 11
+	* Face 13: quadrilateral with nodes 11, 12, 10, 9
+	* Face 14: quadrilateral with nodes 9, 10, 14, 13
+	* Face 15: quadrilateral with nodes 12, 14, 4, 3
+
+The exodusII model is created via the following calls:
+
+* Output the initial information.  Since the model contains faces and
+  a face block, the "extended" version of the ex_put_init_ext call must be used:
+
+  ex_init_params par;
+  strcpy( par.title, "This is the title" );
+  par.num_dim = 3;
+  par.num_nodes = 14;
+  par.num_edge = 0;
+  par.num_edge_blk = 0;
+  par.num_face = 15;
+  par.num_face_blk = 1;
+  par.num_elem = 3;
+  par.num_elem_blk = 1;
+  par.num_node_sets = 0;
+  par.num_edge_sets = 0;
+  par.num_face_sets = 0;
+  par.num_side_sets = 0;
+  par.num_elem_sets = 0;
+  par.num_node_maps = 0;
+  par.num_edge_maps = 0;
+  par.num_face_maps = 0;
+  par.num_elem_maps = 0;
+
+  ex_put_init_ext (exoid, &par);
+
+* Coordinate output is normal...
+
+* Define the face block.
+
+   block_name = "face_block_1";
+   num_face_in_block[0] = 15;
+   num_total_nodes_per_blk[0] = 58;
+   block_id = 10;
+
+   ex_put_block (exoid, EX_FACE_BLOCK, block_id, "nsided",
+		 num_face_in_block[0],
+		 num_total_nodes_per_blk[0],
+		 0, 0, 0);
+   ex_put_name(exoid, EX_FACE_BLOCK, block_id, block_name);
+
+* Output the face connectivity for face_block_1.
+  The data for the face connectivity is listed above; a portion is shown below...
+
+   connect = (int *) calloc(num_total_nodes_per_blk[0], sizeof(int));
+   i = 0
+   connect[i++] = 5;
+   connect[i++] = 6;
+   connect[i++] = 8; /* connectivity of face 1 of element 1 */
+
+   connect[i++] = 2;
+   connect[i++] = 1;
+   connect[i++] = 4; /* face 2 of element 1 */
+
+   connect[i++] = 6;
+   connect[i++] = 2;
+   connect[i++] = 4;
+   connect[i++] = 8; /* face 3 of element 1 */
+
+   connect[i++] = 8;
+   connect[i++] = 4;
+   connect[i++] = 1;
+   connect[i++] = 5; /* face 4 of element 1 */
+
+   connect[i++] = 1;
+   connect[i++] = 2;
+   connect[i++] = 6;
+   connect[i++] = 5; /*  face 5 of element 1 */
+
+   connect[i++] = 5;
+   connect[i++] = 8;
+   connect[i++] = 7; /* connectivity of face 1 of element 2 */
+
+   ... and so on....
+   assert(i == num_total_nodes_per_blk[0]);
+
+   ex_put_conn (exoid, EX_FACE_BLOCK, block_id, connect, NULL, NULL);
+
+* Output the number of nodes per face count for face_block_1:
+
+   j = 0;
+   nnpe[ 1] = 3;   /* Face 1 */
+   nnpe[ 2] = 3;
+   nnpe[ 3] = 4;  
+   nnpe[ 4] = 4;
+   nnpe[ 5] = 4;
+   nnpe[ 6] = 3;
+   nnpe[ 7] = 3;
+   nnpe[ 8] = 4;
+   nnpe[ 9] = 4;
+   nnpe[10] = 5;  
+   nnpe[11] = 5;
+   nnpe[12] = 4;
+   nnpe[13] = 4;
+   nnpe[14] = 4;
+   nnpe[15] = 4;  
+   
+   ex_put_entity_count_per_polyhedra(exoid, EX_FACE_BLOCK, block_id, nnpe);
+
+* The face block is now fully defined; now define the nfaced element
+  block which uses these faces.  
+
+   block_name = "nfaced_1";
+
+   num_elem_in_block = 3;
+   num_total_faces_per_blk = 5 + 5 + 7;
+   block_id = 10;
+
+   ex_put_block (exoid, EX_ELEM_BLOCK, block_id, "nfaced",
+		 num_elem_in_block,
+		 0, /* nodes */
+		 0, /* edges  */
+		 num_total_faces_per_blk,
+		 0); /* attribute count */
+   ex_put_name(exoid, EX_ELEM_BLOCK, block_id, block_name);
+
+
+   In the "ex_put_block" function, the element type is "nfaced".  The
+   connectivity is defined in terms of the faces, so the node and edge
+   arguments are passed zeros.  The nodal connectivity can be defined,
+   but it isn't required.  The face connectivity argument for an
+   nfaced block is the total number of faces in the connectivity for all
+   elements in the nfaced block. 
+
+* Write the face connectivity:
+   /* write element-face connectivity */
+   connect = (int *) calloc(num_total_faces_per_blk, sizeof(int));
+
+   i = 0;
+   connect[i++] = 1;
+   connect[i++] = 2;
+   connect[i++] = 3;
+   connect[i++] = 4;
+   connect[i++] = 5;
+   
+   connect[i++] = 4;
+   connect[i++] = 6;
+   connect[i++] = 7;
+   connect[i++] = 8;
+   connect[i++] = 9;
+
+   connect[i++] = 8;
+   connect[i++] = 10;
+   connect[i++] = 11;
+   connect[i++] = 12;
+   connect[i++] = 13;
+   connect[i++] = 14;
+   connect[i++] = 15;
+
+   assert(i == num_total_faces_per_blk);
+   ex_put_conn (exoid, EX_ELEM_BLOCK, block_id, NULL, NULL, connect);
+
+* Output the number of faces per element count for "nfaced_1":
+
+   nnpe[1] = 5;  /* Number of faces per element 1 */
+   nnpe[2] = 5;  /* Number of faces per element 2 */
+   nnpe[3] = 7;  /* Number of faces per element 3 */
+
+   ex_put_entity_count_per_polyhedra(exoid, EX_ELEM_BLOCK, block_id, nnpe);
+
+* That's all; the rest of the calls are the same as normal exodusII except:
+
+  * There is a similar "ex_get_entity_count_per_polyhedra" function for read.
+  * The ex_get_block functions return the total number of nodes or
+    faces for all  faces or element for "nfaced" and "nsided" blocks
+    and not the number per element 
+
+* An example read/write usage is shown in the the
+  cbind/test/testwt-nfaced.c and cbind/test/testrd-nfaced.c files.
+
+* These changes are in exodusII version bv4.93 and later.
+
+
diff --git a/exodus/doc/exodus-face-edge.pdf b/exodus/doc/exodus-face-edge.pdf
new file mode 100644
index 0000000..b3d13bf
Binary files /dev/null and b/exodus/doc/exodus-face-edge.pdf differ
diff --git a/exodus/doc/exodus.pdf b/exodus/doc/exodus.pdf
new file mode 100644
index 0000000..a0a6aa5
Binary files /dev/null and b/exodus/doc/exodus.pdf differ
diff --git a/exodus/doc/nemesis.pdf b/exodus/doc/nemesis.pdf
new file mode 100644
index 0000000..169b3df
Binary files /dev/null and b/exodus/doc/nemesis.pdf differ
diff --git a/exodus/exodus.py.in b/exodus/exodus.py.in
new file mode 100644
index 0000000..3784ae9
--- /dev/null
+++ b/exodus/exodus.py.in
@@ -0,0 +1,3349 @@
+EXODUS_PY_COPYRIGHT_AND_LICENSE = """ 
+
+exodus.py v 1.02 (beta) is a python wrapper of some of the exodus II library
+
+Copyright (c) 2013, 2014 Sandia Corporation. Under the terms of
+Contract DE-AC04-94AL85000 with Sandia Corporation, the
+U.S. Government retains certain rights in this software.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the Sandia Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROF [...]
+
+"""
+
+EXODUS_PY_VERSION = "1.02 (beta)"
+
+EXODUS_PY_COPYRIGHT = """
+You are using exodus.py v 1.02 (beta), a python wrapper of some of the exodus II library.
+Copyright (c) 2013,2014 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000
+with Sandia Corporation, the U.S. Government retains certain rights in this software.
+"""
+
+EXODUS_PY_CONTACTS = """
+Authors:  Timothy Shelton  (trshelt at sandia.gov)
+          Michael Veilleux (mgveill at sandia.gov)
+          David Littlewood (djlittl at sandia.gov)
+          Greg Sjaardema   (gdsjaar at sandia.gov) 
+"""
+
+import sys
+sys.dont_write_bytecode = True
+
+oneline = "Gather from or export to Exodus II files using the Exodus II library"
+
+# Imports and external programs
+from ctypes import *
+import os
+
+def basename(file):
+  """
+    Extract base name from file.
+    basename("test.e") -> "test"
+  """
+  fileParts = file.split(".")
+  basename = ".".join(fileParts[:-1])
+  return basename
+
+def getExodusVersion():
+  """
+  Parse the exodusII.h header file and return the version number or 0 if not
+  found.
+  """
+  for line in open(getAccessPath() + '/inc/exodusII.h'):
+    fields = line.split()
+    if (len(fields) == 3 and
+        fields[0] == '#define' and
+        fields[1] == 'EX_API_VERS_NODOT'):
+      return int(fields[2])
+  return 0
+
+def getAccessPath():
+  """
+  Return the base path of the exodus installation.
+  """
+  accessPth = "@CMAKE_INSTALL_PREFIX@"
+  if not isinstance(accessPth,str) or not os.path.isdir(accessPth):
+    accessPth = os.environ.get('ACCESS')
+
+  if not isinstance(accessPth,str) or not os.path.isdir(accessPth):
+    system = os.environ.get('SIERRA_SYSTEM')
+    if not isinstance(system,str):
+      raise Exception, "Both the $ACCESS path and $SIERRA_SYSTEM are undefined"
+    if   system == 'desktop_rh6': accessPth = '/projects/seacas/linux_rhel6/current'
+    elif system == 'desktop'    : accessPth = '/projects/seacas/linux_rhel5/current'
+    elif system == 'redsky'     : accessPth = '/projects/seacas/redsky/current'
+    elif system == 'tlcc'       : accessPth = '/projects/seacas/tlcc/current'
+    elif system == 'tlcc2'      : accessPth = '/projects/seacas/tlcc2/current'
+    elif system == 'amech'      : accessPth = '/projects/seacas/linux_rhel5/current'
+    else: raise Exception, "Unrecognized $SIERRA_SYSTEM: %s" % system
+    if not os.path.isdir(accessPth):
+      raise Exception, "Invalid $ACCESS path: %s" % accessPth
+
+  return accessPth
+
+def findLibExoPath():
+  # FIXME: this is a hack to try to find the ExodusII and NetCDF shared
+  #        libraries in an external ExodusII distribution; this could be made
+  #        portable if the shared libraries were built in the Sierra distribution
+  accessPth = getAccessPath()
+  trialShLibDirs = [ '/shlib/', '/lib/shared/', '/lib/' ]
+  for shLibDir in trialShLibDirs:
+    libExoPth = accessPth + shLibDir
+    if os.path.isdir(libExoPth): return libExoPth
+  raise Exception, "Shared library sub-directory not found in $ACCESS path: %s" % accessPth
+
+EXODUS_PATH = findLibExoPath()
+if os.uname()[0] == 'Darwin':
+  NETCDF_SO = "@NETCDF_SO_ROOT@" + "/libnetcdf.dylib"
+  EXODUS_SO = EXODUS_PATH + "libexodus.dylib"
+else:
+  NETCDF_SO = "@NETCDF_SO_ROOT@" + "/libnetcdf.so"
+  EXODUS_SO = EXODUS_PATH + "libexodus.so"
+NETCDF_LIB = cdll.LoadLibrary(NETCDF_SO)
+EXODUS_LIB = cdll.LoadLibrary(EXODUS_SO)
+  
+EX_API_VERSION_NODOT = getExodusVersion()
+EX_VERBOSE           = 1       #verbose mode message flag 
+if (EX_API_VERSION_NODOT >= 608):
+  EX_READ              = 0x0002  # ex_open(): open file for reading (default)
+else:
+  EX_READ              = 0x0000  # ex_open(): open file for reading (default)
+EX_WRITE             = 0x0001  # ex_open(): open existing file for appending.
+
+EX_NOCLOBBER         = 0x0004  # does not overwrite existing exodus file
+EX_CLOBBER           = 0x0008  # overwrites existing exodus file
+MAX_STR_LENGTH       = 32      # match exodus default
+MAX_LINE_LENGTH      = 80      # match exodus default
+EX_MAPS_INT64_API    = 0x2000  # all maps (id, order, ...) store int64_t values
+EX_IDS_INT64_API     = 0x4000  # all entity ids (sets, blocks, maps) are int64_t
+EX_BULK_INT64_API    = 0x8000  # all integer bulk data (not ids) are int64_t
+EX_INQ_INT64_API     = 0x10000 # integers passed to/from ex_inquire are int64_t
+
+# set exodus error output option
+exErrPrintMode = c_int(EX_VERBOSE)
+EXODUS_LIB.ex_opts(exErrPrintMode)
+
+def ex_inquiry(inquiry):
+  # create dictionary for return types
+  inquiry_dictionary = {
+    'EX_INQ_FILE_TYPE': 1,                    # inquire EXODUS II file type
+    'EX_INQ_API_VERS': 2,                     # inquire API version number
+    'EX_INQ_DB_VERS': 3,                      # inquire database version number
+    'EX_INQ_TITLE': 4,                        # inquire database title
+    'EX_INQ_DIM': 5,                          # inquire number of dimensions
+    'EX_INQ_NODES': 6,                        # inquire number of nodes
+    'EX_INQ_ELEM': 7,                         # inquire number of elements
+    'EX_INQ_ELEM_BLK': 8,                     # inquire number of element blocks
+    'EX_INQ_NODE_SETS': 9,                    # inquire number of node sets
+    'EX_INQ_NS_NODE_LEN': 10,                 # inquire length of node set node list
+    'EX_INQ_SIDE_SETS': 11,                   # inquire number of side sets
+    'EX_INQ_SS_NODE_LEN': 12,                 # inquire length of side set node list
+    'EX_INQ_SS_ELEM_LEN': 13,                 # inquire length of side set element list
+    'EX_INQ_QA': 14,                          # inquire number of QA records
+    'EX_INQ_INFO': 15,                        # inquire number of info records
+    'EX_INQ_TIME': 16,                        # inquire number of time steps in the database
+    'EX_INQ_EB_PROP': 17,                     # inquire number of element block properties
+    'EX_INQ_NS_PROP': 18,                     # inquire number of node set properties
+    'EX_INQ_SS_PROP': 19,                     # inquire number of side set properties
+    'EX_INQ_NS_DF_LEN': 20,                   # inquire length of node set distribution factor list
+    'EX_INQ_SS_DF_LEN': 21,                   # inquire length of side set distribution factor list
+    'EX_INQ_LIB_VERS': 22,                    # inquire API Lib vers number
+    'EX_INQ_EM_PROP': 23,                     # inquire number of element map properties
+    'EX_INQ_NM_PROP': 24,                     # inquire number of node map properties
+    'EX_INQ_ELEM_MAP': 25,                    # inquire number of element maps
+    'EX_INQ_NODE_MAP': 26,                    # inquire number of node maps
+    'EX_INQ_EDGE': 27,                        # inquire number of edges
+    'EX_INQ_EDGE_BLK': 28,                    # inquire number of edge blocks
+    'EX_INQ_EDGE_SETS': 29,                   # inquire number of edge sets
+    'EX_INQ_ES_LEN': 30,                      # inquire length of concat edge set edge list
+    'EX_INQ_ES_DF_LEN': 31,                   # inquire length of concat edge set dist factor list
+    'EX_INQ_EDGE_PROP': 32,                   # inquire number of properties stored per edge block
+    'EX_INQ_ES_PROP': 33,                     # inquire number of properties stored per edge set
+    'EX_INQ_FACE': 34,                        # inquire number of faces
+    'EX_INQ_FACE_BLK': 35,                    # inquire number of face blocks
+    'EX_INQ_FACE_SETS': 36,                   # inquire number of face sets
+    'EX_INQ_FS_LEN': 37,                      # inquire length of concat face set face list
+    'EX_INQ_FS_DF_LEN': 38,                   # inquire length of concat face set dist factor list
+    'EX_INQ_FACE_PROP': 39,                   # inquire number of properties stored per face block
+    'EX_INQ_FS_PROP': 40,                     # inquire number of properties stored per face set
+    'EX_INQ_ELEM_SETS': 41,                   # inquire number of element sets
+    'EX_INQ_ELS_LEN': 42,                     # inquire length of concat element set element list
+    'EX_INQ_ELS_DF_LEN': 43,                  # inquire length of concat element set dist factor list
+    'EX_INQ_ELS_PROP': 44,                    # inquire number of properties stored per elem set
+    'EX_INQ_EDGE_MAP': 45,                    # inquire number of edge maps
+    'EX_INQ_FACE_MAP': 46,                    # inquire number of face maps
+    'EX_INQ_COORD_FRAMES': 47,                # inquire number of coordinate frames
+    'EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH': 48,  # inquire size of MAX_NAME_LENGTH dimension on database
+    'EX_INQ_DB_MAX_USED_NAME_LENGTH': 49,     # inquire size of MAX_NAME_LENGTH dimension on database
+    'EX_INQ_READ_NAME_LENGTH': 50,            # inquire client-specified max size of returned names
+    'EX_INQ_DB_FLOAT_SIZE': 51                # inquire size of floating-point values stored on database
+    }
+  # search dictionary for the requested code
+  if inquiry in inquiry_dictionary:
+    return inquiry_dictionary[inquiry]
+  # none found, must be invalid
+  return -1 # EX_INQ_INVALID
+
+def ex_entity_type(varType):
+  entity_dictionary = {
+    'EX_ELEM_BLOCK': 1,   #   element block property code
+    'EX_NODE_SET': 2,     #   node set property code
+    'EX_SIDE_SET': 3,     #   side set property code
+    'EX_ELEM_MAP': 4,     #   element map property code
+    'EX_NODE_MAP': 5,     #   node map property code
+    'EX_EDGE_BLOCK': 6,   #   edge block property code
+    'EX_EDGE_SET': 7,     #   edge set property code
+    'EX_FACE_BLOCK': 8,   #   face block property code
+    'EX_FACE_SET': 9,     #   face set property code
+    'EX_ELEM_SET': 10,    #   face set property code
+    'EX_EDGE_MAP': 11,    #   edge map property code
+    'EX_FACE_MAP': 12,    #   face map property code
+    'EX_GLOBAL': 13,      #   global 'block' for variables
+    'EX_NODAL': 14,       #   nodal 'block' for variables
+    'EX_NODE_BLOCK': 14,  #   alias for EX_NODAL
+    'EX_COORDINATE': 15,  #   kluge so some internal wrapper functions work
+    }
+  # search dictionary for the requested code
+  if varType in entity_dictionary:
+    return entity_dictionary[varType]
+  # none found, must be invalid`
+  return -1 ##EX_INVALID
+
+# Class definition
+
+class exodus:
+  """
+    e = exodus('file.e',mode='r') -> open existing exodus file for data extraction
+    e = exodus('file.e',mode='r',array_type='numpy') -> open existing exodus file for data 
+        extraction using numpy arrays
+    e = exodus('file.e',mode='a') -> open existing exodus file for data insertion/extraction
+    e = exodus('file.e',mode='w',title=title,
+               arrayType=ctype,
+               numDims=numDims,numNodes=numNodes
+               numElems=numElems,numBlocks=numBlocks,
+               numNodeSets=numNodeSets,
+               numSideSets=numSideSets) -> open new exodus file for data insertion
+  """
+  
+  # --------------------------------------------------------------------
+
+  def __init__(self,file,mode=None,array_type='ctype',title=None,numDims=None,
+               numNodes=None,numElems=None,numBlocks=None,
+               numNodeSets=None,numSideSets=None,io_size=0):
+    print EXODUS_PY_COPYRIGHT
+    if mode == None:
+      mode = 'r'
+    if array_type == 'numpy':
+        #Import numpy to convert from c-type arrays to numpy arrays
+        import numpy as np
+        self.np = np
+        self.use_numpy = True
+        #Warnings module is needed to suppress the invalid warning when 
+        #converting from c-type arrays to numpy arrays
+        #http://stackoverflow.com/questions/4964101/pep-3118-warning-when-using-ctypes-array-as-numpy-array
+        import warnings
+        self.warnings = warnings
+    else:
+        self.use_numpy = False
+    self.EXODUS_LIB = EXODUS_LIB
+    self.fileName = str(file)
+    self.basename = basename(file)
+    self.modeChar = mode
+    self.__open(io_size=io_size)
+    if mode.lower() == 'w':
+      info = [title,numDims,numNodes,numElems,numBlocks,
+              numNodeSets,numSideSets]
+      assert None not in info
+      self.__ex_put_info(info)
+      self.numTimes = c_int(0)
+    else:
+      self.__ex_get_info()
+      self.numTimes = c_int(self.__ex_inquire_int(ex_inquiry("EX_INQ_TIME")))
+
+  #
+  # copy to a new database
+  #
+  # --------------------------------------------------------------------
+
+  def copy(self,fileName):
+    """
+      e.copy(fileName) -> copies Exodus database to fileName and returns
+                          this copy as a new exodus object
+    """
+    new = exodus( fileName,
+                  mode="w",
+                  title=self.title(),
+                  numDims=self.num_dimensions(),
+                  numNodes=self.num_nodes(),
+                  numElems=self.num_elems(),
+                  numBlocks=self.num_blks(),
+                  numNodeSets=self.num_node_sets(),
+                  numSideSets=self.num_side_sets() )
+    self.__copy_file(new)
+    return new
+
+  #
+  # general info
+  #
+  # --------------------------------------------------------------------
+
+  def title(self):
+    """ 
+      e.title() -> title in exodus file
+    """
+    return self.Title.value
+
+  # --------------------------------------------------------------------
+
+  def version_num(self):
+    """
+      e.version_num() -> string representation of exodus version number
+    """
+    return "%1.2f" % self.version.value
+
+  # --------------------------------------------------------------------
+  
+  def put_info(self,Title,numDim,numNodes,numElem,numElemBlk,numNodeSets,numSideSets):
+    """
+      e.put_info(self,Title,numDim,numNodes,numElem,numElemBlk,numNodeSets,numSideSets)
+      -> put initialization information into exodus file
+    """
+    self.__ex_put_info([Title,numDim,numNodes,numElem,numElemBlk,numNodeSets,numSideSets])
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_qa_records(self):
+    """
+      e.get_qa_records() -> get a list of QA records from the exodus database;
+                            each QA record is a length-4 tuple of strings:
+                               1) the analysis code name
+                               2) the analysis code descriptor, e.g. version
+                               3) the analysis data
+                               4) the analysis time
+    """
+    return self.__ex_get_qa()
+
+  # --------------------------------------------------------------------
+
+  def put_qa_records(self,records):
+    """
+      e.put_qa_records(records) -> put a list of QA records into the exodus database;
+                                   each QA record must be a length-4 tuple of strings:
+                                     1) the analysis code name
+                                     2) the analysis code descriptor, e.g. version
+                                     3) the analysis data
+                                     4) the analysis time
+    """
+    for rec in records:
+      assert len(rec) == 4
+      for recEntry in rec:
+        assert len(str(recEntry)) < MAX_STR_LENGTH
+    if self.__ex_put_qa(records):
+      return True
+    else:
+      return False
+
+  # --------------------------------------------------------------------
+  def num_info_records(self):
+    return int(self.__ex_inquire_int(ex_inquiry("EX_INQ_INFO")))
+
+  # --------------------------------------------------------------------
+  def get_info_records(self):
+    """
+      e.get_info_records() -> get a list info records from the exodus database;
+                              each entry in the list is one line of info, e.g.
+                              a line of an input deck
+    """
+    info_recs = self.__ex_get_info_recs()
+    return info_recs
+
+  # --------------------------------------------------------------------
+
+  def put_info_records(self,info):
+    """
+      e.put_info_records(info) -> put a list of info records into an exodus database;
+                                  each entry in the list is one line of info, e.g.
+                                  a line of an input deck
+    """
+    for rec in info:
+      if len(str(rec)) > MAX_LINE_LENGTH:
+        print "WARNING: max line length reached for one or more info records;"
+        print "         info stored to exodus file is incomplete for these records"
+        break
+    if self.__ex_put_info_recs(info):
+      return True
+    else:
+      return False
+
+  # --------------------------------------------------------------------
+
+  def get_sierra_input(self,inpFileName=None):
+    """
+      e.get_sierra_input(inpFileName) -> get sierra input deck from exodus database;
+                                         if inpFileName is passed, input is written
+                                         to this file, e.g. myInputDeck.i; otherwise
+                                         a list of file lines is returned
+    """
+    info_recs = self.__ex_get_info_recs()
+    sierra_inp = []
+    begin = False
+    for rec in info_recs:
+      vals = rec.split()
+      if not begin: # have not reached Sierra block
+        if len(vals) >= 2 and vals[0].lower() == 'begin' and vals[1].lower() == "sierra":
+          begin = True
+      if begin: # inside Sierra block
+        sierra_inp.append(rec)
+        if len(rec) > MAX_LINE_LENGTH:
+          print "WARNING: max line length reached for one or more input lines;"
+          print "         input data might be incomplete for these lines"
+          break
+        if len(vals) >= 2 and vals[0].lower() == "end" and vals[1].lower() == "sierra":
+          break # end of Sierra block
+    if inpFileName:
+      fd = open(inpFileName,"w")
+      for fileLine in sierra_inp:
+        print >> fd, fileLine
+      fd.close()
+      return ""
+    else:
+      return sierra_inp
+
+  #
+  # time steps
+  #
+  # --------------------------------------------------------------------
+
+  def num_times(self):
+    """ 
+      e.num_times() -> number of time steps in exodus file
+    """
+    return self.numTimes.value
+
+  # --------------------------------------------------------------------
+
+  def get_times(self):
+    """ 
+      e.get_times() -> get list of times in exodus file
+    """
+    if self.numTimes.value == 0:
+      self.times = []
+    else:
+      self.__ex_get_all_times()
+    if self.use_numpy:
+        self.times = ctype_to_numpy(self, self.times)
+    return self.times
+
+  # --------------------------------------------------------------------
+
+  def put_time(self,step,value):
+    """ 
+      e.put_time(step,value) -> put time step and value into exodus file
+    """
+    self.__ex_put_time(step,value)
+    self.numTimes = c_int(self.__ex_inquire_int(ex_inquiry("EX_INQ_TIME")))
+    return True
+
+  #
+  # coordinate system
+  #
+  # --------------------------------------------------------------------
+
+  def num_dimensions(self):
+    """ 
+      e.num_dimensions() -> number of dimensions in exodus file
+    """
+    return self.numDim.value
+
+  # --------------------------------------------------------------------
+
+  def get_coord_names(self):
+    """ 
+      e.get_coord_names() -> get list of coordinate names in exodus file
+    """
+    names = self.__ex_get_coord_names()
+    return names
+
+  # --------------------------------------------------------------------
+
+  def put_coord_names(self,names):
+    """ 
+      e.put_coord_names() -> set list of coordinate names in exodus file
+    """
+    self.__ex_put_coord_names(names)
+
+  #
+  # nodes
+  #
+  # --------------------------------------------------------------------
+
+  def num_nodes(self):
+    """ 
+      e.num_nodes() -> number of nodes in exodus file
+    """
+    return self.numNodes.value
+
+  # --------------------------------------------------------------------
+
+  def get_coords(self):
+    """ 
+      e.get_coords() -> get tuple of lists of coordinates (X,Y,Z) in exodus file
+    """
+    self.__ex_get_coord()
+    if self.use_numpy:
+        self.coordsX = ctype_to_numpy(self, self.coordsX)
+        self.coordsY = ctype_to_numpy(self, self.coordsY)
+        self.coordsZ = ctype_to_numpy(self, self.coordsZ)
+    return (self.coordsX,self.coordsY,self.coordsZ)
+
+  # --------------------------------------------------------------------
+
+  def get_coord(self,i):
+    """
+      e.get_coord(i) -> get (x,y,z) of i^th node in exodus file
+    """
+    listX,listY,listZ = self.__ex_get_n_coord(i,1)
+    return (listX[0],listY[0],listZ[0])
+
+  # --------------------------------------------------------------------
+
+  def put_coords(self,xCoords,yCoords,zCoords):
+    """ 
+      e.put_coords() -> put coordinates (xCoords,yCoords,zCoords) in exodus file
+    """
+    self.__ex_put_coord(xCoords,yCoords,zCoords)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_node_num_map(self):
+    """ 
+      e.get_node_num_map() -> **DEPRECATED** 
+                              use: e.get_node_id_map()
+
+                              get list mapping local node id to global id 
+                              in exodus file
+    """
+    nodeNumMap = self.__ex_get_node_num_map()
+    return nodeNumMap
+
+  # --------------------------------------------------------------------
+
+  def get_node_id_map(self):
+    """ 
+      e.get_node_id_map() -> get list mapping local node id to global id 
+                             in exodus file
+    """
+    objType = ex_entity_type("EX_NODE_MAP")
+    inqType = ex_inquiry("EX_INQ_NODES")
+    nodeIdMap = self.__ex_get_id_map(objType,inqType)
+    if self.use_numpy:
+      nodeIdMap = self.np.array(nodeIdMap)
+    return nodeIdMap
+
+  # --------------------------------------------------------------------
+
+  def put_node_id_map(self,map):
+    """ 
+      e.put_node_id_map(map) -> put list mapping local node id to global id 
+                                into exodus file
+    """
+    objType = ex_entity_type("EX_NODE_MAP")
+    inqType = ex_inquiry("EX_INQ_NODES")
+    return self.__ex_put_id_map(objType,inqType,map)
+
+  # --------------------------------------------------------------------
+
+  def get_node_variable_names(self):
+    """ 
+      e.get_node_variable_names() -> get list of node variable names in exodus file
+    """
+    if self.__ex_get_var_param('n').value == 0:
+      return []
+    return self.__ex_get_var_names("n")
+
+  # --------------------------------------------------------------------
+
+  def get_node_variable_number(self):
+    """ 
+      e.get_node_variable_number() -> get number of node variables in exodus file
+    """
+    ndType = ex_entity_type("EX_NODAL")
+    num = self.__ex_get_variable_param(ndType)
+    return num.value
+
+  # --------------------------------------------------------------------
+
+  def set_node_variable_number(self,number):
+    """ 
+      e.set_node_variable_number(number) -> set number of node variables in exodus file
+    """
+    ndType = ex_entity_type("EX_NODAL")
+    self.__ex_put_variable_param(ndType,number)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def put_node_variable_name(self,name,index):
+    """ 
+      e.put_node_variable_name("name",index) -> node variable with name at index into exodus file
+    """
+    ndType = ex_entity_type("EX_NODAL")
+    NDvarNames = self.get_node_variable_names()
+    if name in NDvarNames:
+      print "WARNING:node variable \"", name, "\" already exists."
+    if index > len(NDvarNames):
+      raise Exception, ("ERROR: variable index out of range.")
+    self.__ex_put_variable_name(ndType,index,name)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_node_variable_values(self,name,step):
+    """ 
+      e.get_node_variable_values("name",step) -> get list of node variable values
+      for a step within exodus file
+    """
+    names = self.get_node_variable_names()
+    var_id = names.index(name) + 1
+    ndType = ex_entity_type("EX_NODAL")
+    numVals = self.num_nodes()
+    values =  self.__ex_get_var(step,ndType,var_id,0,numVals)
+    if self.use_numpy:
+        values = ctype_to_numpy(self, values)
+    return values
+
+  # --------------------------------------------------------------------
+
+  def put_node_variable_values(self,name,step,values):
+    """ 
+      e.put_node_variable_values("name",step,values) -> put node values into
+      variable name at step into exodus file
+    """
+    names = self.get_node_variable_names()
+    var_id = names.index(name) + 1
+    ndType = ex_entity_type("EX_NODAL")
+    numVals = self.num_nodes()
+    self.__ex_put_var(step,ndType,var_id,0,numVals,values)
+    return True
+
+  #
+  # elements
+  #
+  # --------------------------------------------------------------------
+
+  def num_elems(self):
+    """ 
+      e.num_elems() -> number of elements in exodus file
+    """
+    return self.numElem.value
+
+  # --------------------------------------------------------------------
+
+  def get_elem_num_map(self):
+    """ 
+      e.get_elem_num_map() -> **DEPRECATED** 
+                              use: e.get_elem_id_map()
+
+                              get list mapping local element id to 
+                              global id in exodus file
+    """
+    elemNumMap = self.__ex_get_elem_num_map()
+    return elemNumMap
+
+  # --------------------------------------------------------------------
+
+  def get_elem_id_map(self):
+    """ 
+      e.get_elem_id_map() -> get list mapping local elem id to global id 
+                             in exodus file
+    """
+    objType = ex_entity_type("EX_ELEM_MAP")
+    inqType = ex_inquiry("EX_INQ_ELEM")
+    elemIdMap = self.__ex_get_id_map(objType,inqType)
+    if self.use_numpy:
+        elemIdMap = self.np.array(elemIdMap)
+    return elemIdMap
+
+  # --------------------------------------------------------------------
+
+  def put_elem_id_map(self,map):
+    """ 
+      e.put_elem_id_map(map) -> put list mapping local elem id to global id 
+                                into exodus file
+    """
+    objType = ex_entity_type("EX_ELEM_MAP")
+    inqType = ex_inquiry("EX_INQ_ELEM")
+    return self.__ex_put_id_map(objType,inqType,map)
+
+  # --------------------------------------------------------------------
+
+  def get_elem_order_map(self):
+    """ 
+      e.get_elem_order_map() -> get list of optimized element ordering
+    """
+
+    elemOrderMap = self.__ex_get_elem_order_map()
+    if self.use_numpy:
+        elemOrderMap = ctype_to_numpy(self, elemOrderMap)
+    return elemOrderMap
+
+  #
+  # element blocks
+  #
+  # --------------------------------------------------------------------
+
+  def num_blks(self):
+    """ 
+      e.num_blks() -> number of element blocks in exodus file
+    """
+    return self.numElemBlk.value
+
+  # --------------------------------------------------------------------
+
+  def get_elem_blk_ids(self):
+    """ 
+      e.get_elem_blk_ids() -> get list of element block ids in exodus file
+    """
+    self.__ex_get_elem_blk_ids()
+    elemBlkIds = self.elemBlkIds    
+    if self.use_numpy:
+        elemBlkIds = ctype_to_numpy(self, elemBlkIds)
+    return elemBlkIds
+
+  # --------------------------------------------------------------------
+
+  def get_elem_blk_name(self,id):
+    """ 
+      e.get_elem_blk_name(id) -> get element block name for block "id" in 
+                                 exodus file
+    """
+    objType = ex_entity_type("EX_ELEM_BLOCK")
+    elemBlkName = self.__ex_get_name(objType,id)
+    return elemBlkName
+
+  # --------------------------------------------------------------------
+
+  def put_elem_blk_name(self,id,name):
+    """ 
+      e.put_elem_blk_name(id,name) -> write element block name for block 
+                                      "id" in exodus file
+    """
+    objType = ex_entity_type("EX_ELEM_BLOCK")
+    self.__ex_put_name(objType,id,name)
+
+  # --------------------------------------------------------------------
+
+  def get_elem_blk_names(self):
+    """ 
+      e.get_elem_blk_names() -> get list of element block names in 
+                                exodus file
+    """
+    objType = ex_entity_type("EX_ELEM_BLOCK")
+    inqType = ex_inquiry("EX_INQ_ELEM_BLK")
+    elemBlkNames = self.__ex_get_names(objType,inqType)
+    return elemBlkNames
+
+  # --------------------------------------------------------------------
+
+  def put_elem_blk_names(self,names):
+    """ 
+      e.put_elem_blk_names(names) -> write list of element block names to 
+                                     exodus file
+    """
+    objType = ex_entity_type("EX_ELEM_BLOCK")
+    inqType = ex_inquiry("EX_INQ_ELEM_BLK")
+    self.__ex_put_names(objType,inqType,names)
+
+  # --------------------------------------------------------------------
+
+  def elem_blk_info(self,id):
+    """
+    e.elem_blk_info(id) -> element block info for block "id" in exodus file
+    """
+    (elemType,numElem,nodesPerElem,numAttr) = self.__ex_get_elem_block(id)
+    return elemType.value, numElem.value, nodesPerElem.value, numAttr.value
+
+  # --------------------------------------------------------------------
+
+  def put_elem_blk_info(self,id,elemType,numElems,
+                        numNodesPerElem,numAttrsPerElem):
+    """
+    e.put_elem_blk_info(id) -> sets ID, element type string (all caps), 
+                               number of elements, number of nodes per element,
+                               and number of attributes per element in an
+                               element block
+    """
+    self.__ex_put_elem_block(id,elemType,numElems,
+                               numNodesPerElem,numAttrsPerElem)
+
+  # --------------------------------------------------------------------
+
+  def put_concat_elem_blk(self,elemBlkIDs, elemType, numElemThisBlk,\
+                          numNodesPerElem,numAttr,defineMaps):
+    """
+      e.put_concat_elem_blk(self,elemBlkIDs, elemType, numElemThisBlk,... \
+                       numNodesPerElem,numAttr,defineMaps)
+    """
+    self.__ex_put_concat_elem_blk(elemBlkIDs,elemType,numElemThisBlk, \
+               numNodesPerElem,numAttr,defineMaps)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_elem_connectivity(self,id):
+    """ 
+      e.get_elem_connectivity(id) -> get tuple of one list and two reals 
+      (elem_block_connectivity,num_elem_this_blk,num_nodes_per_elem)
+    """
+    (elem_block_connectivity,num_elem_this_blk,num_nodes_per_elem) = self.__ex_get_elem_conn(id);
+    if self.use_numpy:
+        elem_block_connectivity = ctype_to_numpy(self, elem_block_connectivity)
+    return (elem_block_connectivity,num_elem_this_blk.value,num_nodes_per_elem.value)
+
+  # --------------------------------------------------------------------
+
+  def put_elem_connectivity(self,id,connectivity):
+    """ 
+      e.put_elem_connectivity() -> set the element connectivity array
+                                   for all elements in a block.  The
+                                   information for this block must have
+                                   already been set by calling
+                                   e.put_elem_blk_info() on this block.
+    """
+    d1,numBlkElems,numNodesPerElem,d2 = self.elem_blk_info(id)
+    assert len(connectivity) == (numBlkElems * numNodesPerElem)
+    self.__ex_put_elem_conn(id,connectivity)
+
+  # --------------------------------------------------------------------
+
+  def get_elem_attr(self,elemBlkID):
+    """
+      e.get_elm_attr(elemBlkID) -> get element block attributes
+    """
+    attribute = self.__ex_get_elem_attr(elemBlkID)
+    return attribute
+
+  # --------------------------------------------------------------------
+
+  def put_elem_attr(self,elemBlkID,Attr):
+    """
+      e.put_elem_attr(elemBlkID,Attr) -> write element attribute lists for each block
+    """
+    self.__ex_put_elem_attr(elemBlkID,Attr)
+
+  # --------------------------------------------------------------------
+
+  def elem_type(self,id):
+    """ 
+      e.elem_type(id) -> type of element, i.e "QUAD", "TETRA", etc.
+    """
+    (elemType,numElem,nodesPerElem,numAttr) = self.__ex_get_elem_block(id)
+    return elemType.value
+
+  # --------------------------------------------------------------------
+
+  def num_attr(self,id):
+    """ 
+      e.num_attr(id) -> number of element attributes
+    """
+    (elemType,numElem,nodesPerElem,numAttr) = self.__ex_get_elem_block(id)
+    return numAttr.value
+
+  # --------------------------------------------------------------------
+
+  def num_elems_in_blk(self,id):
+    """ 
+      e.num_elems_in_blk(id) -> number of elements in block "id" in exodus file
+    """
+    (elemType,numElem,nodesPerElem,numAttr) = self.__ex_get_elem_block(id)
+    return numElem.value
+
+  # --------------------------------------------------------------------
+
+  def num_nodes_per_elem(self,id):
+    """ 
+      e.num_nodes_per_elem(id) -> number of nodes per element in block "id" in exodus file
+    """
+    (elemType,numElem,nodesPerElem,numAttr) = self.__ex_get_elem_block(id)
+    return nodesPerElem.value
+
+  # --------------------------------------------------------------------
+
+  def get_element_variable_truth_table(self,blockId=None):
+    """
+      e.get_element_variable_truth_table(blockId) -> gets a truth table indicating which variables are
+                                                     defined for a block.  If blockId is not passed, then
+                                                     a concatenated truth table for all blocks is returned
+                                                     with variable index cycling faster than blockId
+    """
+    truthTable = self.__ex_get_elem_var_tab()
+    if blockId != None:
+      self.get_elem_blk_ids()
+      assert blockId in list(self.elemBlkIds)
+      indx = list(self.elemBlkIds).index(blockId)
+      numVars = self.__ex_get_var_param("e").value
+      start,stop = (indx * numVars, (indx + 1) * numVars)
+      return truthTable[start:stop]
+    return truthTable
+
+  # --------------------------------------------------------------------
+
+  def set_element_variable_truth_table(self,table):
+    """
+      e.set_element_variable_truth_table(table) -> sets a truth table indicating which variables are
+                                                   defined for each block in the model.  
+                                                   Element variable index cycles faster than the 
+                                                   element block index
+    """
+    self.get_elem_blk_ids()
+    numBlks = len(self.elemBlkIds)
+    numVars = int(self.__ex_get_var_param("e").value)
+    assert len(table) == (numBlks * numVars)
+    return self.__ex_put_elem_var_tab(table)
+
+  # --------------------------------------------------------------------
+
+  def get_element_variable_values(self,blockId,name,step):
+    """ 
+      e.get_element_variable_values(blockId,"name",step) -> get list of element variable values
+      for an element block id at step within exodus file
+    """
+    names = self.get_element_variable_names()
+    var_id = names.index(name) + 1
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    numVals = self.num_elems_in_blk(blockId)
+    values =  self.__ex_get_var(step,ebType,var_id,blockId,numVals)
+    if self.use_numpy:
+        values = ctype_to_numpy(self, values)
+    return values
+
+  # --------------------------------------------------------------------
+
+  def put_element_variable_values(self,blockId,name,step,values):
+    """ 
+      e.put_element_variable_values(blockId,"name",step,values) -> put values into element block id
+      and variable name at step into exodus file
+    """
+    names = self.get_element_variable_names()
+    var_id = names.index(name) + 1
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    numVals = self.num_elems_in_blk(blockId)
+    self.__ex_put_var(step,ebType,var_id,blockId,numVals,values)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_element_variable_number(self):
+    """ 
+      e.get_element_variable_number() -> get number of element variables in exodus file
+    """
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    num = self.__ex_get_variable_param(ebType)
+    return num.value
+
+  # --------------------------------------------------------------------
+
+  def set_element_variable_number(self,number):
+    """ 
+      e.set_element_variable_number(number) -> set number of element variables in exodus file
+    """
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    self.__ex_put_variable_param(ebType,number)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_element_variable_names(self):
+    """ 
+      e.get_element_variable_names() -> get list of element variable names in exodus file
+    """
+    if self.__ex_get_var_param("e").value == 0:
+      return []
+    return self.__ex_get_var_names("e")
+
+  # --------------------------------------------------------------------
+
+  def put_element_variable_name(self,name,index):
+    """ 
+      e.put_element_variable_name("name",index) -> element variable with name at index into exodus file
+    """
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    EBvarNames = self.get_element_variable_names()
+    if name in EBvarNames:
+      print "WARNING:element variable \"", name, "\" already exists."
+    if index > len(EBvarNames):
+      print "index", index, "len", len(EBvarNames)
+      raise Exception, ("ERROR: variable index out of range.")
+    self.__ex_put_variable_name(ebType,index,name)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_element_attribute_names(self,blkId):
+    """ 
+      e.get_element_attribute_names(blId) -> get list of element attribute names for block in exodus file
+    """
+    names = self.__ex_get_elem_attr_names(blkId)
+    return list(names)
+
+  # --------------------------------------------------------------------
+
+  def put_element_attribute_names(self,blkId,names):
+    """ 
+      e.put_element_attribute_names(blId,names) -> set element attribute names for block in exodus file
+    """
+    return self.__ex_put_elem_attr_names(blkId,names)
+
+  # --------------------------------------------------------------------
+
+  def get_element_property_names(self):
+    """ 
+      e.get_element_property_names() -> get list of element property names in exodus file
+    """
+    names = []
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    inqType = "EX_INQ_EB_PROP"
+    names = self.__ex_get_prop_names(ebType,inqType)
+    return list(names)
+
+  # --------------------------------------------------------------------
+
+  def get_element_property_value(self,id,name):
+    """ 
+      e.get_element_property_value(id,name) -> get element property value in exodus file
+                                               for an element block ID and property name
+    """
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    propVal = self.__ex_get_prop(ebType,id,name)
+    return int(propVal)
+
+  # --------------------------------------------------------------------
+
+  def put_element_property_value(self,id,name,value):
+    """
+      e.put_element_property_value(id,name,value) -> put an element property name and
+                                                     its integer value for a block ID
+                                                     into an exodus file
+    """
+    ebType = ex_entity_type("EX_ELEM_BLOCK")
+    if self.__ex_put_prop(ebType,id,name,value):
+      return True
+    else:
+      return False
+
+  #
+  # nodesets
+  #
+  # --------------------------------------------------------------------
+
+  def num_node_sets(self):
+    """ 
+      e.num_node_sets() -> number of node sets in exodus file
+    """
+    return self.numNodeSets.value
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_ids(self):
+    """ 
+      e.get_node_set_ids() -> get list of node set ids in exodus file
+    """
+    self.__ex_get_node_set_ids()
+    nodeSetIds = list(self.nodeSetIds)
+    if self.use_numpy:
+        nodeSetIds = self.np.array(nodeSetIds)
+    return nodeSetIds
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_name(self,id):
+    """ 
+      e.get_node_set_name(id) -> get node set name for node set "id" in 
+                                 exodus file
+    """
+    objType = ex_entity_type("EX_NODE_SET")
+    nodeSetName = self.__ex_get_name(objType,id)
+    return nodeSetName
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_name(self,id,name):
+    """ 
+      e.put_node_set_name(id,name) -> write node set name for node set 
+                                      "id" in exodus file
+    """
+    objType = ex_entity_type("EX_NODE_SET")
+    self.__ex_put_name(objType,id,name)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_names(self):
+    """ 
+      e.get_node_set_names() -> get list of node set names in 
+                                exodus file
+    """
+    objType = ex_entity_type("EX_NODE_SET")
+    inqType = ex_inquiry("EX_INQ_NODE_SETS")
+    nodeSetNames = self.__ex_get_names(objType,inqType)
+    return nodeSetNames
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_names(self,names):
+    """ 
+      e.put_node_set_names(names) -> write list of node set names to 
+                                     exodus file
+    """
+    objType = ex_entity_type("EX_NODE_SET")
+    inqType = ex_inquiry("EX_INQ_NODE_SETS")
+    self.__ex_put_names(objType,inqType,names)
+
+  # --------------------------------------------------------------------
+
+  def num_nodes_in_node_set(self,id):
+    """ 
+      e.num_nodes_in_node_set(id) -> number of nodes in node set id
+    """
+    node_set_nodes = self.get_node_set_nodes(id)
+    return len(node_set_nodes)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_nodes(self,id):
+    """
+      e.get_node_set_nodes(id) -> list of node id's in node set
+    """
+    node_set_ids = self.get_node_set_ids()
+    assert id in node_set_ids
+    node_set_nodes = self.__ex_get_node_set(id)
+    node_set_nodes = list(node_set_nodes)
+    if self.use_numpy:
+        node_set_nodes = self.np.array(node_set_nodes)
+    return node_set_nodes
+
+  # --------------------------------------------------------------------
+
+  def put_node_set(self,id,nodeSetNodes):
+    """
+      e.put_node_set() -> set the id and node list for a node set (creates the node set).
+    """
+    self.__ex_put_node_set(id,nodeSetNodes)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_dist_facts(self,id):
+    """
+      e.get_node_set_nodes(id) -> list of distribution factors for nodes in node set
+    """
+    node_set_dfs = self.__ex_get_node_set_dist_fact(id)
+    node_set_dfs = list(node_set_dfs)
+    if self.use_numpy:  
+        node_set_dfs = self.np.array(node_set_dfs)
+    return node_set_dfs
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_dist_fact(self,id,nodeSetDistFact):
+    """
+      e.put_node_set_dist_fact() -> sets the distribution factors for a node set.
+    """
+    self.__ex_put_node_set_dist_fact(id,nodeSetDistFact)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_variable_number(self):
+    """ 
+      e.get_node_set_variable_number() -> get number of node set variables in exodus file
+    """
+    nsType = ex_entity_type("EX_NODE_SET")
+    num = self.__ex_get_variable_param(nsType)
+    return num.value
+
+  # --------------------------------------------------------------------
+
+  def set_node_set_variable_number(self,number):
+    """ 
+      e.set_node_set_variable_number(number) -> set number of node set variables in exodus file
+    """
+    nsType = ex_entity_type("EX_NODE_SET")
+    self.__ex_put_variable_param(nsType,number)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_variable_truth_table(self,nodeSetId=None):
+    """
+      e.get_node_set_variable_truth_table(nodeSetId) -> gets a truth table indicating which variables are
+                                                     defined for a node set.  If nodeSetId is not passed, then
+                                                     a concatenated truth table for all node sets is returned
+                                                     with variable index cycling faster than nodeSetId
+    """
+    truthTable = self.__ex_get_nset_var_tab()
+    if nodeSetId != None:
+      self.get_node_set_ids()
+      assert nodeSetId in list(self.nodeSetIds)
+      indx = list(self.nodeSetIds).index(nodeSetId)
+      numVars = self.__ex_get_var_param("m").value
+      start,stop = (indx * numVars, (indx + 1) * numVars)
+      return truthTable[start:stop]
+    return truthTable
+
+  # --------------------------------------------------------------------
+
+  def set_node_set_variable_truth_table(self,table):
+    """
+      e.set_node_set_variable_truth_table(table) -> sets a truth table indicating which variables are
+                                                   defined for each node set in the model.  
+                                                   Node set variable index cycles faster than the 
+                                                   node set index
+    """
+    self.get_node_set_ids()
+    numBlks = len(self.nodeSetIds)
+    numVars = int(self.__ex_get_var_param("m").value)
+    assert len(table) == (numBlks * numVars)
+    return self.__ex_put_nset_var_tab(table)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_variable_names(self):
+    """ 
+      e.get_node_set_variable_names() -> get list of node set variable names in exodus file
+    """
+    names = []
+    nsType = ex_entity_type("EX_NODE_SET")
+    num_vars = self.__ex_get_variable_param(nsType)
+    for varid in range(num_vars.value):
+      varid += 1
+      name = self.__ex_get_variable_name(nsType,varid)
+      names.append(name.value)
+    return names
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_variable_name(self,name,index):
+    """ 
+      e.put_node_set_variable_name("name",index) -> put node set variable with name at index into exodus file
+    """
+    nsType = ex_entity_type("EX_NODE_SET")
+    NSvarNames = self.get_node_set_variable_names()
+    if name in NSvarNames:
+      print "WARNING: Node set variable \"", name, "\" already exists."
+    if index > len(NSvarNames):
+      raise Exception, ("ERROR: variable index out of range.")
+    self.__ex_put_variable_name(nsType,index,name)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_variable_values(self,id,name,step):
+    """ 
+      e.get_node_set_variable_names(id,"name",step) -> get list of node set variable values 
+      for node set id at step within exodus file
+    """
+    names = self.get_node_set_variable_names()
+    var_id = names.index(name) + 1
+    values =  self.__ex_get_nset_var(step,var_id,id)
+    if self.use_numpy:
+        values = ctypes_to_numpy(self, values)
+    return values
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_variable_values(self,id,name,step,values):
+    """ 
+      e.put_node_set_variable_values(id,"name",step,values) -> put values into node set id 
+      and variable name at step into exodus file
+    """
+    names = self.get_node_set_variable_names()
+    var_id = names.index(name) + 1
+    self.__ex_put_nset_var(step,var_id,id,values)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_all_node_set_params(self):
+    """
+      e.get_all_node_set_params() -> get total number of nodes and distribution factors
+                                     combined in all node sets
+    """
+    self.__ex_get_node_set_ids()
+    totNumSetNodes, totNumSetDistFacts = 0, 0
+    for nodeSetId in self.nodeSetIds: 
+      (numSetNodes,numSetDistFacts) = self.__ex_get_node_set_param(int(nodeSetId))
+      totNumSetNodes += numSetNodes
+      totNumSetDistFacts += numSetDistFacts
+    return (totNumSetNodes, totNumSetDistFacts)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_params(self,id):
+    """
+      e.get_node_set_params() -> get number of nodes and distribution factors
+                                     in a node set
+    """
+    (numSetNodes,numSetDistFacts) = self.__ex_get_node_set_param(int(id))
+    return (numSetNodes, numSetDistFacts)
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_params(self,id,numSetNodes,numSetDistFacts=None):
+    """
+      e.put_node_set_params() -> sets the ID, number of nodes, and number of
+                                 distribution factors in a node set.  If the
+                                 last argument is not given, then the number
+                                 of distribution factors is set equal to the
+                                 number of nodes
+    """
+    if numSetDistFacts == None: numSetDistFacts = numSetNodes
+    assert numSetDistFacts == 0 or numSetDistFacts == numSetNodes
+    self.__ex_put_node_set_param(id,numSetNodes,numSetDistFacts)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_property_names(self):
+    """ 
+      e.get_node_set_property_names() -> get list of nodeset property names in exodus file
+    """
+    names = []
+    nsType = ex_entity_type("EX_NODE_SET")
+    inqType = "EX_INQ_NS_PROP"
+    names = self.__ex_get_prop_names(nsType,inqType)
+    return list(names)
+
+  # --------------------------------------------------------------------
+
+  def get_node_set_property_value(self,id,name):
+    """ 
+      e.get_node_set_property_value(id,name) -> get nodeset property value in exodus file
+                                                for an nodeset ID and property name
+    """
+    nsType = ex_entity_type("EX_NODE_SET")
+    propVal = self.__ex_get_prop(nsType,id,name)
+    return int(propVal)
+
+  # --------------------------------------------------------------------
+
+  def put_node_set_property_value(self,id,name,value):
+    """
+      e.put_node_set_property_value(id,name,value) -> put a nodeset property name and
+                                                      its integer value for a nodeset
+                                                      ID into an exodus file
+    """
+    nsType = ex_entity_type("EX_NODE_SET")
+    if self.__ex_put_prop(nsType,id,name,value):
+      return True
+    else:
+      return False
+
+  #
+  # sidesets
+  #
+  # --------------------------------------------------------------------
+
+  def num_side_sets(self):
+    """ 
+      e.num_side_sets() -> number of side sets in exodus file
+    """
+    return self.numSideSets.value
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_ids(self):
+    """ 
+      e.get_side_set_ids() -> get list of side set ids in exodus file
+    """
+    self.__ex_get_side_set_ids()
+    sideSetIds = list(self.sideSetIds)
+    if self.use_numpy:
+        sideSetIds = self.np.array(sideSetIds)
+    return sideSetIds
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_name(self,id):
+    """ 
+      e.get_side_set_name(id) -> get side set name for side set "id" in 
+                                 exodus file
+    """
+    objType = ex_entity_type("EX_SIDE_SET")
+    sideSetName = self.__ex_get_name(objType,id)
+    return sideSetName
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_name(self,id,name):
+    """ 
+      e.put_side_set_name(id,name) -> write side set name for side set 
+                                      "id" in exodus file
+    """
+    objType = ex_entity_type("EX_SIDE_SET")
+    self.__ex_put_name(objType,id,name)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_names(self):
+    """ 
+      e.get_side_set_names() -> get list of side set names in 
+                                exodus file
+    """
+    objType = ex_entity_type("EX_SIDE_SET")
+    inqType = ex_inquiry("EX_INQ_SIDE_SETS")
+    sideSetNames = self.__ex_get_names(objType,inqType)
+    return sideSetNames
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_names(self,names):
+    """ 
+      e.put_side_set_names(names) -> write list of side set names to 
+                                     exodus file
+    """
+    objType = ex_entity_type("EX_SIDE_SET")
+    inqType = ex_inquiry("EX_INQ_SIDE_SETS")
+    self.__ex_put_names(objType,inqType,names)
+
+  # --------------------------------------------------------------------
+
+  def num_faces_in_side_set(self,id):
+    """ 
+      e.num_faces_in_side_set(id) -> number of faces in side set id
+    """
+    ssids = self.get_side_set_ids()
+    if ( id not in ssids ): 
+      print "WARNING: queried side set ID does not exist in database"
+      return 0
+    (num_side_in_set,num_dist_fact_in_set) = self.__ex_get_side_set_param(id)
+    return num_side_in_set
+
+  # --------------------------------------------------------------------
+
+  def get_all_side_set_params(self):
+    """
+      e.get_all_side_set_params() -> get total number of elements, nodes, and distribution
+                                     factors combined in all side sets
+    """
+    self.__ex_get_side_set_ids()
+    totNumSetSides, totNumSetDistFacts = 0, 0 # totNumSetDistFacts = totNumSetNodes
+    for sideSetId in self.sideSetIds: 
+      (numSetSides,numSetDistFacts) = self.__ex_get_side_set_param(int(sideSetId))
+      totNumSetSides += numSetSides
+      totNumSetDistFacts += numSetDistFacts
+    totNumSetNodes = totNumSetDistFacts
+    return (totNumSetSides, totNumSetNodes, totNumSetDistFacts)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_params(self,id):
+    """
+      e.get_side_set_params() -> get number of sides, and distribution factors
+                                 in a side set
+    """
+    (numSetSides,numSetDistFacts) = self.__ex_get_side_set_param(int(id))
+    return (numSetSides, numSetDistFacts)
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_params(self,id,numSetSides,numSetDistFacts):
+    """
+      e.put_side_set_params() -> set ID, num elements, and num nodes of a sideset
+    """
+    self.__ex_put_side_set_param(id,numSetSides,numSetDistFacts)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set(self,id):
+    """ 
+      e.get_side_set(id) -> get tuple of two lists (side_set_elem_list,
+      side_set_side_list) the side_set_elem_list contains the elements in the
+      side set, and the side_set_side_list contains the side ID for each of the
+      elements in the side_set_elem_list (identifies the side onto which the load
+      is applied).
+    """
+    (side_set_elem_list,side_set_side_list) = self.__ex_get_side_set(id)
+    if self.use_numpy:
+        side_set_elem_list = ctype_to_numpy(self, side_set_elem_list)
+        side_set_side_list = ctype_to_numpy(self, side_set_side_list)
+    return (side_set_elem_list,side_set_side_list)
+
+  # --------------------------------------------------------------------
+
+  def put_side_set(self,id,sideSetElements,sideSetSides):
+    """
+      e.put_side_set() -> set the id, element ids, and side ids for
+                          a side set (creates the side set).
+    """
+    self.__ex_put_side_set(id,sideSetElements,sideSetSides)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_dist_fact(self,id):
+    """ 
+      e.get_side_set_dist_fact(id) ->  list of distribution factors for sides in side set
+    """
+    side_set_dfs = list(self.__ex_get_side_set_dist_fact(id))
+    if self.use_numpy:
+        side_set_dfs = self.np.array(side_set_dfs)
+    return side_set_dfs
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_dist_fact(self,id,sideSetDistFact):
+    """
+      e.put_side_set_dist_fact() -> sets the distribution factors for a side set.
+                                    A distribution factor is given for each node
+                                    on each face in the side set.
+    """
+    self.__ex_put_side_set_dist_fact(id,sideSetDistFact)
+
+  # --------------------------------------------------------------------  
+
+  def get_side_set_node_list(self,id):
+    """ 
+      e.get_side_set_nodes(id) -> get tuple of two lists (side_set_node_cnt_list,
+      side_set_node_list) the side_set_node_cnt_list is the number of nodes on each
+      face and the side_set_node_list is the list of local node ids for the side set 
+      in exodus file
+    """
+    (side_set_node_cnt_list,side_set_node_list) = self.__ex_get_side_set_node_list(id)
+    if self.use_numpy:
+        side_set_node_cnt_list = ctype_to_numpy(self, side_set_node_cnt_list)
+        side_set_node_list = ctype_to_numpy(self, side_set_node_list)
+    return (side_set_node_cnt_list,side_set_node_list)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_variable_truth_table(self,sideSetId=None):
+    """
+      e.get_side_set_variable_truth_table(sideSetId) -> gets a truth table indicating which variables are
+                                                     defined for a side set.  If sideSetId is not passed, then
+                                                     a concatenated truth table for all side sets is returned
+                                                     with variable index cycling faster than sideSetId
+    """
+    truthTable = self.__ex_get_sset_var_tab()
+    if sideSetId != None:
+      self.get_side_set_ids()
+      assert sideSetId in list(self.sideSetIds)
+      indx = list(self.sideSetIds).index(sideSetId)
+      numVars = self.__ex_get_var_param("s").value
+      start,stop = (indx * numVars, (indx + 1) * numVars)
+      return truthTable[start:stop]
+    return truthTable
+
+  # --------------------------------------------------------------------
+
+  def set_side_set_variable_truth_table(self,table):
+    """
+      e.set_side_set_variable_truth_table(table) -> sets a truth table indicating which variables are
+                                                   defined for each side set in the model.  
+                                                   Side set variable index cycles faster than the 
+                                                   side set index
+    """
+    self.get_side_set_ids()
+    numBlks = len(self.sideSetIds)
+    numVars = int(self.__ex_get_var_param("s").value)
+    assert len(table) == (numBlks * numVars)
+    return self.__ex_put_sset_var_tab(table)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_variable_number(self):
+    """ 
+      e.get_side_set_variable_number() -> get number of side set variables in exodus file
+    """
+    ssType = ex_entity_type("EX_SIDE_SET")
+    num = self.__ex_get_variable_param(ssType)
+    return num.value
+
+  # --------------------------------------------------------------------
+
+  def set_side_set_variable_number(self,number):
+    """ 
+      e.set_side_set_variable_number(number) -> set number of side set variables in exodus file
+    """
+    ssType = ex_entity_type("EX_SIDE_SET")
+    self.__ex_put_variable_param(ssType,number)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_variable_names(self):
+    """ 
+      e.get_side_set_variable_names() -> get list of side set variable names in exodus file
+    """
+    names = []
+    ssType = ex_entity_type("EX_SIDE_SET")
+    num_vars = self.__ex_get_variable_param(ssType)
+    for varid in range(num_vars.value):
+      varid += 1
+      name = self.__ex_get_variable_name(ssType,varid)
+      names.append(name.value)
+    return names
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_variable_name(self,name,index):
+    """ 
+      e.put_side_set_variable_name("name",index) -> put side set variable with name at index into exodus file
+    """
+    ssType = ex_entity_type("EX_SIDE_SET")
+    SSvarNames = self.get_side_set_variable_names()
+    if name in SSvarNames:
+      print "WARNING:Side set variable \"", name, "\" already exists."
+    if index > len(SSvarNames):
+      raise Exception, ("ERROR: variable index out of range.")
+    self.__ex_put_variable_name(ssType,index,name)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_variable_values(self,id,name,step):
+    """ 
+      e.get_side_set_variable_names(id,"name",step) -> get list of side set variable values 
+      for side set id at step within exodus file
+    """
+    names = self.get_side_set_variable_names()
+    var_id = names.index(name) + 1
+    values =  self.__ex_get_sset_var(step,var_id,id)
+    if self.use_numpy:
+        values = ctype_to_numpy(self,values)
+    return values
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_variable_values(self,id,name,step,values):
+    """ 
+      e.put_side_set_variable_values(id,"name",step,values) -> put values into side set id 
+      and variable name at step into exodus file
+    """
+    names = self.get_side_set_variable_names()
+    var_id = names.index(name) + 1
+    self.__ex_put_sset_var(step,var_id,id,values)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_property_names(self):
+    """ 
+      e.get_side_set_property_names() -> get list of sideset property names in exodus file
+    """
+    names = []
+    ssType = ex_entity_type("EX_SIDE_SET")
+    inqType = "EX_INQ_SS_PROP"
+    names = self.__ex_get_prop_names(ssType,inqType)
+    return list(names)
+
+  # --------------------------------------------------------------------
+
+  def get_side_set_property_value(self,id,name):
+    """ 
+      e.get_side_set_property_value(id,name) -> get sideset property value in exodus file
+                                                for an sideset ID and property name
+    """
+    ssType = ex_entity_type("EX_SIDE_SET")
+    propVal = self.__ex_get_prop(ssType,id,name)
+    return int(propVal)
+
+  # --------------------------------------------------------------------
+
+  def put_side_set_property_value(self,id,name,value):
+    """
+      e.put_side_set_property_value(id,name,value) -> put a sideset property name and
+                                                      its integer value for a sideset
+                                                      ID into an exodus file
+    """
+    ssType = ex_entity_type("EX_SIDE_SET")
+    if self.__ex_put_prop(ssType,id,name,value):
+      return True
+    else:
+      return False
+
+  #
+  # global variables
+  #
+  # --------------------------------------------------------------------
+
+  def get_global_variable_number(self):
+    """ 
+      e.get_global_variable_number() -> get number of global variables in exodus file
+    """
+    gbType = ex_entity_type("EX_GLOBAL")
+    num = self.__ex_get_variable_param(gbType)
+    return num.value
+
+  # --------------------------------------------------------------------
+
+  def set_global_variable_number(self,number):
+    """ 
+      e.set_global_variable_number(number) -> set number of global variables in exodus file
+    """
+    gbType = ex_entity_type("EX_GLOBAL")
+    self.__ex_put_variable_param(gbType,number)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_global_variable_names(self):
+    """ 
+      e.get_global_variable_names() -> get list of global variable names in exodus file
+    """
+    if self.get_global_variable_number() == 0:
+      return []
+    return self.__ex_get_var_names("g")
+
+  # --------------------------------------------------------------------
+
+  def put_global_variable_name(self,name,index):
+    """ 
+      e.put_global_variable_name("name",index) -> put global variable with name at index into exodus file
+    """
+    gbType = ex_entity_type("EX_GLOBAL")
+    GlobVarNames = self.get_global_variable_names()
+    if name in GlobVarNames:
+      print "WARNING: global variable \"", name, "\" already exists."
+    if index > len(GlobVarNames):
+      print "index", index, "len", len(GlobVarNames)
+      raise Exception, ("ERROR: variable index out of range.")
+    self.__ex_put_variable_name(gbType,index,name)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_global_variable_value(self,name,step):
+    """ 
+      e.get_global_variable_value("name",step) -> get global variable value
+      at time step within exodus file
+    """
+    names = self.get_global_variable_names()
+    var_id = names.index(name)
+    gbType = ex_entity_type("EX_GLOBAL")
+    num = self.__ex_get_variable_param(gbType)
+    gvalues =  self.__ex_get_var(step,gbType,0,1,num.value)
+    return gvalues[var_id]
+
+  # --------------------------------------------------------------------
+
+  def get_all_global_variable_values(self,step):
+    """ 
+      e.get_all_global_variable_values(step) -> get all global variable values
+      at time step within exodus file
+    """
+    gbType = ex_entity_type("EX_GLOBAL")
+    num = self.__ex_get_variable_param(gbType)
+    gvalues =  self.__ex_get_var(step,gbType,0,1,num.value)
+    values = []
+    for i in xrange(num.value):
+      values.append(gvalues[i])
+    if self.use_numpy:
+      values = self.np.array(values)
+    return values
+
+  # --------------------------------------------------------------------
+
+  def put_global_variable_value(self,name,step,value):
+    """
+      e.put_global_variable_value("name",step,value) -> put global variable value
+      and variable name at time step into exodus file
+    """
+    # we must write all values at once, not individually
+    names   = self.get_global_variable_names()
+    # get all values
+    numVals = self.get_global_variable_number()
+    values = (c_double * numVals)()
+    for i in xrange(numVals):
+      values[i] = c_double(self.get_global_variable_value(names[i], step))
+    # adjust one of them
+    values[names.index(name)] = c_double(value)
+    # write them all
+    EXODUS_LIB.ex_put_glob_vars(self.fileId,
+                                c_int(step),
+                                c_int(numVals),
+                                values)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def put_all_global_variable_values(self,step,values):
+    """
+      e.put_all_global_variable_values(step,values) -> put all global variable values
+      at time step into exodus file
+    """
+    numVals = self.get_global_variable_number()
+    gvalues = (c_double * numVals)()
+    for i in xrange(numVals):
+      gvalues[i] = c_double(values[i])
+    EXODUS_LIB.ex_put_glob_vars(self.fileId,
+                                c_int(step),
+                                c_int(numVals),
+                                gvalues)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def get_global_variable_values(self,name):
+    """
+      e.get_global_variable_values("name") -> get global variable values
+      within exodus file
+    """
+    names = self.get_global_variable_names()
+    var_id = names.index(name)
+    gbType = ex_entity_type("EX_GLOBAL")
+    num = self.__ex_get_variable_param(gbType)
+    values = []
+    for i in range(self.numTimes.value):
+      gvalues =  self.__ex_get_var(i+1,gbType,0,1,num.value)
+      values.append( gvalues[var_id] )
+    if self.use_numpy:
+      values = self.np.array(values)
+    return values
+
+  # --------------------------------------------------------------------
+
+  def close(self):
+    """ 
+      e.close() -> close the exodus file.
+    """
+    print "Closing exodus file: " + self.fileName
+    errorInt = EXODUS_LIB.ex_close(self.fileId)
+    if errorInt != 0:
+      raise Exception, ("ERROR: Closing file " + self.fileName + " had problems.")
+
+  # --------------------------------------------------------------------
+  #
+  # Exodus API calls
+  #
+  # --------------------------------------------------------------------
+
+  def __open(self, io_size=0):
+    print "Opening exodus file: " + self.fileName
+    self.mode = EX_READ
+    if self.modeChar.lower() == "a": self.mode = EX_WRITE
+    if self.modeChar.lower() in ["a","r"] and not os.path.isfile(self.fileName):
+      raise Exception, ("ERROR: Cannot open " + self.fileName + " for read. Does not exist.")
+    elif self.modeChar.lower() == "w" and os.path.isfile(self.fileName):
+      raise Exception, ("ERROR: Cowardly not opening " + self.fileName + \
+                        " for write. File already exists.")
+    elif self.modeChar.lower() not in ["a","r","w"]:
+      raise Exception, ("ERROR: File open mode " + self.modeChar + " unrecognized.")
+    self.comp_ws = c_int(8)
+    self.io_ws = c_int(io_size)
+    self.version = c_float(0.0)
+    if self.modeChar.lower() in ["a","r"]: # open existing file
+      self.fileId = EXODUS_LIB.ex_open_int(self.fileName,self.mode,
+                                           byref(self.comp_ws),
+                                           byref(self.io_ws),
+                                           byref(self.version),
+                                           EX_API_VERSION_NODOT)
+    else: # create file
+      if io_size == 0:
+        io_size = 8
+        self.io_ws = c_int(io_size)
+      self.__create()
+
+  # --------------------------------------------------------------------
+
+  def __create(self):
+    cMode = c_int(EX_NOCLOBBER)
+    self.fileId = EXODUS_LIB.ex_create_int(self.fileName,cMode,
+                                           byref(self.comp_ws),
+                                           byref(self.io_ws),
+                                           EX_API_VERSION_NODOT)
+
+  # --------------------------------------------------------------------
+
+  def __copy_file(self,other):
+    EXODUS_LIB.ex_copy(self.fileId,other.fileId)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_info(self):
+    self.Title       = create_string_buffer(MAX_LINE_LENGTH+1)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      self.numDim      = c_longlong(0)
+      self.numNodes    = c_longlong(0)
+      self.numElem     = c_longlong(0)
+      self.numElemBlk  = c_longlong(0)
+      self.numNodeSets = c_longlong(0)
+      self.numSideSets = c_longlong(0)
+    else:
+      self.numDim      = c_int(0)
+      self.numNodes    = c_int(0)
+      self.numElem     = c_int(0)
+      self.numElemBlk  = c_int(0)
+      self.numNodeSets = c_int(0)
+      self.numSideSets = c_int(0)
+    EXODUS_LIB.ex_get_init(self.fileId,self.Title,byref(self.numDim),byref(self.numNodes),
+                           byref(self.numElem),byref(self.numElemBlk),byref(self.numNodeSets),
+                           byref(self.numSideSets))
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_info(self,info):
+    self.Title       = create_string_buffer(info[0],MAX_LINE_LENGTH+1)
+    self.numDim      = c_longlong(info[1])
+    self.numNodes    = c_longlong(info[2])
+    self.numElem     = c_longlong(info[3])
+    self.numElemBlk  = c_longlong(info[4])
+    self.numNodeSets = c_longlong(info[5])
+    self.numSideSets = c_longlong(info[6])
+    EXODUS_LIB.ex_put_init(self.fileId,self.Title,self.numDim,self.numNodes,self.numElem,
+                           self.numElemBlk,self.numNodeSets,self.numSideSets)
+    self.version = self.__ex_inquire_float(ex_inquiry("EX_INQ_DB_VERS"))
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_concat_elem_blk(self,elemBlkIDs, elemType, numElemThisBlk,\
+                                 numNodesPerElem,numAttr,defineMaps):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      elem_blk_ids = (c_longlong * len(elemBlkIDs))()
+      elem_blk_ids[:] = elemBlkIDs
+      num_elem_this_blk = (c_longlong * len(elemBlkIDs))()
+      num_elem_this_blk[:] = numElemThisBlk
+      num_nodes_per_elem = (c_longlong * len(elemBlkIDs))()
+      num_nodes_per_elem[:] = numNodesPerElem
+      num_attr = (c_longlong * len(elemBlkIDs))()
+      num_attr[:] = numAttr
+    else:
+      elem_blk_ids = (c_int * len(elemBlkIDs))()
+      elem_blk_ids[:] = elemBlkIDs
+      num_elem_this_blk = (c_int * len(elemBlkIDs))()
+      num_elem_this_blk[:] = numElemThisBlk
+      num_nodes_per_elem = (c_int * len(elemBlkIDs))()
+      num_nodes_per_elem[:] = numNodesPerElem
+      num_attr = (c_int * len(elemBlkIDs))()
+      num_attr[:] = numAttr
+    elem_type = (c_char_p * len(elemBlkIDs))()
+    elem_type[:] = elemType
+    define_maps = c_int(defineMaps)
+    EXODUS_LIB.ex_put_concat_elem_block(self.fileId,elem_blk_ids,elem_type, \
+               num_elem_this_blk,num_nodes_per_elem,num_attr,define_maps)
+    
+
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_qa(self):
+    num_qa_recs = c_int(self.__ex_inquire_int(ex_inquiry("EX_INQ_QA")))
+    qa_rec_ptrs = ((POINTER(c_char * (MAX_STR_LENGTH+1)) * 4) * num_qa_recs.value)()
+    for i in range(num_qa_recs.value):
+      for j in range(4):
+        qa_rec_ptrs[i][j] = pointer(create_string_buffer(MAX_STR_LENGTH+1))
+    if num_qa_recs.value:
+      EXODUS_LIB.ex_get_qa(self.fileId,byref(qa_rec_ptrs))
+    qa_recs = []
+    for qara in qa_rec_ptrs:
+      qa_rec_list = []
+      for ptr in qara:
+        qa_rec_list.append(ptr.contents.value)
+      qa_rec_tuple = tuple(qa_rec_list)
+      assert len(qa_rec_tuple) == 4
+      qa_recs.append(qa_rec_tuple)
+    return qa_recs
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_qa(self,qaRecs):
+    num_qa_recs = c_int(len(qaRecs))
+    qa_rec_ptrs = ((POINTER(c_char * (MAX_STR_LENGTH+1)) * 4) * num_qa_recs.value)()
+    for i in range(num_qa_recs.value):
+      for j in range(4):
+        qa_rec_ptrs[i][j] = pointer(create_string_buffer(str(qaRecs[i][j]),MAX_STR_LENGTH+1))
+    EXODUS_LIB.ex_put_qa(self.fileId,num_qa_recs,byref(qa_rec_ptrs))
+    return True
+
+  # --------------------------------------------------------------------
+
+  def _ex_get_info_recs_quietly(self):
+    num_infos = c_int(self.__ex_inquire_int(ex_inquiry("EX_INQ_INFO")))
+    info_ptrs = (POINTER(c_char * (MAX_LINE_LENGTH+1)) * num_infos.value)()
+    for i in range(num_infos.value):
+      info_ptrs[i] = pointer(create_string_buffer(MAX_LINE_LENGTH+1))
+    if num_infos.value:
+      EXODUS_LIB.ex_get_info(self.fileId,byref(info_ptrs))
+    info_recs = []
+    for irp in info_ptrs:
+      info_recs.append(irp.contents.value)
+    return info_recs
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_info_recs(self):
+    num_infos = c_int(self.__ex_inquire_int(ex_inquiry("EX_INQ_INFO")))
+    info_ptrs = (POINTER(c_char * (MAX_LINE_LENGTH+1)) * num_infos.value)()
+    for i in range(num_infos.value):
+      info_ptrs[i] = pointer(create_string_buffer(MAX_LINE_LENGTH+1))
+    EXODUS_LIB.ex_get_info(self.fileId,byref(info_ptrs))
+    info_recs = []
+    for irp in info_ptrs:
+      info_recs.append(irp.contents.value)
+    for rec in info_recs:
+      if len(rec) > MAX_LINE_LENGTH:
+        print "WARNING: max line length reached for one or more info records;"
+        print "         info might be incomplete for these records"
+        break
+    return info_recs
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_info_recs(self,infoRecs):
+    num_infos = c_int(len(infoRecs))
+    info_ptrs = (POINTER(c_char * (MAX_LINE_LENGTH+1)) * num_infos.value)()
+    for i in range(num_infos.value):
+      info_ptrs[i] = pointer(create_string_buffer(str(infoRecs[i]),MAX_LINE_LENGTH+1))
+    EXODUS_LIB.ex_put_info(self.fileId,num_infos,None) ## Define Number of Info
+    EXODUS_LIB.ex_put_info(self.fileId,num_infos,byref(info_ptrs)) ## Set Info
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_inquire_float(self,id):
+    val        = c_int(0)
+    dummy_char = create_string_buffer(MAX_LINE_LENGTH+1)
+    ret_float  = c_float(0.0)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_INQ_INT64_API):
+      dummy_int = c_longlong(0)
+    else:
+      dummy_int = c_int(0)
+    val = EXODUS_LIB.ex_inquire(self.fileId,id,byref(dummy_int),byref(ret_float),dummy_char)
+    if val < 0:
+      raise Exception, ("ERROR: ex_inquire(" + str(id) + ") failed on " + self.fileName)
+    return ret_float
+
+  # --------------------------------------------------------------------
+
+  def __ex_inquire_int(self,id):
+    val = c_longlong(0)
+    val = EXODUS_LIB.ex_inquire_int(self.fileId,id)
+    if val < 0:
+      raise Exception, ("ERROR: ex_inquire_int(" + str(id) + ") failed on " + self.fileName)
+    return val
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_coord_names(self):
+    coord_name_ptrs = (POINTER(c_char * (MAX_STR_LENGTH+1)) * self.numDim.value)()
+    for i in range(self.numDim.value):
+      coord_name_ptrs[i] = pointer(create_string_buffer(MAX_STR_LENGTH+1))
+    EXODUS_LIB.ex_get_coord_names(self.fileId,byref(coord_name_ptrs))
+    coord_names = []
+    for cnp in coord_name_ptrs: 
+      coord_names.append(cnp.contents.value)
+    return coord_names
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_coord_names(self,names):
+    coord_name_ptrs = (POINTER(c_char * (MAX_STR_LENGTH+1)) * self.numDim.value)()
+    assert len(names) == self.numDim.value
+    for i in range(self.numDim.value):
+      coord_name_ptrs[i] = pointer(create_string_buffer(names[i],MAX_STR_LENGTH+1))
+    EXODUS_LIB.ex_put_coord_names(self.fileId,byref(coord_name_ptrs))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_all_times(self):
+    self.times = (c_double * self.numTimes.value)()
+    EXODUS_LIB.ex_get_all_times(self.fileId,byref(self.times))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_time(self,timeStep):
+    time_step = c_int(timeStep)
+    time_val = c_double(0.0)
+    EXODUS_LIB.ex_get_time(self.fileId,time_step,byref(time_val))
+    return time_val.value()
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_time(self,timeStep,timeVal):
+    time_step = c_int(timeStep)
+    time_val = c_double(timeVal)
+    EXODUS_LIB.ex_put_time(self.fileId,time_step,byref(time_val))
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_name(self,objType,objId):
+    obj_type = c_int(objType)
+    obj_id = c_int(objId)
+    obj_name = create_string_buffer(MAX_STR_LENGTH+1)
+    EXODUS_LIB.ex_get_name(self.fileId,obj_type,obj_id,byref(obj_name))
+    return obj_name.value
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_name(self,objType,objId,objName):
+    obj_type = c_int(objType)
+    obj_id = c_int(objId)
+    obj_name = create_string_buffer(objName,MAX_STR_LENGTH+1)
+    EXODUS_LIB.ex_put_name(self.fileId,obj_type,obj_id,obj_name)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_names(self,objType,inqType):
+    obj_type = c_int(objType)
+    num_objs = c_int(self.__ex_inquire_int(inqType))
+    numObjs = num_objs.value
+    obj_name_ptrs = (POINTER(c_char * (MAX_STR_LENGTH+1)) * numObjs)()
+    for i in range(numObjs):
+      obj_name_ptrs[i] = pointer(create_string_buffer(MAX_STR_LENGTH+1))
+    EXODUS_LIB.ex_get_names(self.fileId,obj_type,byref(obj_name_ptrs))
+    obj_names = []
+    for onp in obj_name_ptrs: 
+      obj_names.append(onp.contents.value)
+    return obj_names
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_names(self,objType,inqType,objNames):
+    num_objs = c_int(self.__ex_inquire_int(inqType))
+    numObjs = num_objs.value
+    assert numObjs == len(objNames)
+    obj_name_ptrs = (POINTER(c_char * (MAX_STR_LENGTH+1)) * numObjs)()
+    obj_type = c_int(objType)
+    for i in range(numObjs):
+      obj_name_ptrs[i] = pointer(create_string_buffer(objNames[i],MAX_STR_LENGTH+1))
+    EXODUS_LIB.ex_put_names(self.fileId,obj_type,byref(obj_name_ptrs))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_blk_ids(self):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      self.elemBlkIds = (c_longlong * self.numElemBlk.value)()
+    else:
+      self.elemBlkIds = (c_int * self.numElemBlk.value)()
+    if self.numElemBlk.value > 0:
+      EXODUS_LIB.ex_get_elem_blk_ids(self.fileId,byref(self.elemBlkIds))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_side_set_ids(self):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      self.sideSetIds = (c_longlong * self.numSideSets.value)()
+    else:
+      self.sideSetIds = (c_int * self.numSideSets.value)()
+    if self.num_side_sets() > 0:
+      EXODUS_LIB.ex_get_side_set_ids(self.fileId,byref(self.sideSetIds))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_node_set_ids(self):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      self.nodeSetIds = (c_longlong * self.numNodeSets.value)()
+    else:
+      self.nodeSetIds = (c_int * self.numNodeSets.value)()
+    if self.num_node_sets() > 0:
+      EXODUS_LIB.ex_get_node_set_ids(self.fileId,byref(self.nodeSetIds))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_node_set_param(self, nodeSetId):
+    node_set_id = c_longlong(nodeSetId)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      num_set_nodes      = c_longlong(0)
+      num_set_dist_facts = c_longlong(0)
+    else:
+      num_set_nodes      = c_int(0)
+      num_set_dist_facts = c_int(0)
+    EXODUS_LIB.ex_get_node_set_param(self.fileId,node_set_id,byref(num_set_nodes),byref(num_set_dist_facts))
+    return (int(num_set_nodes.value),int(num_set_dist_facts.value))
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_node_set_param(self,nodeSetId,numNodes,numDistFacts):
+    node_set_id        = c_longlong(nodeSetId)
+    num_set_nodes      = c_longlong(numNodes)
+    num_set_dist_facts = c_longlong(numDistFacts)
+    EXODUS_LIB.ex_put_node_set_param(self.fileId,node_set_id,num_set_nodes,num_set_dist_facts)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_node_set(self, nodeSetId):
+    node_set_id = c_longlong(nodeSetId)
+    num_node_set_nodes = self.__ex_get_node_set_param(nodeSetId)[0]
+    if num_node_set_nodes == 0:
+      return []
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      set_nodes = (c_longlong * num_node_set_nodes)()
+    else:
+      set_nodes = (c_int * num_node_set_nodes)()
+    EXODUS_LIB.ex_get_node_set(self.fileId,node_set_id,byref(set_nodes))
+    return set_nodes
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_node_set(self,nodeSetId,nodeSetNodes):
+    node_set_id    = c_longlong(nodeSetId)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      node_set_nodes = (c_longlong * len(nodeSetNodes))()
+      for i in range(len(nodeSetNodes)):
+        node_set_nodes[i] = c_longlong(nodeSetNodes[i])
+    else:
+      node_set_nodes = (c_int * len(nodeSetNodes))()
+      for i in range(len(nodeSetNodes)):
+        node_set_nodes[i] = c_int(nodeSetNodes[i])
+    EXODUS_LIB.ex_put_node_set(self.fileId,node_set_id,node_set_nodes)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_node_set_dist_fact(self, nodeSetId):
+    node_set_id = c_longlong(nodeSetId)
+    num_node_set_nodes = self.__ex_get_node_set_param(nodeSetId)[0]
+    set_dfs = (c_double * num_node_set_nodes)()
+    EXODUS_LIB.ex_get_node_set_dist_fact(self.fileId,node_set_id,byref(set_dfs))
+    return set_dfs
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_node_set_dist_fact(self,nodeSetId,nodeSetDistFact):
+    node_set_id        = c_longlong(nodeSetId)
+    node_set_dist_fact = (c_double * len(nodeSetDistFact))()
+    for i in range(len(nodeSetDistFact)):
+      node_set_dist_fact[i] = c_double(nodeSetDistFact[i])
+    EXODUS_LIB.ex_put_node_set_dist_fact(self.fileId,node_set_id,node_set_dist_fact)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_nset_var(self,timeStep,varId,id):
+    step        = c_int(timeStep)
+    var_id      = c_int(varId)
+    node_set_id = c_longlong(id)
+    (numNodeInSet,numDistFactInSet) = self.__ex_get_node_set_param(id)
+    num_node_in_set = c_longlong(numNodeInSet)
+    ns_var_vals = (c_double * numNodeInSet)()
+    EXODUS_LIB.ex_get_nset_var(self.fileId,step,var_id,node_set_id,num_node_in_set,ns_var_vals)
+    return list(ns_var_vals)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_nset_var_tab(self):
+    self.__ex_get_node_set_ids()
+    node_set_count = c_int(len(self.nodeSetIds))
+    variable_count = self.__ex_get_var_param("m")
+    truth_table = (c_int * (node_set_count.value * variable_count.value))()
+    EXODUS_LIB.ex_get_nset_var_tab(self.fileId,
+                                   node_set_count,
+                                   variable_count,
+                                   byref(truth_table))
+    truthTab = []
+    for val in truth_table:
+      if val:
+        truthTab.append(True)
+      else:
+        truthTab.append(False)
+    return truthTab
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_nset_var_tab(self,truthTab):
+    self.__ex_get_node_set_ids()
+    num_blks = c_int(len(self.nodeSetIds))
+    num_vars = self.__ex_get_var_param("m")
+    truth_tab = (c_int * (num_blks.value*num_vars.value))()
+    for i in xrange(len(truthTab)):
+      boolVal = truthTab[i]
+      if boolVal: 
+        truth_tab[i] = c_int(1)
+      else: 
+        truth_tab[i] = c_int(0)
+    EXODUS_LIB.ex_put_nset_var_tab(self.fileId,num_blks,num_vars,truth_tab)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_nset_var(self,timeStep,varId,id,values):
+    step        = c_int(timeStep)
+    var_id      = c_int(varId)
+    node_set_id = c_longlong(id)
+    (numNodeInSet,numDistFactInSet) = self.__ex_get_node_set_param(id)
+    num_node_in_set = c_longlong(numNodeInSet)
+    ns_var_vals = (c_double * numNodeInSet)()
+    for i in range(numNodeInSet):
+      ns_var_vals[i] = float(values[i])
+    EXODUS_LIB.ex_put_nset_var(self.fileId,step,var_id,node_set_id,num_node_in_set,ns_var_vals)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_coord(self):
+    self.coordsX = (c_double * self.numNodes.value)()
+    self.coordsY = (c_double * self.numNodes.value)()
+    self.coordsZ = (c_double * self.numNodes.value)()
+    EXODUS_LIB.ex_get_coord(self.fileId,byref(self.coordsX),byref(self.coordsY),byref(self.coordsZ))
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_coord(self,xCoords,yCoords,zCoords):
+    self.coordsX = (c_double * self.numNodes.value)()
+    self.coordsY = (c_double * self.numNodes.value)()
+    self.coordsZ = (c_double * self.numNodes.value)()
+    for i in range(self.numNodes.value):
+      self.coordsX[i] = float(xCoords[i])
+      self.coordsY[i] = float(yCoords[i])
+      self.coordsZ[i] = float(zCoords[i])
+    EXODUS_LIB.ex_put_coord(self.fileId,byref(self.coordsX),byref(self.coordsY),byref(self.coordsZ))
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_n_coord(self,startNodeId,numNodes):
+    start_node_num = c_longlong(startNodeId)
+    num_nodes      = c_longlong(numNodes)
+    coordsX        = (c_double * numNodes)()
+    coordsY        = (c_double * numNodes)()
+    coordsZ        = (c_double * numNodes)()
+    EXODUS_LIB.ex_get_n_coord(self.fileId,start_node_num,num_nodes,byref(coordsX),byref(coordsY),byref(coordsZ))
+    return list(coordsX),list(coordsY),list(coordsZ)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_id_map(self,objType,inqType):
+    obj_type = c_int(objType)
+    num_objs = c_int(self.__ex_inquire_int(inqType))
+    numObjs = num_objs.value
+    id_map = []
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      id_map = (c_longlong * numObjs)()
+    else:
+      id_map = (c_int * numObjs)()
+    EXODUS_LIB.ex_get_id_map(self.fileId,obj_type,byref(id_map))
+    idMap = []
+    for i in xrange(numObjs):
+      idMap.append(id_map[i])
+    return idMap
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_id_map(self,objType,inqType,map):
+    obj_type = c_int(objType)
+    num_objs = c_int(self.__ex_inquire_int(inqType))
+    numObjs = num_objs.value
+    assert numObjs == len(map)
+    id_map = []
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      id_map = (c_longlong * numObjs)()
+      for i in xrange(numObjs):
+        id_map[i] = c_longlong( map[i] )
+    else:
+      id_map = (c_int * numObjs)()
+      for i in xrange(numObjs):
+        id_map[i] = c_int( map[i] )
+    EXODUS_LIB.ex_put_id_map(self.fileId,obj_type,byref(id_map))
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_num_map(self):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_MAPS_INT64_API):
+      elemNumMap = (c_longlong * self.numElem.value)()
+    else:
+      elemNumMap = (c_int * self.numElem.value)()
+    EXODUS_LIB.ex_get_elem_num_map(self.fileId,byref(elemNumMap))
+    return elemNumMap
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_node_num_map(self):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_MAPS_INT64_API):
+      nodeNumMap = (c_longlong * self.numNodes.value)()
+    else:
+      nodeNumMap = (c_int * self.numNodes.value)()
+    EXODUS_LIB.ex_get_node_num_map(self.fileId,byref(nodeNumMap))
+    return nodeNumMap
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_order_map(self):
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_MAPS_INT64_API):
+      elemOrderMap = (c_longlong * self.numElem.value)()
+    else:
+      elemOrderMap = (c_int * self.numElem.value)()
+    EXODUS_LIB.ex_get_map(self.fileId,byref(elemOrderMap))
+    return elemOrderMap
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_block(self,id):
+    elem_block_id = c_longlong(id)
+    elem_type = create_string_buffer(MAX_STR_LENGTH+1) 
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      num_elem_this_blk  = c_longlong(0)
+      num_nodes_per_elem = c_longlong(0)
+      num_attr           = c_longlong(0)
+    else:
+      num_elem_this_blk  = c_int(0)
+      num_nodes_per_elem = c_int(0)
+      num_attr           = c_int(0)
+    EXODUS_LIB.ex_get_elem_block(self.fileId,elem_block_id,elem_type,
+                                 byref(num_elem_this_blk),byref(num_nodes_per_elem),\
+                                 byref(num_attr))
+    return(elem_type,num_elem_this_blk,num_nodes_per_elem,num_attr)
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_elem_block(self,id,eType,numElems,numNodesPerElem,numAttrsPerElem):
+    elem_block_id      = c_longlong(id)
+    elem_type          = create_string_buffer(eType.upper(),MAX_STR_LENGTH+1)
+    num_elem_this_blk  = c_longlong(numElems)
+    num_nodes_per_elem = c_longlong(numNodesPerElem)
+    num_attr           = c_longlong(numAttrsPerElem)
+    EXODUS_LIB.ex_put_elem_block(self.fileId,elem_block_id,elem_type,
+                                 num_elem_this_blk,num_nodes_per_elem,
+                                 num_attr)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_conn(self,id):
+    (elem_type,num_elem_this_blk,num_nodes_per_elem,num_attr) = self.__ex_get_elem_block(id)
+    elem_block_id = c_longlong(id)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      elem_block_connectivity = (c_longlong * (num_elem_this_blk.value * num_nodes_per_elem.value))()
+    else:
+      elem_block_connectivity = (c_int * (num_elem_this_blk.value * num_nodes_per_elem.value))()
+    EXODUS_LIB.ex_get_elem_conn(self.fileId,elem_block_id,byref(elem_block_connectivity))
+    return (elem_block_connectivity,num_elem_this_blk,num_nodes_per_elem)
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_elem_conn(self,id,connectivity):
+    (elem_type,num_elem_this_blk,num_nodes_per_elem,num_attr) = self.__ex_get_elem_block(id)
+    elem_block_id = c_longlong(id)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      elem_block_connectivity = (c_longlong * (num_elem_this_blk.value * num_nodes_per_elem.value))()
+      for i in range(num_elem_this_blk.value * num_nodes_per_elem.value):
+        elem_block_connectivity[i] = c_longlong(connectivity[i])
+    else:
+      elem_block_connectivity = (c_int * (num_elem_this_blk.value * num_nodes_per_elem.value))()
+      for i in range(num_elem_this_blk.value * num_nodes_per_elem.value):
+        elem_block_connectivity[i] = c_int(connectivity[i])
+    EXODUS_LIB.ex_put_elem_conn(self.fileId,elem_block_id,elem_block_connectivity)
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_elem_attr(self,elemBlkID,Attr):
+    elem_blk_id = c_longlong(elemBlkID)
+    attrib = (c_double * len(Attr))()
+    for i in range(len(Attr)):
+      attrib[i] = c_double(Attr[i])
+    EXODUS_LIB.ex_put_elem_attr(self.fileId,elem_blk_id,attrib)
+  
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_attr(self,elemBlkID):
+    elem_blk_id = c_longlong(elemBlkID)
+    numAttrThisBlk = self.num_attr(elemBlkID)
+    numElemsThisBlk = self.num_elems_in_blk(elemBlkID)
+    totalAttr = numAttrThisBlk*numElemsThisBlk
+    attrib = (c_double * totalAttr)()
+    EXODUS_LIB.ex_get_elem_attr(self.fileId,elem_blk_id,byref(attrib))
+    return attrib
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_var_param(self,varChar):
+    assert varChar.lower() in 'ngems'
+    var_char = c_char(varChar)
+    num_vars = c_int()
+    EXODUS_LIB.ex_get_var_param(self.fileId,byref(var_char),byref(num_vars))
+    return num_vars
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_var_names(self,varChar):
+    assert varChar.lower() in 'ngems'
+    var_char = c_char(varChar)
+    num_vars = self.__ex_get_var_param(varChar)
+    var_name_ptrs = (POINTER(c_char * (MAX_STR_LENGTH+1)) * num_vars.value)()
+    for i in range(num_vars.value):
+      var_name_ptrs[i] = pointer(create_string_buffer(MAX_STR_LENGTH+1))
+    EXODUS_LIB.ex_get_var_names(self.fileId,byref(var_char),num_vars,byref(var_name_ptrs))
+    var_names = []
+    for vnp in var_name_ptrs: var_names.append(vnp.contents.value)
+    return var_names
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_var_tab(self):
+    self.__ex_get_elem_blk_ids()
+    num_blks = c_int(len(self.elemBlkIds))
+    num_vars = self.__ex_get_var_param("e")
+    truth_tab = (c_int * (num_blks.value * num_vars.value))()
+    EXODUS_LIB.ex_get_elem_var_tab(self.fileId, num_blks, num_vars, byref(truth_tab))
+    truthTab = []
+    for val in truth_tab:
+      if val:
+        truthTab.append(True)
+      else:
+        truthTab.append(False)
+    return truthTab
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_elem_var_tab(self,truthTab):
+    self.__ex_get_elem_blk_ids()
+    num_blks = c_int(len(self.elemBlkIds))
+    num_vars = self.__ex_get_var_param("e")
+    truth_tab = (c_int * (num_blks.value*num_vars.value))()
+    for i in xrange(len(truthTab)):
+      boolVal = truthTab[i]
+      if boolVal: 
+        truth_tab[i] = c_int(1)
+      else: 
+        truth_tab[i] = c_int(0)
+    EXODUS_LIB.ex_put_elem_var_tab(self.fileId,num_blks,num_vars,truth_tab)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_var(self,timeStep,varType,varId,blkId,numValues):
+    step = c_int(timeStep)
+    var_type = c_int(varType)
+    var_id   = c_int(varId)
+    block_id = c_longlong(blkId)
+    num_values = c_longlong(numValues)
+    var_vals = (c_double * num_values.value)()
+    EXODUS_LIB.ex_get_var(self.fileId,step,var_type,var_id,block_id,num_values,var_vals)
+    return var_vals
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_var(self,timeStep,varType,varId,blkId,numValues,values):
+    step = c_int(timeStep)
+    var_type = c_int(varType)
+    var_id   = c_int(varId)
+    block_id = c_longlong(blkId)
+    num_values = c_longlong(numValues)
+    var_vals = (c_double * num_values.value)()
+    for i in range(num_values.value):
+      var_vals[i] = float(values[i])
+    EXODUS_LIB.ex_put_var(self.fileId,step,var_type,var_id,block_id,num_values,var_vals)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_side_set_node_list_len(self,id):
+    side_set_id = c_longlong(id)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      side_set_node_list_len = c_longlong(0)
+    else:
+      side_set_node_list_len = c_int(0)
+    EXODUS_LIB.ex_get_side_set_node_list_len(self.fileId,side_set_id,byref(side_set_node_list_len))
+    return side_set_node_list_len
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_side_set_param(self,id):
+    side_set_id = c_longlong(id)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      num_side_in_set      = c_longlong(0)
+      num_dist_fact_in_set = c_longlong(0)
+    else:
+      num_side_in_set      = c_int(0)
+      num_dist_fact_in_set = c_int(0)
+    EXODUS_LIB.ex_get_side_set_param(self.fileId,side_set_id,byref(num_side_in_set),\
+                                     byref(num_dist_fact_in_set))
+    return (int(num_side_in_set.value),int(num_dist_fact_in_set.value))
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_side_set_param(self,id,numSides,numDistFacts):
+    side_set_id          = c_longlong(id)
+    num_side_in_set      = c_longlong(numSides)
+    num_dist_fact_in_set = c_longlong(numDistFacts)
+    EXODUS_LIB.ex_put_side_set_param(self.fileId,side_set_id,num_side_in_set,num_dist_fact_in_set)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_side_set(self,sideSetId):
+    side_set_id = c_longlong(sideSetId)
+    (num_side_in_set,num_dist_fact_in_set) = self.__ex_get_side_set_param(sideSetId)
+    if num_side_in_set == 0:
+      return ([], [])
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      side_set_elem_list = (c_longlong * num_side_in_set)()
+      side_set_side_list = (c_longlong * num_side_in_set)()
+    else:
+      side_set_elem_list = (c_int * num_side_in_set)()
+      side_set_side_list = (c_int * num_side_in_set)()
+    EXODUS_LIB.ex_get_side_set(self.fileId,side_set_id,\
+                               byref(side_set_elem_list),\
+                               byref(side_set_side_list) )
+    return (side_set_elem_list,side_set_side_list)
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_side_set(self,id,sideSetElements,sideSetSides):
+    side_set_id = c_longlong(id)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      side_set_elem_list = (c_longlong * len(sideSetElements))()
+      side_set_side_list = (c_longlong * len(sideSetSides))()
+      for i in range(len(sideSetElements)):
+        side_set_elem_list[i] = c_longlong(sideSetElements[i])
+        side_set_side_list[i] = c_longlong(sideSetSides[i])
+    else:
+      side_set_elem_list = (c_int * len(sideSetElements))()
+      side_set_side_list = (c_int * len(sideSetSides))()
+      for i in range(len(sideSetElements)):
+        side_set_elem_list[i] = c_int(sideSetElements[i])
+        side_set_side_list[i] = c_int(sideSetSides[i])
+    EXODUS_LIB.ex_put_side_set(self.fileId,side_set_id,side_set_elem_list,side_set_side_list)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_sset_var_tab(self):
+    self.__ex_get_side_set_ids()
+    side_set_count = c_int(len(self.sideSetIds))
+    variable_count = self.__ex_get_var_param("s")
+    truth_table = (c_int * (side_set_count.value * variable_count.value))()
+    EXODUS_LIB.ex_get_sset_var_tab(self.fileId,
+                                   side_set_count,
+                                   variable_count,
+                                   byref(truth_table))
+    truthTab = []
+    for val in truth_table:
+      if val:
+        truthTab.append(True)
+      else:
+        truthTab.append(False)
+    return truthTab
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_sset_var_tab(self,truthTab):
+    self.__ex_get_side_set_ids()
+    num_blks = c_int(len(self.sideSetIds))
+    num_vars = self.__ex_get_var_param("s")
+    truth_tab = (c_int * (num_blks.value*num_vars.value))()
+    for i in xrange(len(truthTab)):
+      boolVal = truthTab[i]
+      if boolVal: 
+        truth_tab[i] = c_int(1)
+      else: 
+        truth_tab[i] = c_int(0)
+    EXODUS_LIB.ex_put_sset_var_tab(self.fileId,num_blks,num_vars,truth_tab)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_side_set_dist_fact(self, sideSetId):
+    side_set_id = c_longlong(sideSetId)
+    side_set_node_list_len = self.__ex_get_side_set_node_list_len(sideSetId)
+    set_dfs = (c_double * side_set_node_list_len.value)()
+    EXODUS_LIB.ex_get_side_set_dist_fact(self.fileId,side_set_id,byref(set_dfs))
+    return set_dfs
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_side_set_dist_fact(self,sideSetId,sideSetDistFact):
+    side_set_id = c_longlong(sideSetId)
+    side_set_dist_fact = (c_double * len(sideSetDistFact))()
+    for i in range(len(sideSetDistFact)):
+      side_set_dist_fact[i] = c_double(sideSetDistFact[i])
+    EXODUS_LIB.ex_put_side_set_dist_fact(self.fileId,side_set_id,side_set_dist_fact)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_side_set_node_list(self,id):
+    side_set_id = c_longlong(id)
+    side_set_node_list_len = self.__ex_get_side_set_node_list_len(id)
+    (num_side_in_set,num_dist_fact_in_set) = self.__ex_get_side_set_param(id)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_BULK_INT64_API):
+      side_set_node_cnt_list = (c_longlong * num_side_in_set)()
+      side_set_node_list     = (c_longlong * side_set_node_list_len.value)()
+    else:
+      side_set_node_cnt_list = (c_int * num_side_in_set)()
+      side_set_node_list     = (c_int * side_set_node_list_len.value)()
+    EXODUS_LIB.ex_get_side_set_node_list(self.fileId,side_set_id,\
+                                         byref(side_set_node_cnt_list),\
+                                         byref(side_set_node_list) )
+    return (side_set_node_cnt_list,side_set_node_list)
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_sset_var(self,timeStep,varId,id):
+    step        = c_int(timeStep)
+    var_id      = c_int(varId)
+    side_set_id = c_longlong(id)
+    (numSideInSet,numDistFactInSet) = self.__ex_get_side_set_param(id)
+    ss_var_vals = (c_double * numSideInSet)()
+    num_side_in_set = c_longlong(numSideInSet)
+    EXODUS_LIB.ex_get_sset_var(self.fileId,step,var_id,side_set_id,num_side_in_set,ss_var_vals)
+    return ss_var_vals
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_sset_var(self,timeStep,varId,id,values):
+    step        = c_int(timeStep)
+    var_id      = c_int(varId)
+    side_set_id = c_longlong(id)
+    (numSideInSet,numDistFactInSet) = self.__ex_get_side_set_param(id)
+    num_side_in_set = c_longlong(numSideInSet)
+    ss_var_vals = (c_double * numSideInSet)()
+    for i in range(numSideInSet):
+      ss_var_vals[i] = float(values[i])
+    EXODUS_LIB.ex_put_sset_var(self.fileId,step,var_id,side_set_id,num_side_in_set,ss_var_vals)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_variable_param(self,varType):
+    var_type = c_int(varType)
+    num_vars = c_int(0)
+    EXODUS_LIB.ex_get_variable_param(self.fileId,var_type,byref(num_vars))
+    return num_vars
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_variable_param(self,varType,numVars):
+    var_type = c_int(varType)
+    num_vars = c_int(numVars)
+    current_num = self.__ex_get_variable_param(varType)
+    if current_num.value == num_vars.value:
+      ##print "value already set"
+      return True
+    errorInt = EXODUS_LIB.ex_put_variable_param(self.fileId,var_type,num_vars)
+    if errorInt != 0:
+      print "ERROR code =", errorInt
+      raise Exception, ("ERROR: ex_put_variable_param had problems. This can only be called once per varType.")
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_variable_name(self,varType,varId):
+    var_type = c_int(varType)
+    var_id   = c_int(varId)
+    name = create_string_buffer(MAX_STR_LENGTH+1)
+    EXODUS_LIB.ex_get_variable_name(self.fileId,var_type,var_id,name)
+    return name
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_variable_name(self,varType,varId,varName):
+    var_type = c_int(varType)
+    var_id   = c_int(varId)
+    name = create_string_buffer(varName,MAX_STR_LENGTH+1)
+    EXODUS_LIB.ex_put_variable_name(self.fileId,var_type,var_id,name)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_elem_attr_names(self,blkId):
+    object_id = c_int(blkId)
+    num_attr = c_int(self.num_attr(blkId))
+    len_name = self.__ex_inquire_int(ex_inquiry("EX_INQ_READ_NAME_LENGTH"))
+    attr_name_ptrs = (POINTER(c_char * (len_name+1)) * num_attr.value)() 
+    for i in range(num_attr.value): 
+      attr_name_ptrs[i] = pointer(create_string_buffer(len_name+1)) 
+    EXODUS_LIB.ex_get_elem_attr_names(self.fileId,object_id,byref(attr_name_ptrs)) 
+    attr_names = []
+    for cnp in attr_name_ptrs: attr_names.append(cnp.contents.value)
+    return attr_names
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_elem_attr_names(self,blkId,varNames):
+    object_id = c_int(blkId)
+    num_attr = c_int(self.num_attr(blkId))
+    len_name = self.__ex_inquire_int(ex_inquiry("EX_INQ_READ_NAME_LENGTH"))
+    attr_name_ptrs = (POINTER(c_char * (len_name+1)) * num_attr.value)()
+    assert len(varNames) == num_attr.value
+    for i in range(num_attr.value):
+      attr_name_ptrs[i] = pointer(create_string_buffer(varNames[i],len_name+1))
+    EXODUS_LIB.ex_put_elem_attr_names(self.fileId,object_id,byref(attr_name_ptrs))
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_prop_names(self,varType,inqType):
+    var_type = c_int(varType)
+    num_props = c_int(self.__ex_inquire_int(ex_inquiry(inqType)))
+    prop_name_ptrs = (POINTER(c_char * (MAX_STR_LENGTH+1)) * num_props.value)() 
+    for i in range(num_props.value): 
+      prop_name_ptrs[i] = pointer(create_string_buffer(MAX_STR_LENGTH+1)) 
+    EXODUS_LIB.ex_get_prop_names(self.fileId,var_type,byref(prop_name_ptrs)) 
+    prop_names = []
+    for cnp in prop_name_ptrs: prop_names.append(cnp.contents.value)
+    return prop_names
+
+  # --------------------------------------------------------------------
+
+  def __ex_get_prop(self,objType,objId,propName):
+    obj_type = c_int(objType)
+    obj_id = c_longlong(objId)
+    prop_name = create_string_buffer(propName,MAX_STR_LENGTH+1)
+    if (EXODUS_LIB.ex_int64_status(self.fileId) & EX_IDS_INT64_API):
+      prop_val = c_longlong(0)
+    else:
+      prop_val = c_int(0)
+    EXODUS_LIB.ex_get_prop(self.fileId,obj_type,obj_id,byref(prop_name),byref(prop_val))
+    return prop_val.value
+
+  # --------------------------------------------------------------------
+
+  def __ex_put_prop(self,objType,objId,propName,propVal):
+    obj_type  = c_int(objType)
+    obj_id    = c_longlong(objId)
+    prop_name = create_string_buffer(propName,MAX_STR_LENGTH+1)
+    prop_val  = c_longlong(propVal)
+    EXODUS_LIB.ex_put_prop(self.fileId,obj_type,obj_id,byref(prop_name),prop_val)
+    return True
+
+  # --------------------------------------------------------------------
+
+  def __ex_update(self):
+    EXODUS_LIB.ex_update(self.fileId)
+    return True
+
+# --------------------------------------------------------------------
+# Utility Functions
+# --------------------------------------------------------------------
+
+def collectElemConnectivity(exodusHandle,connectivity):
+  """
+    This function generates a list of lists that represent the element connectivity.
+
+    Usage:
+
+    exodusHandle = exodus("file.g","r")
+    connectivity = []
+    collectElemConnectivity(exodusHandle,connectivity)
+    
+    exodusHandle.close()
+  """
+
+  if type(connectivity) is not list:
+    raise Exception, ("ERROR: connectivity is not a list in call to collectElemConnectivity().")
+  if connectivity:
+    raise Exception, ("ERROR: connectivity is not empty in call to collectElemConnectivity().")
+
+  blockIds = exodusHandle.get_elem_blk_ids()
+  for blId in blockIds:
+    (elem_block_conn,num_elem,num_nodes) = exodusHandle.get_elem_connectivity(blId)
+    for k in range(num_elem):
+      i = k * num_nodes
+      j = i + num_nodes
+      local_elem_conn = elem_block_conn[i:j]
+      connectivity.append( local_elem_conn )
+
+# --------------------------------------------------------------------
+
+def collectLocalNodeToLocalElems(exodusHandle,connectivity,localNodeToLocalElems):
+  """
+    This function generates a list of lists to go from local node id
+    to local elem id.
+
+    Usage:
+
+    exodusHandle = exodus("file.g","r")
+    connectivity = [] ## If this is not empty it will assume it is already filled.
+    localNodeToLocalElems = []
+    collectLocalNodeToLocalElems(exodusHandle,connectivity,localNodeToLocalElems)
+    
+    exodusHandle.close()
+  """
+
+  if type(connectivity) is not list:
+    raise Exception, ("ERROR: connectivity is not a list in call to collectLocalNodeToLocalElems().")
+  if type(localNodeToLocalElems) is not list:
+    raise Exception, ("ERROR: localNodeToLocalElems is not a list in call to collectLocalNodeToLocalElems().")
+  if localNodeToLocalElems:
+    raise Exception, ("ERROR: localNodeToLocalElems is not empty in call to collectLocalNodeToLocalElems().")
+
+  if not connectivity:
+    collectElemConnectivity(exodusHandle,connectivity)
+
+  numNodes = exodusHandle.num_nodes()
+  for i in range(numNodes+1):
+    localNodeToLocalElems.append([])
+  localElemId = 0
+  for local_elem_conn in connectivity:
+    for n in local_elem_conn:
+      localNodeToLocalElems[n].append(localElemId)
+    localElemId = localElemId + 1
+
+# --------------------------------------------------------------------
+
+def collectLocalElemToLocalElems(exodusHandle,connectivity,localNodeToLocalElems,localElemToLocalElems):
+  """
+    This function generates a list of lists to go from local elem id
+    to connected local elem ids.
+
+    Usage:
+
+    exodusHandle = exodus("file.g","r")
+    connectivity = [] ## If this is not empty it will assume it is already filled.
+    localNodeToLocalElems = [] ## If this is not empty it will assume it is already filled.
+    localElemToLocalElems = []
+    collectLocalElemToLocalElems(exodusHandle,connectivity,localNodeToLocalElems,localElemToLocalElems)
+    
+    exodusHandle.close()
+  """
+
+  if type(connectivity) is not list:
+    raise Exception, ("ERROR: connectivity is not a list in call to collectLocalElemToLocalElems().")
+  if type(localNodeToLocalElems) is not list:
+    raise Exception, ("ERROR: localNodeToLocalElems is not a list in call to collectLocalElemToLocalElems().")
+  if type(localElemToLocalElems) is not list:
+    raise Exception, ("ERROR: localElemToLocalElems is not a list in call to collectLocalElemToLocalElems().")
+  if localElemToLocalElems:
+    raise Exception, ("ERROR: localElemToLocalElems is not empty in call to collectLocalElemToLocalElems().")
+
+  if not connectivity:
+    collectElemConnectivity(exodusHandle,connectivity)
+  if not localNodeToLocalElems:
+    collectLocalNodeToLocalElems(exodusHandle,connectivity,localNodeToLocalElems)
+
+  numElems = exodusHandle.num_elems()
+  for i in range(numElems):
+    localElemToLocalElems.append([])
+  for localElemId in range(numElems):
+    nodeList = list(connectivity[localElemId])
+    newConnectedElems = []
+    for n in nodeList:
+      for elem in localNodeToLocalElems[n]:
+        newConnectedElems.append( elem )
+    localElemToLocalElems[localElemId] = list( set(newConnectedElems) )
+
+# --------------------------------------------------------------------
+
+def copy_mesh(fromFileName, toFileName, exoFromObj = None, array_type = 'ctype'):
+  """
+    This function creates an exodus file toFileName and copies only the mesh
+    data from exodus file fromFileName, returning a file handle to toFileName.
+    The user can either supply an exodus filename (fromFileName) or an exodus
+    object (exoFromObj) to copy the mesh data from.
+  """
+  debugPrint = False
+  
+  #If the user did not supply a exodus object to copy from, attempt to read an
+  #exodus database with the name "fromFileName"
+  if exoFromObj is None:
+    exoFrom = exodus(fromFileName,"r", array_type = array_type)
+  else:
+    exoFrom = exoFromObj
+  
+  if ( os.path.isfile(toFileName) ):
+    raise Exception, ("ERROR: ", toFileName, " file already exists cowardly exiting instead of overwriting in call to copy_mesh().")
+
+  title = exoFrom.title()
+  numDim = exoFrom.num_dimensions()
+  numNodes = exoFrom.num_nodes()
+  numElems = exoFrom.num_elems()
+  numBlks = exoFrom.num_blks()
+  numNodeSets = exoFrom.num_node_sets()
+  numSideSets = exoFrom.num_side_sets()
+    
+  exoTo = exodus( toFileName, mode = "w", array_type = array_type, \
+    title = title, numDims =numDim, \
+    numNodes = numNodes, numElems = numElems, numBlocks = numBlks, \
+    numNodeSets = numNodeSets, numSideSets = numSideSets )
+
+  if debugPrint: print "Transfer QA records"
+  qaRecords = exoFrom.get_qa_records()
+  exoTo.put_qa_records( qaRecords )
+
+  if debugPrint: print "Transfer Nodal Coordinates and Names"
+  exoTo.put_coord_names( exoFrom.get_coord_names() )
+  (xCoords,yCoords,zCoords) = exoFrom.get_coords()
+  exoTo.put_coords(xCoords,yCoords,zCoords)
+  
+  if debugPrint: print "Transfer Node Id Map"
+  nodeIdMap = exoFrom.get_node_id_map()
+  exoTo.put_node_id_map(nodeIdMap)
+  
+  if debugPrint: print "Transfer Element Data"
+  blkIds = exoFrom.get_elem_blk_ids()
+  for blkId in blkIds:
+    (elemType,numElem,nodesPerElem,numAttr) = exoFrom.elem_blk_info(blkId)
+    exoTo.put_elem_blk_info(blkId,elemType,numElem,nodesPerElem,numAttr)
+    (connectivity,numElem,nodesPerElem) = exoFrom.get_elem_connectivity(blkId)
+    exoTo.put_elem_connectivity(blkId,connectivity)
+    if numAttr > 0:
+      attrNames = exoFrom.get_element_attribute_names(blkId)
+      exoTo.put_element_attribute_names(blkId,attrNames)
+      exoTo.put_elem_attr(blkId, exoFrom.get_elem_attr(blkId))
+    elemProps = exoFrom.get_element_property_names()
+    for elemProp in elemProps:
+      propVal = exoFrom.get_element_property_value(blkId,elemProp)
+      if elemProp == "ID" and propVal == blkId:
+        continue
+      else:
+        exoTo.put_element_property_value(blkId,elemProp,propVal)
+    blockName = exoFrom.get_elem_blk_name(blkId)
+    exoTo.put_elem_blk_name(blkId,blockName)
+  
+  if debugPrint: print "Transfer Element Id Map"
+  elemIdMap = exoFrom.get_elem_id_map()
+  exoTo.put_elem_id_map(elemIdMap)
+  
+  if debugPrint: print "Transfer Node Sets"
+  if numNodeSets > 0:
+    nodeSetIds = exoFrom.get_node_set_ids()
+    for nsId in nodeSetIds:
+      (numSetNodes,numSetDistFacts) = exoFrom.get_node_set_params(nsId)
+      exoTo.put_node_set_params(nsId,numSetNodes,numSetDistFacts)
+      nsNodes = exoFrom.get_node_set_nodes(nsId)
+      exoTo.put_node_set(nsId,nsNodes)
+      if numSetDistFacts > 0:
+        nsDF = exoFrom.get_node_set_dist_facts(nsId)
+        exoTo.put_node_set_dist_fact(nsId,nsDF)
+      nodeSetName = exoFrom.get_node_set_name(nsId)
+      exoTo.put_node_set_name(nsId,nodeSetName)
+    nodeSetProps = exoFrom.get_node_set_property_names()
+    for nodeSetProp in nodeSetProps:
+      propVal = exoFrom.get_node_set_property_value(nsId,nodeSetProp)
+      if nodeSetProp == "ID" and propVal == nsId:
+        continue
+      else:
+        exoTo.put_node_set_property_value(nsId,nodeSetProp,propVal)
+  
+  if debugPrint: print "Transfer Side Sets"
+  if numSideSets > 0:
+    sideSetIds = exoFrom.get_side_set_ids()
+    for ssId in sideSetIds:
+      (numSetSides,numSetDistFacts) = exoFrom.get_side_set_params(ssId)
+      exoTo.put_side_set_params(ssId,numSetSides,numSetDistFacts)
+      (elemList,sideList) = exoFrom.get_side_set(ssId)
+      exoTo.put_side_set(ssId,elemList,sideList)
+      if numSetDistFacts > 0:
+        ssDF = exoFrom.get_side_set_dist_fact(ssId)
+        exoTo.put_side_set_dist_fact(ssId,ssDF)
+      sideSetName = exoFrom.get_side_set_name(ssId)
+      exoTo.put_side_set_name(ssId,sideSetName)
+    sideSetProps = exoFrom.get_side_set_property_names()
+    for sideSetProp in sideSetProps:
+      propVal = exoFrom.get_side_set_property_value(ssId,sideSetProp)
+      if sideSetProp == "ID" and propVal == ssId:
+        continue
+      else:
+        exoTo.put_side_set_property_value(ssId,sideSetProp,propVal)
+  
+  #If the user did not supply an exodus object to copy from, then close the
+  #database.
+  if exoFromObj is None:
+    exoFrom.close()
+        
+  return(exoTo)
+
+def transfer_variables(exoFrom, exoTo, array_type = 'ctype', 
+  additionalGlobalVariables=[], additionalNodalVariables=[], \
+  additionalElementVariables=[]):
+  """
+    This function transfers variables from exoFrom to exoTo and allows 
+    additional variables to be added with additionalGlobalVariables,
+    additionalNodalVariables, and additionalElementVariables.  Additional
+    variables values are set to their defaults so that the user can populate 
+    them later.
+    
+    exoFrom: exodus object to transfer from
+
+    exoTo: exodus object to transfer to
+
+    additionalGlobalVariables: list of global variable names to add.
+
+    additionalNodalVaraibles: list of nodal variable names to add.
+
+    additionalElementVariables: should be a list of element variable names to add to all blocks or
+                                tuples ( name, blkIds ) where name is the element variable to add
+                                and blkIds is a list of blkIds to add it to.
+  """
+  ## IDEA: It may make sense to make transfer_variables() strictly transfer
+  ## variables, and use add_variables() to add new variables.
+  
+  debugPrint = False 
+  
+  if type(additionalGlobalVariables) is not list:
+    raise Exception, ("ERROR: additionalGlobalVariables is not a list.")
+  if type(additionalNodalVariables) is not list:
+    raise Exception, ("ERROR: additionalNodalVariables is not a list.")
+  if type(additionalElementVariables) is not list:
+    raise Exception, ("ERROR: additionalElementVariables is not a list.")
+  
+  if debugPrint: print "Transfer Info records"
+  numInfoRecs = exoFrom.num_info_records()
+  if numInfoRecs > 0:
+    infoRecs = exoFrom.get_info_records()
+    exoTo.put_info_records( infoRecs )
+  if debugPrint: print "Transfer time values"
+  nSteps = exoFrom.num_times()
+  timeVals = exoFrom.get_times()
+  for step in xrange(nSteps):
+    exoTo.put_time( step+1, timeVals[step] )
+    
+  if debugPrint: print "Add Global Variables"
+  nNewGlobalVars = len(additionalGlobalVariables)
+  nGlobalVars = exoFrom.get_global_variable_number() + nNewGlobalVars
+  defaultNewVarVals = []
+  for i in xrange(nNewGlobalVars):
+    defaultNewVarVals.append(0.0)
+  if nGlobalVars > 0:
+    exoTo.set_global_variable_number(nGlobalVars)
+    gVarNames = exoFrom.get_global_variable_names()
+    gVarNames.extend( additionalGlobalVariables )
+    for nameIndex in xrange(nGlobalVars):
+      globalVarName = gVarNames[nameIndex]
+      exoTo.put_global_variable_name(globalVarName,nameIndex+1)
+    for step in xrange(nSteps):
+      gValues = exoFrom.get_all_global_variable_values(step+1)
+      if array_type == 'numpy':
+        gValues = exoTo.np.append(gValues, defaultNewVarVals)
+      else:
+        gValues.extend( defaultNewVarVals )
+      exoTo.put_all_global_variable_values(step+1,gValues)
+  
+  if debugPrint: print "Add Nodal Variables"
+  nNewNodalVars = len(additionalNodalVariables)
+  nOrigNodalVars = exoFrom.get_node_variable_number()
+  nNodalVars = nOrigNodalVars + nNewNodalVars
+  if nNodalVars > 0:
+    exoTo.set_node_variable_number(nNodalVars)
+    nVarNames = exoFrom.get_node_variable_names()
+    nVarNames.extend( additionalNodalVariables )
+    for nameIndex in xrange(nNodalVars):
+      nodalVarName = nVarNames[nameIndex]
+      exoTo.put_node_variable_name(nodalVarName,nameIndex+1)
+      if nameIndex < nOrigNodalVars:
+        for step in xrange(nSteps):
+          nValues = exoFrom.get_node_variable_values(nodalVarName,step+1)
+          exoTo.put_node_variable_values(nodalVarName,step+1,nValues)
+  
+  if debugPrint: print "Construct Truth Table for additionalElementVariables"
+  blkIds = exoFrom.get_elem_blk_ids()
+  numBlks = exoFrom.num_blks()  
+  newElemVariableNames = []
+  newElemVariableBlocks = []
+  for item in additionalElementVariables:
+    if type(item) is tuple:
+      newElemVariableNames.append( item[0] )
+      inBlks = []
+      for blkId in item[1]:
+        if blkId in blkIds:
+          inBlks.append(blkId)
+      newElemVariableBlocks.append( inBlks )
+    elif type(item) is str:
+      newElemVariableNames.append( item )
+      newElemVariableBlocks.append( blkIds )
+    else:
+      print "Warning additionalElementVariable item ", item, " is not right type to add."
+      print "should be a string or tuple, skipping"
+  
+  if debugPrint: print "Add Element Variables"
+  nNewElemVars = len(newElemVariableNames)
+  nOrigElemVars = exoFrom.get_element_variable_number()
+  nElemVars = nOrigElemVars + nNewElemVars
+  if nElemVars > 0:
+    exoTo.set_element_variable_number(nElemVars)
+    origElemVarNames = exoFrom.get_element_variable_names()
+    eVarNames =  exoFrom.get_element_variable_names()
+    eVarNames.extend( newElemVariableNames )
+    truthTable = []
+    if nOrigElemVars > 0:
+      truthTable = exoFrom.get_element_variable_truth_table()
+    if nNewElemVars > 0:
+      newTruth = []
+      for j in xrange(numBlks):
+        for k in xrange(nOrigElemVars):
+          index = j*nOrigElemVars + k
+          newTruth.append( truthTable[index] )
+        for m in xrange(nNewElemVars):
+          if blkIds[j] in newElemVariableBlocks[m]:
+            newTruth.append(True)
+          else:
+            newTruth.append(False)
+      truthTable = newTruth
+    exoTo.set_element_variable_truth_table(truthTable)
+    for nameIndex in xrange(nElemVars):
+      elemVarName = eVarNames[nameIndex]
+      exoTo.put_element_variable_name(elemVarName,nameIndex+1)
+    truthIndex = 0
+    for blkId in blkIds:
+      for eVarName in origElemVarNames:
+        if truthTable[truthIndex]:
+          for step in xrange(nSteps):
+            eValues = exoFrom.get_element_variable_values(blkId,eVarName,step+1)
+            exoTo.put_element_variable_values(blkId,eVarName,step+1,eValues)
+        truthIndex = truthIndex + 1
+      truthIndex = truthIndex + nNewElemVars
+  
+  ## TODO: Transfer Nodeset Variables
+  
+  ## TODO: Transfer Sideset Variables
+  
+  return(exoTo)
+  
+def add_variables(exo, global_vars = [], nodal_vars = [], element_vars = [], \
+  array_type = 'ctype'):
+  """
+    This function adds variables to the exodus object.  The values of the variables 
+    are set to their defaults so that the user can populate them later.
+
+    exo: exodus database object
+    
+    global_vars: list of global variable names to add.
+
+    nodal_vars: list of nodal variable names to add.
+
+    element_vars: should be a list of element variable names to add to all blocks or
+                                tuples ( name, blkIds ) where name is the element variable to add
+                                and blkIds is a list of blkIds to add it to.
+  """
+  debugPrint = False 
+  
+  if type(global_vars) is not list:
+    raise Exception, ("ERROR: global_vars is not a list.")
+  if type(nodal_vars) is not list:
+    raise Exception, ("ERROR: nodal_vars is not a list.")
+  if type(element_vars) is not list:
+    raise Exception, ("ERROR: element_vars is not a list.")
+    
+  if exo.modeChar is 'r':
+    raise Exception, ("ERROR: variables cannot be added to an exodus object in read only mode")
+    
+  if debugPrint: print "Add Global Variables"
+  n_new_vars = len(global_vars)
+  n_old_vars = exo.get_global_variable_number()
+  n_vars = n_old_vars + n_new_vars
+  default_vals = [0.0] * n_new_vars
+  if n_new_vars > 0:
+    exo.set_global_variable_number(n_vars)
+    for i, var_name in enumerate(global_vars):
+      exo.put_global_variable_name(var_name, n_old_vars + i + 1)
+    #One might wish to put all the values for a given global variable in the
+    #database at once, but exo.put_global_variable_value() ends up loading
+    #all the global variables for a given step and then putting them all back 
+    #in, so we might as well just use exo.put_all_global_variable_values().
+    nSteps = exo.num_times()
+    for step in xrange(nSteps):
+      gValues = exo.get_all_global_variable_values(step+1)
+      if array_type == 'numpy':
+        gValues = exo.np.append(gValues, default_vals)
+      else:
+        gValues.extend( default_vals )
+      exo.put_all_global_variable_values(step+1, gValues)
+  
+  if debugPrint: print "Add Nodal Variables"
+  n_new_vars = len(nodal_vars)
+  n_old_vars = exo.get_node_variable_number()
+  n_vars = n_old_vars + n_new_vars
+  if n_new_vars > 0:
+    exo.set_node_variable_number(n_vars)
+    for i, var_name in enumerate(nodal_vars):
+      exo.put_node_variable_name(var_name, i + n_old_vars + 1)
+  
+  if debugPrint: print "Construct Truth Table for additionalElementVariables"
+  new_e_var_names = []
+  new_e_var_blks = []
+  blk_ids = exo.get_elem_blk_ids()
+  for item in element_vars:
+    if type(item) is tuple:
+      new_e_var_names.append( item[0] )
+      in_blks = []
+      for blk_id in item[1]:
+        if blk_id in blk_ids:
+          in_blks.append(blk_id)
+      new_e_var_blks.append( in_blks )
+    elif type(item) is str:
+      new_e_var_names.append( item )
+      new_e_var_blks.append( blk_ids )
+    else:
+      print "Warning additionalElementVariable item ", item, " is not right type to add."
+      print "should be a string or tuple, skipping"
+  
+  if debugPrint: print "Add Element Variables"
+  n_new_vars = len(new_e_var_names)
+  n_old_vars = exo.get_element_variable_number()
+  n_vars = n_old_vars + n_new_vars
+  if n_new_vars > 0:
+    exo.set_element_variable_number(n_vars)
+    old_truth_table = []
+    if n_old_vars > 0:
+      old_truth_table = exo.get_element_variable_truth_table()
+    truth_table = []
+    n_blks = exo.num_blks()
+    for j in xrange(n_blks):
+      for k in xrange(n_old_vars):
+        ndx = j * n_old_vars + k
+        truth_table.append( old_truth_table[ndx] )
+      for m in xrange(n_new_vars):
+        if blk_ids[j] in new_e_var_blks[m]:
+          truth_table.append(True)
+        else:
+          truth_table.append(False)
+    exo.set_element_variable_truth_table(truth_table)
+    for i, var_name in enumerate(new_e_var_names):
+      exo.put_element_variable_name(var_name, n_old_vars + i + 1)
+  
+  ## TODO: Add Nodeset Variables
+  
+  ## TODO: Add Sideset Variables
+  
+  return(exo)
+
+# --------------------------------------------------------------------
+
+def copyTransfer(fromFileName, toFileName, array_type = 'ctype', \
+    additionalGlobalVariables=[], additionalNodalVariables=[], additionalElementVariables=[]):
+  """
+    This function creates an exodus file toFileName and copies everything from exodus file fromFileName returning
+    a file handle to toFileName.
+
+    Additional space is allocated for additionalGlobalVariables, additionalNodalVariables and additionalElementVariables if specified.
+
+    additionalGlobalVariables: list of global variable names to add.
+
+    additionalNodalVaraibles: list of nodal variable names to add.
+
+    additionalElementVariables: should be a list of element variable names to add to all blocks or
+                                tuples ( name, blkIds ) where name is the element variable to add
+                                and blkIds is a list of blkIds to add it to.
+    Usage:
+
+    fromFileName = "input.e"
+    toFileName = "output.e"
+    addGlobalVariables = [] ## Do not add any new global variables
+    addNodeVariables = ["node_dummy1","node_dummy2"] ## Add node_dummy1 and node_dummy2 as new node variables
+    addElementVariables = [ ("elem_dummy1",[1,2,3]), "elem_dummy2" ] ## Add elem_dummy1 on blkIds 1,2,3 and elem_dummy2 on all blocks
+
+    toFileHandle = copyTranfer(fromFileName,toFileName,addGlobalVariables,addNodeVariables,addElementVariables)
+
+    ## Fill in new variables
+    
+    toFileHandle.close()
+
+  """
+
+  debugPrint = False
+
+  exoFrom = exodus(fromFileName,"r", array_type = array_type)
+
+  exoTo = copy_mesh(fromFileName, toFileName, exoFromObj = exoFrom, array_type = array_type)
+    
+  exoTo = transfer_variables(exoFrom, exoTo, \
+      additionalGlobalVariables = additionalGlobalVariables, \
+      additionalNodalVariables = additionalNodalVariables, \
+      additionalElementVariables = additionalElementVariables, \
+      array_type = array_type)
+  
+  exoFrom.close()
+  return exoTo
+
+def ctype_to_numpy(self, c_array):
+    """
+    Converts a c-type array into a numpy array
+    """
+    #ctypes currently produce invalid PEP 3118 type codes, which causes numpy
+    #to issue a warning.  This is a bug and can be ignored.
+    #http://stackoverflow.com/questions/4964101/pep-3118-warning-when-using-ctypes-array-as-numpy-array
+    with self.warnings.catch_warnings():
+        self.warnings.simplefilter('ignore')
+        np_array = self.np.ctypeslib.as_array(c_array)
+    return(np_array)
diff --git a/exodus/exodusii.dsp b/exodus/exodusii.dsp
new file mode 100644
index 0000000..a5fa366
--- /dev/null
+++ b/exodus/exodusii.dsp
@@ -0,0 +1,497 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# Microsoft Developer Studio Project File - Name="exodusii" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=exodusii - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "exodusii.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "exodusii.mak" CFG="exodusii - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "exodusii - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "exodusii - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "exodusii - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "$(CUBITROOT)/netcdf/netcdf-3.4.snl/include" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "EX_ERR_STR" /D "NT" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo /out:"../../lib/nt/libexodus406.lib"
+
+!ELSEIF  "$(CFG)" == "exodusii - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "$(CUBITROOT)/netcdf/netcdf-3.4.snl/include" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "EX_ERR_STR" /D "NT" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo /out:"../../lib/nt/libexodus406_db.lib"
+
+!ENDIF 
+
+# Begin Target
+
+# Name "exodusii - Win32 Release"
+# Name "exodusii - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\ex_conv.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\ex_utils.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exclos.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\excn2s.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\excopy.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\excre.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exerr.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgatm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgcns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgcon.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgcor.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgcss.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgeat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgebi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgelb.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgelc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgem.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgenm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgev.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgevt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgfrm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exggv.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exggvt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exginf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgini.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgmap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgmp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnnm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnsd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnsi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnv.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgnvt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgpa.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgpn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgqa.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgsnl.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgsp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgss.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgssc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgssd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgssi.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgssn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgtim.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgvan.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgvnm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgvp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exgvtt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exinq.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exopen.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exopts.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expclb.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expcns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expcon.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expcor.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expcss.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expeat.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expelb.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expelc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expem.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expenm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expev.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expfrm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expgv.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expinf.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expini.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expmap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expmp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expnm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expnnm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expnp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expns.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expnsd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expnv.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exppa.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exppn.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expqa.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expsp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expss.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expssd.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exptim.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expvan.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expvnm.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expvp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expvpc.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\expvtt.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\exupda.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\include\exodusII.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\exodusII_int.h
+# End Source File
+# End Group
+# End Target
+# End Project
diff --git a/exodus/forbind/CMakeLists.txt b/exodus/forbind/CMakeLists.txt
new file mode 100644
index 0000000..74fcaff
--- /dev/null
+++ b/exodus/forbind/CMakeLists.txt
@@ -0,0 +1,77 @@
+# Set Mangling by hand 
+# Assume _name mangling see src/exo_jack.c code for how ADDC_ will be used in
+# Fortran mangling
+add_definitions (-DADDC_)
+
+
+find_path( NETCDF_INCLUDE_DIR netcdf.h
+   $ENV{ACCESS}/inc
+   $ENV{NETCDF_DIR}/inc
+   $ENV{NETCDF_DIR}/include
+   $ENV{NETCDF_DIR}/libsrc
+)	
+
+find_library( NETCDF_LIBRARY
+   NAMES netcdf
+   PATHS "$ENV{ACCESS}/lib"
+         "$ENV{NETCDF_DIR}/lib"
+	 "$ENV{NETCDF_DIR}/libsrc/.libs"
+)
+
+find_program (NETCDF_NCDUMP ncdump
+   $ENV{ACCESS}/bin
+   $ENV{NETCDF_DIR}/bin
+   $ENV{NETCDF_DIR}/ncdump
+)
+
+# Hack for HDF5
+find_library( HDF5_LIBRARY hdf5
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  /usr/local/hdf5/lib
+  )
+find_library( HDF5HL_LIBRARY hdf5_hl
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  /usr/local/hdf5/lib
+  )
+
+INCLUDE_DIRECTORIES(
+  "${CMAKE_CURRENT_SOURCE_DIR}/include"
+  "${CMAKE_CURRENT_SOURCE_DIR}/../cbind/include"
+  "${CMAKE_CURRENT_BINARY_DIR}/include"
+  "${NETCDF_INCLUDE_DIR}"
+)
+
+SET(forbind_SRCS
+   src/exo_jack.c
+)
+
+ADD_LIBRARY(exoIIv2for ${EXODUS_LIBRARY_TYPE} ${forbind_SRCS})
+
+TARGET_LINK_LIBRARIES(exoIIv2for exodus ${NETCDF_LIBRARY} ${HDF5_LIBRARY} ${HDF5HL_LIBRARY} ${ZLIB_LIBRARY} ${CURL} m dl)
+
+IF(EXODUS_LIBRARY_PROPERTIES)
+  SET_TARGET_PROPERTIES(exoIIv2for PROPERTIES ${EXODUS_LIBRARY_PROPERTIES})
+ENDIF(EXODUS_LIBRARY_PROPERTIES)
+
+IF(NOT EXODUS_INSTALL_NO_LIBRARIES)
+  INSTALL(TARGETS exoIIv2for
+    RUNTIME DESTINATION lib COMPONENT Runtime
+    LIBRARY DESTINATION lib COMPONENT Runtime
+    ARCHIVE DESTINATION lib COMPONENT Development)
+  INSTALL(FILES ${forbind_HEADERS} DESTINATION include COMPONENT Development)
+ENDIF(NOT EXODUS_INSTALL_NO_LIBRARIES)
+
+
+INCLUDE (${CMAKE_ROOT}/Modules/Dart.cmake)
+
+IF (BUILD_TESTING)
+  ENABLE_TESTING()
+  SUBDIRS(test)
+ENDIF (BUILD_TESTING)
+
diff --git a/exodus/forbind/include/Imakefile b/exodus/forbind/include/Imakefile
new file mode 100644
index 0000000..8044031
--- /dev/null
+++ b/exodus/forbind/include/Imakefile
@@ -0,0 +1,6 @@
+XCOMM $Id: Imakefile,v 1.5 2008/07/24 21:40:41 gdsjaar Exp $
+
+INCLIST=exodusII.inc exodusII_int.inc
+
+InstallIncludeList(install,$(INCLIST),$(INCDIR))
+
diff --git a/exodus/forbind/include/exodusII.inc b/exodus/forbind/include/exodusII.inc
new file mode 100644
index 0000000..075c04c
--- /dev/null
+++ b/exodus/forbind/include/exodusII.inc
@@ -0,0 +1,193 @@
+                                ! -*- mode: fortran -*-
+!
+! Copyright 1994 Sandia Corporation. Under the terms of Contract
+! DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+! retains certain rights in this software.
+!
+! See the COPYRIGHT file for copying and redistribution conditions.
+!
+!***************************************************************
+!
+! Name: exodusII.inc - Exodus II Application include file
+!
+!       Use this include file to define general Exodus II parameters
+!
+!*****************************************************************************
+!
+!       Define Exodus functions that return values
+!
+        integer excre,exopen,exlgmd, exinqi
+        external excre, exopen, exlgmd, exinqi
+!
+!       Define access modes
+!
+        integer EXNOCL,EXCLOB,EXREAD,EXWRIT,EXWRT,EXNORM,EXLARG
+        integer EXNET4, EXNOSH, EXSHAR
+
+        integer EX_READ,EX_WRITE,EX_NOCLOBBER,EX_CLOBBER,EX_NORMAL_MODEL
+        integer EX_LARGE_MODEL,EX_NETCDF4,EX_NOSHARE,EX_SHARE
+        integer EX_NOCLASSIC,EX_MAPS_INT64_DB,EX_IDS_INT64_DB
+        integer EX_BULK_INT64_DB,EX_ALL_INT64_DB
+        integer EX_MAPS_INT64_API
+        integer EX_IDS_INT64_API,EX_BULK_INT64_API,EX_ALL_INT64_API
+
+        parameter (EXWRIT =     1)   !       EXWRIT - File open for write
+        parameter (EXWRT  =     1)   !       EXWRT  - File open for write (alternate to EXWRIT)
+        parameter (EXREAD =     2)   !       EXREAD - File open for read
+
+        parameter (EXNOCL =     4)   !       EXNOCL - File create with no overwrite (no clobber), default
+        parameter (EXCLOB =     8)   !       EXCLOB - File create with overwrite (clobber)
+        parameter (EXNORM =    16)   !       EXNORM - Disable large model modifications
+        parameter (EXLARG =    32)   !       EXLARG - Large model modifications
+        parameter (EXNET4 =    64)   !       EXNET4 - use the hdf5-based netcdf4 output
+        parameter (EXNOSH =   128)   !       EXNOSH - Do not open netcdf file in "share" mode
+        parameter (EXSHAR =   256)   !       EXSHAR - Do open netcdf file in "share" mode
+
+! Some of these are repeated from above, but use the same name as the C/C++ versions...
+
+        parameter (EX_READ          =      0) !ex_open(): open file for reading (default)
+        parameter (EX_WRITE         =      1) ! ex_open(): open existing file for appending.
+
+        parameter (EX_NOCLOBBER     =      4) ! Don't overwrite existing database, default
+        parameter (EX_CLOBBER       =      8) ! Overwrite existing database if it exists
+        parameter (EX_NORMAL_MODEL  =     16) ! disable mods that permit storage of larger models
+        parameter (EX_LARGE_MODEL   =     32) ! enable mods that permit storage of larger models
+        parameter (EX_NETCDF4       =     64) ! use the hdf5-based netcdf4 output
+        parameter (EX_NOSHARE       =    128) ! Do not open netcdf file in "share" mode
+        parameter (EX_SHARE         =    256) ! Do open netcdf file in "share" mode
+        parameter (EX_NOCLASSIC     =    512) ! Do not force netcdf to classic mode in netcdf4 mode
+
+! Need to distinguish between storage on database (DB in name) and
+! passed through the API functions (API in name).
+
+        parameter (EX_MAPS_INT64_DB =   1024) ! All maps (id, order, ...) store int64_t values
+        parameter (EX_IDS_INT64_DB  =   2048) ! All entity ids (sets, blocks, maps) are int64_t values
+        parameter (EX_BULK_INT64_DB =   4096) ! All integer bulk data (local indices, counts, maps); not ids
+        parameter (EX_ALL_INT64_DB  =   1024+2048+4096) ! All of the above...
+
+        parameter (EX_MAPS_INT64_API=   8192) ! All maps (id, order, ...) store int64_t values
+        parameter (EX_IDS_INT64_API =  16384) ! All entity ids (sets, blocks, maps) are int64_t values
+        parameter (EX_BULK_INT64_API=  32768) ! All integer bulk data (local indices, counts, maps); not ids
+        parameter (EX_ALL_INT64_API =  8192+16384+32768) ! All of the above...
+
+!
+!  --INQUIRE FLAGS
+      integer EXTYPE, EXVERS, EXDBVR, EXTITL, EXDIM, EXNODE
+      integer  EXELEM, EXELBL, EXNODS, EXSIDS, EXQA,  EXINFO
+      integer  EXTIMS, EXSSNL, EXSSEL, EXNSNL, EXNEBP, EXNNSP
+      integer  EXNSSP, EXNSDF, EXSSDF, EXLBVR, EXNEMP, EXNNMP
+      integer  EXNEM,  EXNNM,  EXNEDG, EXNEDB, EXNEDS, EXESL
+      integer  EXESDL, EXEDBP, EXEDSP, EXNFAC, EXNFB , EXNFS
+      integer  EXFSL , EXFSDL, EXFABP, EXFASP, EXNELS, EXELSL
+      integer  EXELSD, EXELSP, EXNEDM, EXNFAM, EXNCF,  EXDBMXALNM
+      integer  EXDBMXUSNM, EXMXRDNM
+
+!
+      parameter (EXTYPE = 1)     ! --  inquire EXODUS II file type
+      parameter (EXVERS = 2)     ! --  inquire API version number
+      parameter (EXDBVR = 3)     ! --  inquire database version number
+      parameter (EXTITL = 4)     ! --  inquire database title
+      parameter (EXDIM  = 5)     ! --  inquire number of dimensions
+      parameter (EXNODE = 6)     ! --  inquire number of nodes
+      parameter (EXELEM = 7)     ! --  inquire number of elements
+      parameter (EXELBL = 8)     ! --  inquire number of element blocks
+      parameter (EXNODS = 9)     ! --  inquire number of node sets
+      parameter (EXNSNL = 10)    ! --  inquire length of node set node list
+      parameter (EXSIDS = 11)    ! --  inquire number of side sets
+      parameter (EXSSNL = 12)    ! --  inquire length of side set node list
+      parameter (EXSSEL = 13)    ! --  inquire length of side set element list
+      parameter (EXQA   = 14)    ! --  inquire number of QA records
+      parameter (EXINFO = 15)    ! --  inquire number of info records
+      parameter (EXTIMS = 16)    ! --  inquire number of time steps in the database
+      parameter (EXNEBP = 17)    ! --  inquire number of element block properties
+      parameter (EXNNSP = 18)    ! --  inquire number of node set properties
+      parameter (EXNSSP = 19)    ! --  inquire number of side set properties
+      parameter (EXNSDF = 20)    ! --  inquire length of node set distribution factor list
+      parameter (EXSSDF = 21)    ! --  inquire length of side set distribution factor list
+      parameter (EXLBVR = 22)    ! --  inquire API Lib vers number
+      parameter (EXNEMP = 23)    ! --  inquire number of element map properties
+      parameter (EXNNMP = 24)    ! --  inquire number of node map properties
+      parameter (EXNEM  = 25)    ! --  inquire number of element maps
+      parameter (EXNNM  = 26)    ! --  inquire number of node maps
+      parameter (EXNEDG = 27)    ! --  inquire number of edges
+      parameter (EXNEDB = 28)    ! --  inquire number of edge blocks
+      parameter (EXNEDS = 29)    ! --  inquire number of edge sets
+      parameter (EXESL  = 30)    ! --  inquire length of concat edge set edge list
+      parameter (EXESDL = 31)    ! --  inquire length of concat edge set dist factor list
+      parameter (EXEDBP = 32)    ! --  inquire number of properties stored per edge block
+      parameter (EXEDSP = 33)    ! --  inquire number of properties stored per edge set
+      Parameter (EXNFAC = 34)    ! --  inquire number of faces
+      parameter (EXNFB  = 35)    ! --  inquire number of face blocks
+      parameter (EXNFS  = 36)    ! --  inquire number of face sets
+      parameter (EXFSL  = 37)    ! --  inquire length of concat face set face list
+      parameter (EXFSDL = 38)    ! --  inquire length of concat face set dist factor list
+      parameter (EXFABP = 39)    ! --  inquire number of properties stored per face block
+      parameter (EXFASP = 40)    ! --  inquire number of properties stored per face set
+      parameter (EXNELS = 41)    ! --  inquire number of element sets
+      parameter (EXELSL = 42)    ! --  inquire length of concat element set element list
+      parameter (EXELSD = 43)    ! --  inquire length of concat element set dist factor list
+      parameter (EXELSP = 44)    ! --  inquire number of properties stored per elem set
+      parameter (EXNEDM = 45)    ! --  inquire number of edge maps
+      parameter (EXNFAM = 46)    ! --  inquire number of face maps
+      parameter (EXNCF  = 47)    ! --  inquire number of coordinate frames
+      parameter (EXDBMXALNM = 48)! --  inquire size of MAX_NAME_LENGTH dimension on database
+      parameter (EXDBMXUSNM = 49)! --  inquire max size of any name existing on database
+      parameter (EXMXRDNM = 50)  ! --  inquire user-specified max size of names returned; truncated if longer
+!
+!         Define limits
+!
+      integer MXSTLN, MXLNLN, MXNAME
+!     MXSTLN - Maximum string length: used for store strings
+      parameter (MXSTLN = 32)
+!     MXLNLN - Maximum line string length
+      parameter (MXLNLN = 80)
+!     MXNAME - Maximum possible length of a name (due to netcdf NC_MAX_NAME)
+      parameter (MXNAME = 256)
+!
+!     properties
+!
+      integer EXEBLK, EXNSET, EXSSET, EXEMAP, EXNMAP
+
+      parameter (EXEBLK = 1)   ! EXEBLK - element block property code
+      parameter (EXNSET = 2)   ! EXNSPR - node set property code
+      parameter (EXSSET = 3)   ! EXSSPR - side set property code
+      parameter (EXEMAP = 4)   ! EXEMAP - element map property code
+      parameter (EXNMAP = 5)   ! EXNMAP - node map property code
+!
+!     Define options codes
+!
+      integer EXVRBS, EXDEBG, EXABRT
+
+      parameter (EXVRBS = 1)   ! EXVRBS - verbose mode message flag
+      parameter (EXDEBG = 2)   ! EXDEBG - debug mode message flag
+      parameter (EXABRT = 4)   ! EXABRT - abort mode flag
+!
+!     Define coordinate frames
+!
+      integer EXCFREC, EXCFCYL, EXCFSPH
+      parameter (EXCFREC = 1)     ! Rectangular
+      parameter (EXCFCYL = 2)     ! Cylindrical
+      parameter (EXCFSPH = 3)     ! Spherical
+
+!
+!     Define error return codes
+!
+      integer EXFATL, EXOK, EXWARN
+
+      parameter (EXFATL = -1)  ! EXFATL - fatal error flag def
+      parameter (EXOK = 0)     ! EXOK - no err (success) flag def
+      parameter (EXWARN = 1)   ! EXWARN - warning flag def
+!
+!     Define error return codes and flags
+!
+      integer EXMEMF, EXBFMD, EXBFID, EXBTID, EXBPRM, EXNULL
+      integer EXPMSG, EXLMSG
+
+      parameter (EXMEMF =  1000)   ! EXMEMF - memory allocation failure flag def
+      parameter (EXBFMD =  1001)   ! EXBFMD - wrong file mode
+      parameter (EXBFID =  1002)   ! EXBFID - bad file id def
+      parameter (EXBTID =  1004)   ! EXBTID - id table lookup failed
+      parameter (EXBPRM =  1005)   ! EXBPRM - bad parameter passed
+      parameter (EXNULL = -1006)   ! EXNULL - null entity found
+      parameter (EXPMSG = -1000)   ! EXPMSG - message print code - no error implied
+      parameter (EXLMSG = -1001)   ! EXLMSG - print last error message msg code
diff --git a/exodus/forbind/include/exodusII_int.inc b/exodus/forbind/include/exodusII_int.inc
new file mode 100644
index 0000000..0f45c48
--- /dev/null
+++ b/exodus/forbind/include/exodusII_int.inc
@@ -0,0 +1,167 @@
+C*****************************************************************************
+C Copyright 1994 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+C retains certain rights in this software.
+C
+C See the COPYRIGHT file for copying and redistribution conditions.
+C
+C*****************************************************************************
+C
+C EXODUSII_INT - exodus II internals include file
+C
+C author - Victor R. Yarberry, Sandia National Laboratories
+C
+C environment - UNIX F77
+C
+C revision history - 
+C
+C  Based on original written by Lynn Clements (RE/SPEC)
+C
+C  $Id: exodusII_int.inc,v 1.8 2008/07/24 21:40:41 gdsjaar Exp $
+C
+C*****************************************************************************
+C  --
+C  --  This file contains define constants that are used to refer to
+C  --  netCDF variables, attributes, or dimensions in which the EXODUS
+C  --  II data are stored.  Using the defined constants will allow the
+C  --  names of the netCDF entities to be changed easily in the future
+C  --  if needed.  
+C  --
+C  --Constants:
+C  --
+C  --ATTRIBUTES
+C  --
+C  --   A_TYPE     The EXODUS II file type:
+C                    "r" = regular
+C                    "h" = history
+C  --   A_TITLE    The database title
+C  --   A_VERSION  The EXODUS II version number
+C  --   A_NAMELB   The element type name for a given element block
+C  --
+C  --DIMENSIONS
+C  --
+C  --   D_NUMNOD   The number of nodes
+C  --   D_NDIM     The number of coordinates per node
+C  --   D_NUMEL    The number of elements
+C  --   D_NELBLK   the number of element blocks
+C  --   D_NUMELB   The number of elements in a given element block
+C  --   D_NELNOD   The number of nodes per element in a given element 
+C  --              block
+C  --   D_NATRIB   The number of attributes in a given element block
+C  --   D_NUMESS   The number of side sets
+C  --   D_NEESS    The number of elements in a given side set
+C  --   D_NNESS    The number of nodes in a given side set
+C  --   D_NUMNPS   The number of node sets
+C  --   D_NNNPS    The number of nodes in a given node set
+C  --   D_NQAREC   The number of QA records
+C  --   D_NINFO    The number of information records
+C  --   D_NVARGL   The number of global variables
+C  --   D_NVARNP   The number of nodal variables
+C  --   D_NVAREL   The number of element variables
+C  --   D_NVARHI   The number of history variables
+C  --   D_N4       General dimension of length 4
+C  --   D_STRLEN   General dimension of length MXSTLN used for lengths 
+C  --              of names
+C  --   D_LINLEN   General dimension of length MXLNLN used for lengths 
+C  --              of long strings
+C  --   D_TIMSTP   The number of whole time steps
+C  --   D_HTMSTP   The number of history time steps 
+C  --
+C  --VARIABLES
+C  --
+C  --   V_COORD    The nodal coordinates
+C  --   V_NAMECO   The names of coordinates
+C  --   V_IDEBLK   The element block IDs
+C  --   V_ICONK    The element connectivity for a given element block
+C  --   V_ATRIBK   The list of attributes for a given element block
+C  --   V_MAP      The element order map
+C  --   V_IDESS    The side set Ids
+C  --   V_FACESS   The distribution factor for each node in a given 
+C  --              side set
+C  --   V_ELSSET   The list of elements in a given side set
+C  --   V_NDSSET   The list of nodes in a given side set
+C  --   V_IDNPS    The node set IDs
+C  --   V_NODSET   The list of nodes in a given node set
+C  --   V_FNPS     The list of distribution factors in a given node set
+C  --   V_INFO     The information records
+C  --   V_TIMEHS   The simulation times for history time steps
+C  --   V_TIME     The simulation times for whole time steps
+C  --   V_QATITL   The QA records
+C  --   V_ISEVOK   The element variable truth table
+C  --   V_NAMEGV   The names of global variables
+C  --   V_VARGL    The values of global variables
+C  --   V_NAMENV   The names of nodal variables
+C  --   V_VARNP    The values of nodal variables
+C  --   V_NAMEEV   The names of element variables
+C  --   V_VAREL    The values of element variables for a given element 
+C  --              block and given element within that block
+C  --   V_NAMEHV   The names of the history variables
+C  --   V_VARHI    The values of the history variables
+C  --
+
+      character A_TYPE*4, A_TITLE*5, A_VERSION*7, A_NAMELB*9, 
+     1 D_NUMNOD*9, D_NDIM*7, D_NUMEL*8, D_NELBLK*10, D_NUMELB*13, 
+     1 D_NELNOD*14, D_NATRIB*14, D_NUMESS*13, D_NEESS*9, D_NNESS*10, 
+     1 D_NUMNPS*13, D_NNNPS*10, D_NQAREC*10, D_NINFO*8, D_NVARGL*11, 
+     1 D_NVARNP*11, D_NVAREL*12, D_NVARHI*11, D_N4*4, D_STRLEN*10, 
+     1 D_LINLEN*8, V_COORD*5, V_NAMECO*10, V_IDEBLK*9, V_ICONK*7, 
+     1 V_ATRIBK*6, V_MAP*8, V_IDESS*12, V_FACESS*12, V_ELSSET*7, 
+     1 V_NDSSET*7, V_IDNPS*12, V_NODSET*7, V_FNPS*12, V_INFO*12, 
+     1 V_TIMEHS*9, V_TIME*10, V_QATITL*10, V_ISEVOK*12, V_NAMEGV*12, 
+     1 V_VARGL*12, V_NAMENV*12, V_VARNP*12, V_NAMEEV*13, V_VAREL*13, 
+     1 V_NAMEHV*12, V_VARHI*12, D_TIMSTP*9, D_HTMSTP*14 
+
+c
+c         Define attributes 
+c 
+      parameter (A_TYPE = 'type', A_TITLE = 'title') 
+      parameter (A_VERSION = 'version') 
+c 
+c         Define dimensions 
+c
+      parameter (D_NUMNOD = 'num_nodes', D_NDIM = 'num_dim')
+      parameter (D_NUMEL ='num_elem')
+      parameter (D_NELBLK = 'num_el_blk', D_NUMELB ='num_el_in_blk')
+      parameter (D_NELNOD = 'num_nod_per_el') 
+      parameter (D_NATRIB = 'num_att_in_blk')
+      parameter (D_NUMESS = 'num_side_sets', D_NEESS = 'num_el_ss')
+      parameter (D_NNESS = 'num_nod_ss', D_NUMNPS = 'num_node_sets')
+      parameter (D_NNNPS = 'num_nod_ns', D_NQAREC = 'num_qa_rec')
+      parameter (D_NINFO = 'num_info', D_NVARGL ='num_glo_var')
+      parameter (D_NVARNP = 'num_nod_var', D_NVAREL ='num_elem_var')
+      parameter (D_NVARHI = 'num_his_var', D_N4 = 'four')
+      parameter (D_STRLEN = 'len_string', D_LINLEN = 'len_line')
+      parameter (D_TIMSTP = 'time_step', D_HTMSTP ='hist_time_step')
+c
+c         Define variables
+c
+      parameter (V_COORD = 'coord', V_NAMECO = 'coor_names')
+      parameter (V_IDEBLK = 'el_blk_id', V_ICONK = 'connect')
+      parameter (V_ATRIBK = 'attrib', A_NAMELB = 'elem_type')
+      parameter (V_MAP ='elem_map', V_IDESS = 'side_set_ids') 
+      parameter (V_FACESS = 'dist_fact_ss')
+      parameter (V_ELSSET = 'elem_ss', V_NDSSET = 'node_ss')
+      parameter (V_IDNPS = 'node_set_ids', V_NODSET ='node_ns')
+      parameter (V_FNPS = 'dist_fact_ns', V_INFO = 'info_records') 
+      parameter (V_TIMEHS = 'time_hist')
+      parameter (V_TIME = 'time_whole', V_QATITL = 'qa_records')
+      parameter (V_ISEVOK = 'elem_var_tab', V_NAMEGV ='name_glo_var')
+      parameter (V_VARGL ='vals_glo_var', V_NAMENV = 'name_nod_var')
+      parameter (V_VARNP = 'vals_nod_var')
+      parameter (V_NAMEEV = 'name_elem_var', V_VAREL = 'vals_elem_var')
+      parameter (V_NAMEHV = 'name_his_var', V_VARHI = 'vals_his_var')
+c
+c        dummy character variables used through out EXODUS
+c
+      character name*32
+
+c
+c        dummy integer variables used throughout EXODUS
+c
+       integer istart(3), icount(3), id
+c
+c        declaration for various functions
+c
+       integer chkfil
+
+
diff --git a/exodus/forbind/src/Imakefile b/exodus/forbind/src/Imakefile
new file mode 100644
index 0000000..7e4bf26
--- /dev/null
+++ b/exodus/forbind/src/Imakefile
@@ -0,0 +1,76 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+
+/* Use *.h files in ../../cbind/include/ instead of installed *.h files  */
+INCLUDES = IncRef-I../../cbind/include
+F77EXTRAOPTIONS = IncRef-I../include
+
+F77CPPFLAGS = F77CppFlags
+
+SRCS = exo_jack.c    
+SRCSF = addrwrap.F
+
+OBJS = ${SRCS:.c=.o} ${SRCSF:.F=.o}
+LibraryTargetSubdirsCopy(libexoIIv2for.a,$(OBJS),../../)
+CleanupCapF(addrwrap.f)
+
+#if Build64BitAccess == YES
+/* Need to compile exo_jack.c without the -DBuild64 option
+ * real* -> float* (actually void* since it handles both float* and double*)
+ */
+exo_jack32.o: exo_jack.c
+	$(CC) -o exo_jack32.o -c $(CFLAGS) -DDEFAULT_REAL_INT exo_jack.c
+ 
+all:: libexoIIv2for32.a
+libexoIIv2for32.a: exo_jack32.o
+	$(AR) $@ $?
+	$(_NULLCMD_)
+	$(_NULLCMD_)
+	$(CP) $@ ../../
+
+#endif
+
+/*
+ * 32-bit build:
+ *   Compile exo_jack.c and put in libexoIIv2for.a archive.
+ *
+ * 64-bit build: (using 8-byte integer/real)
+ *   Compile addrwrap.F                (contains main api name 'func'; calls 'func4' name)
+ *   Compile exo_jack.c with -DBuild64 (adds 4_ to function names)
+ *   -- put above two object files into libexoIIv2for.a
+ *
+ */
+
+DependTarget()
+
diff --git a/exodus/forbind/src/Makefile.standalone b/exodus/forbind/src/Makefile.standalone
new file mode 100644
index 0000000..4324488
--- /dev/null
+++ b/exodus/forbind/src/Makefile.standalone
@@ -0,0 +1,70 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+INCLUDES = -I../../cbind/include
+F77EXTRAOPTIONS = -I../include
+
+SRCS =	    exo_jack.c 
+
+SRCSF = addrwrap.F
+
+COBJS = ${SRCS:.c=.o}
+FOBJS = ${SRCSF:.F=.o}
+
+
+all:: libexoIIv2for.a
+libexoIIv2for.a: $(COBJS) $(FOBJS)
+	$(AR) $@ $?
+	$(RANLIB) $@
+	cp libexoIIv2for.a ../../
+
+all:: libexoIIv2for32.a
+libexoIIv2for32.a: $(COBJS)
+	$(AR) $@ $?
+	$(RANLIB) $@
+	cp libexoIIv2for.a ../../
+
+clean::
+	rm -f *.CKP *.ln *.BAK *.bak *.o *.M *.mod core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut   "#"*
+
+.SUFFIXES: .c .F .f
+.c.o:
+	$(CC) -c $(CFLAGS) $*.c
+.f.o:
+	$(FC) -c $(FFLAGS) $*.f
+.F.o:
+	$(FC) -c $(DEFINES) $(FFLAGS) $*.F
+
+# ----------------------------------------------------------------------
+# dependencies generated by makedepend or sfmakedepend
+
diff --git a/exodus/forbind/src/addrwrap.F b/exodus/forbind/src/addrwrap.F
new file mode 100644
index 0000000..2073f5d
--- /dev/null
+++ b/exodus/forbind/src/addrwrap.F
@@ -0,0 +1,3832 @@
+C Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+C retains certain rights in this software.
+C
+C Redistribution and use in source and binary forms, with or without
+C modification, are permitted provided that the following conditions are
+C met:
+C
+C     * Redistributions of source code must retain the above copyright
+C       notice, this list of conditions and the following disclaimer.
+C
+C     * Redistributions in binary form must reproduce the above
+C       copyright notice, this list of conditions and the following
+C       disclaimer in the documentation and/or other materials provided
+C       with the distribution.
+C
+C     * Neither the name of Sandia Corporation nor the names of its
+C       contributors may be used to endorse or promote products derived
+C       from this software without specific prior written permission.
+C
+C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C
+
+        SUBROUTINE ADRDUM
+        END
+
+#ifdef Build64
+        SUBROUTINE EXCLOS (IDEXO, IERR)
+C
+C       CLOSE EXODUS II FILE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXCLOS4 (IDEXO4, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXCN2S (IDEXO, NSESS, NDESS, IXEESS, IXNESS,
+     &          LTEESS, LTNESS, LTSESS, IERR)
+C
+C       CONVERT SIDE SET NODES TO SIDES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NSESS (*)       ! (R)
+        INTEGER NDESS (*)       ! (R)
+        INTEGER IXEESS (*)      ! (R)
+        INTEGER IXNESS (*)      ! (R)
+        INTEGER LTEESS (*)      ! (R)
+        INTEGER LTNESS (*)      ! (R)
+        INTEGER LTSESS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXCN2S4 (IDEXO4, NSESS, NDESS, IXEESS, IXNESS,
+     &          LTEESS, LTNESS, LTSESS, IERR4)
+        IERR = IERR4
+        END
+
+        INTEGER FUNCTION EXCRE (PATH, ICMODE, ICOMPWS, IOWS, IERR)
+C
+C       CREATE EXODUS II FILE
+C
+        IMPLICIT NONE
+        CHARACTER* (*) PATH     ! (R)
+        INTEGER ICMODE          ! (R)
+        INTEGER ICOMPWS         ! (RW)
+        INTEGER IOWS            ! (RW)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 EXCRE4
+        EXTERNAL EXCRE4
+        INTEGER*4 IRET4
+        INTEGER IRET
+        INTEGER*4 ICMODE4       ! (R)
+        INTEGER*4 ICOMPWS4      ! (RW)
+        INTEGER*4 IOWS4         ! (RW)
+        INTEGER*4 IERR4         ! (W)
+        INTEGER*4 IFLAG4
+
+C ... This is hardwired instead of getting from exodusII.inc due to compiler errors about
+C     exopen/excre already having a type...        
+        integer EX_MAPS_INT64_API
+        integer EX_BULK_INT64_API
+        integer EX_IDS_INT64_API
+        integer EX_INQ_INT64_API
+        parameter (EX_MAPS_INT64_API=   8192) ! All maps (id, order, ...) store int64_t values
+        parameter (EX_IDS_INT64_API =  16384) ! All entity ids
+        parameter (EX_BULK_INT64_API=  32768) ! All integer bulk data
+        parameter (EX_INQ_INT64_API =  65536) ! All integer inquire arguments
+
+C ... All wrapper routines are passing INTEGER*8, but at this 
+C     time, only the maps are supported...
+        ICMODE4 = ICMODE
+        IFLAG4 = EX_MAPS_INT64_API+EX_IDS_INT64_API+EX_BULK_INT64_API+
+     *    EX_INQ_INT64_API
+        ICMODE4 = IOR(ICMODE4,  IFLAG4)
+
+C ... This needs to be set explicitly since all wrapper routines
+C     are passing REAL*8 and the exo_jack.c routines all take double*
+        ICOMPWS4 = 8
+        IOWS4 = IOWS
+
+        IRET4 = EXCRE4 (PATH, ICMODE4, ICOMPWS4, IOWS4, IERR4)
+        ICOMPWS = ICOMPWS4
+        IOWS = IOWS4
+        IERR = IERR4
+        IRET = IRET4
+        EXCRE = IRET
+        END
+
+        SUBROUTINE EXERR (MODNAM, MSG, ERRNUM)
+C
+C       ERROR REPORTING
+C
+        CHARACTER* (*) MODNAM   ! (R)
+        CHARACTER* (*) MSG      ! (R)
+        INTEGER ERRNUM          ! (R)
+
+        INTEGER*4 ERRNUM4       ! (R)
+
+        ERRNUM4 = ERRNUM
+        CALL EXERR4 (MODNAM, MSG, ERRNUM4)
+        END
+
+        SUBROUTINE EXGATM (IDEXO, TIME, IERR)
+C
+C       READ ALL TIME VALUES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        REAL TIME (*)           ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGATM4 (IDEXO4, TIME, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGCNS (IDEXO, IDNPSS, NNNPS, NDNPS, IXNNPS,
+     &          IXDNPS, LTNNPS, FACNPS, IERR)
+C
+C       READ CONCATENATED NODE SETS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPSS (*)      ! (W)
+        INTEGER NNNPS (*)       ! (W)
+        INTEGER NDNPS (*)       ! (W)
+        INTEGER IXNNPS (*)      ! (W)
+        INTEGER IXDNPS (*)      ! (W)
+        INTEGER LTNNPS (*)      ! (W)
+        REAL FACNPS (*)         ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXGCNS4 (IDEXO4, IDNPSS, NNNPS, NDNPS, IXNNPS,
+     &                IXDNPS, LTNNPS, FACNPS, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGFRM (IDEXO, NFRAME, IDSCF, COORD, ITAGS, IERR)
+C
+C       READ COORDINATE FRAMES
+C
+        implicit none
+        include 'exodusII.inc'
+
+        INTEGER IDEXO           ! (R)
+        INTEGER NFRAME          ! (R)
+        INTEGER IDSCF(*)        ! (W)
+        INTEGER ITAGS(*)        ! (W)
+        INTEGER IERR            ! (W)
+
+        REAL COORD(*)           ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        integer*4 nframe4       ! (R)
+        integer*4 itags4(1)     ! (W)
+        INTEGER*4 IERR4         ! (W)
+
+        POINTER (PITAGS4, ITAGS4)
+
+        idexo4 = idexo
+
+        NFRAME = EXINQI (IDEXO, EXNCF)
+        NFRAME4 = NFRAME
+
+        CALL I4ALLOC (NFRAME, PITAGS4)
+
+        call exgfrm4(idexo4, nframe4, idscf, coord, itags4, ierr4)
+
+        CALL I4I8 (NFRAME, PITAGS4, ITAGS)
+        ierr = ierr4
+
+        END
+
+        SUBROUTINE EXPFRM (IDEXO, NFRAME, IDSCF, COORD, ITAGS, IERR)
+C
+C       DEFINE/WRITE COORDINATE FRAMES
+C
+        implicit none
+        include 'exodusII.inc'
+
+        INTEGER IDEXO           ! (R)
+        INTEGER NFRAME          ! (R)
+        INTEGER IDSCF(*)        ! (R)
+        INTEGER ITAGS(*)        ! (R)
+        INTEGER IERR            ! (W)
+
+        REAL COORD(*)           ! (R)
+
+        INTEGER*4 IDEXO4        ! (R)
+        integer*4 nframe4       ! (R)
+        integer*4 itags4(1)     ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        POINTER (PITAGS4, ITAGS4)
+
+        idexo4 = idexo
+        NFRAME4 = NFRAME
+
+        CALL I8I4 (NFRAME, ITAGS, PITAGS4)
+
+        call expfrm4(idexo4, nframe4, idscf, coord, itags4, ierr4)
+
+        CALL I4FREE (PITAGS4)
+        ierr = ierr4
+
+        END
+
+        SUBROUTINE EXGCON (IDEXO, NAMECO, IERR)
+C
+C       READ COORDINATE NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER* (*) NAMECO (*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGCON4 (IDEXO4, NAMECO, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGCOR (IDEXO, XN, YN, ZN, IERR)
+C
+C       READ NODAL COORDINATES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        REAL XN (*)             ! (W)
+        REAL YN (*)             ! (W)
+        REAL ZN (*)             ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGCOR4 (IDEXO4, XN, YN, ZN, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGCSS (IDEXO, IDESSS, NSESS, NDESS, IXEESS,
+     &          IXDESS, LTEESS, LTSESS, FACESS, IERR)
+C
+C       READ CONCATENATED SIDE SETS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESSS (*)      ! (W)
+        INTEGER NSESS (*)       ! (W)
+        INTEGER NDESS (*)       ! (W)
+        INTEGER IXEESS (*)      ! (W)
+        INTEGER IXDESS (*)      ! (W)
+        INTEGER LTEESS (*)      ! (W)
+        INTEGER LTSESS (*)      ! (W)
+        REAL FACESS (*)         ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXGCSS4 (IDEXO4, IDESSS, NSESS, NDESS, IXEESS,
+     &    IXDESS, LTEESS, LTSESS, FACESS, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGCSSF (IDEXO, IDESSS, NSESS, NDESS, IXEESS,
+     &          IXDESS, LTEESS, LTSESS, IERR)
+C
+C       READ CONCATENATED SIDE SETS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESSS (*)      ! (W)
+        INTEGER NSESS  (*)      ! (W)
+        INTEGER NDESS  (*)      ! (W)
+        INTEGER IXEESS (*)      ! (W)
+        INTEGER IXDESS (*)      ! (W)
+        INTEGER LTEESS (*)      ! (W)
+        INTEGER LTSESS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXGCSSF4 (IDEXO4, IDESSS, NSESS, NDESS, IXEESS,
+     &          IXDESS, LTEESS, LTSESS, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGEAT (IDEXO, IDELB, ATRIB, IERR)
+C
+C       READ ELEMENT BLOCK ATTRIBUTES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        REAL ATRIB (*)          ! (NUMATR,NUMELB) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGEAT4 (IDEXO4, IDELB, ATRIB, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGEAN (IDEXO, IDELB, NATTR, NAMES, IERR)
+C
+C       READ ELEMENT BLOCK ATTRIBUTES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER NATTR           ! (R)
+        CHARACTER* (*) NAMES (*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NATTR4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NATTR4 = NATTR
+        CALL EXGEAN4 (IDEXO4, IDELB, NATTR4, NAMES, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGEBI (IDEXO, IDELBS, IERR)
+C
+C       READ ELEMENT BLOCK IDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELBS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGEBI4 (IDEXO4, IDELBS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGELB (IDEXO, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, IERR)
+C
+C       READ ELEMENT BLOCK PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        CHARACTER* (*) NAMELB   ! (W)
+        INTEGER NUMELB          ! (W)
+        INTEGER NUMLNK          ! (W)
+        INTEGER NUMATR          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGELB4 (IDEXO4, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGELC (IDEXO, IDELB, LINK, IERR)
+C
+C       READ ELEMENT BLOCK CONNECTIVITY
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER LINK (*)        ! (NUMLNK,NUMELB) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGELC4 (IDEXO4, IDELB, LINK, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGECPP (IDEXO, ITYPE, IDELB, COUNTS, IERR)
+C
+C       READ ENTITY_COUNT-PER-POLYHEDRA
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER ITYPE           ! (R)
+        INTEGER COUNTS (*)      ! (NUMELB) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 COUNTS4 (1)   ! (NUMELB) ! (W)
+        POINTER (PCOUNTS4, COUNTS4)
+        INTEGER*4 IERR4         ! (W)
+
+        CHARACTER* (MXSTLN) NAMELB
+
+        INTEGER NUMELB
+        INTEGER NUMATR
+        INTEGER NUMLNK
+        
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        CALL EXGELB4 (IDEXO4, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, IERR4)
+
+        CALL I4ALLOC (NUMELB, PCOUNTS4)
+        CALL EXGECPP4 (IDEXO4, ITYPE4, IDELB, COUNTS4, IERR4)
+        CALL I4I8 (NUMELB, PCOUNTS4, COUNTS)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGENM (IDEXO, MAPEL, IERR)
+C
+C       READ ELEMENT NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPEL (*)       ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGENM4 (IDEXO4, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGEM (IDEXO, MAPID, MAPEL, IERR)
+C
+C       READ ELEMENT ORDER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPID           ! (R)
+        INTEGER MAPEL (*)       ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGEM4 (IDEXO4, MAPID, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGPEM (IDEXO, MAPID, ISTART, ICOUNT, MAPEL, IERR)
+C
+C       READ ELEMENT ORDER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPID           ! (R)
+        INTEGER ISTART          ! (R)
+        INTEGER ICOUNT          ! (R)
+        INTEGER MAPEL (*)       ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGPEM4 (IDEXO4, MAPID, ISTART, ICOUNT, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGEV (IDEXO, ISTEP, IXELEV, IDELB, NUMELB,
+     &          VALEV, IERR)
+C
+C       READ ELEMENT VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXELEV          ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER NUMELB          ! (R)
+        REAL VALEV (*)          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXELEV4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ISTEP4 = ISTEP
+        IXELEV4 = IXELEV
+        CALL EXGEV4 (IDEXO4, ISTEP4, IXELEV4, IDELB, NUMELB,
+     &          VALEV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGEVT (IDEXO, IXELEV, IELNUM, ISTPB, ISTPE,
+     &          VALEV, IERR)
+C
+C       READ ELEMENT VARIABLE VALUES THROUGH TIME
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IXELEV          ! (R)
+        INTEGER IELNUM          ! (R)
+        INTEGER ISTPB           ! (R)
+        INTEGER ISTPE           ! (R)
+        REAL VALEV (*)          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IXELEV4       ! (R)
+        INTEGER*4 ISTPB4        ! (R)
+        INTEGER*4 ISTPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        IXELEV4 = IXELEV
+        ISTPB4  = ISTPB
+        ISTPE4  = ISTPE
+
+        CALL EXGEVT4 (IDEXO4, IXELEV4, IELNUM, ISTPB4, ISTPE4,
+     &          VALEV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNSV (IDEXO, ISTEP, IXV, ID, NUM, VAL, IERR)
+C
+C       READ NODESET VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXV             ! (R)
+        INTEGER ID              ! (R)
+        INTEGER NUM             ! (R)
+        REAL VAL (*)            ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXV4  ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ISTEP4 = ISTEP
+        IXV4   = IXV
+        CALL EXGNSV4 (IDEXO4, ISTEP4, IXV4, ID, NUM, VAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSSV (IDEXO, ISTEP, IXV, ID, NUM, VAL, IERR)
+C
+C       READ SIDESET VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXV             ! (R)
+        INTEGER ID              ! (R)
+        INTEGER NUM             ! (R)
+        REAL VAL (*)            ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXV4          ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ISTEP4 = ISTEP
+        IXV4   = IXV
+        CALL EXGSSV4 (IDEXO4, ISTEP4, IXV4, ID, NUM, VAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGGV (IDEXO, ISTEP, NVARGL, VALGV, IERR)
+C
+C       READ GLOBAL VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER NVARGL          ! (R)
+        REAL VALGV (*)          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 NVARGL4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ISTEP4 = ISTEP
+        NVARGL4 = NVARGL
+        CALL EXGGV4 (IDEXO4, ISTEP4, NVARGL4, VALGV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGGVT (IDEXO, IXGLOV, ISTPB, ISTPE, VALGV, IERR)
+C
+C       READ GLOBAL VARIABLE VALUES THROUGH TIME
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IXGLOV          ! (R)
+        INTEGER ISTPB           ! (R)
+        INTEGER ISTPE           ! (R)
+        REAL VALGV (*)          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IXGLOV4       ! (R)
+        INTEGER*4 ISTPB4        ! (R)
+        INTEGER*4 ISTPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        IXGLOV4 = IXGLOV
+        ISTPB4  = ISTPB
+        ISTPE4  = ISTPE
+        CALL EXGGVT4 (IDEXO4, IXGLOV4, ISTPB4, ISTPE4, VALGV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGINF (IDEXO, INFO, IERR)
+C
+C       READ INFORMATION RECORDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER* (*) INFO (*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGINF4 (IDEXO4, INFO, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGINI (IDEXO, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
+     &          NUMNPS, NUMESS, IERR)
+C
+C       READ INITIALIZATION PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER* (*) TITLE    ! (W)
+        INTEGER NDIM            ! (W)
+        INTEGER NUMNP           ! (W)
+        INTEGER NUMEL           ! (W)
+        INTEGER NELBLK          ! (W)
+        INTEGER NUMNPS          ! (W)
+        INTEGER NUMESS          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGINI4 (IDEXO4, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
+     &          NUMNPS, NUMESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGMP (IDEXO, NNMAP, NEMAP, IERR)
+C
+C       GET MAP PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NNMAP           ! (W)
+        INTEGER NEMAP           ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NNMAP4        ! (W)
+        INTEGER*4 NEMAP4        ! (W)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGMP4 (IDEXO4, NNMAP4, NEMAP4, IERR4)
+        NNMAP = NNMAP4
+        NEMAP = NEMAP4
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPMP (IDEXO, NNMAP, NEMAP, IERR)
+C
+C       PUT MAP PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NNMAP           ! (W)
+        INTEGER NEMAP           ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NNMAP4        ! (W)
+        INTEGER*4 NEMAP4        ! (W)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NNMAP4 = NNMAP
+        NEMAP4 = NEMAP
+        CALL EXPMP4 (IDEXO4, NNMAP4, NEMAP4, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGMAP (IDEXO, MAPEL, IERR)
+C
+C       READ ELEMENT ORDER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPEL (*)       ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGMAP4 (IDEXO4, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNNM (IDEXO, MAPNOD, IERR)
+C
+C       READ NODE NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPNOD (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGNNM4 (IDEXO4, MAPNOD, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNM (IDEXO, MAPID, MAPNOD, IERR)
+C
+C       READ NODE ORDER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPID           ! (R)
+        INTEGER MAPNOD (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGNM4 (IDEXO4, MAPID, MAPNOD, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNP (IDEXO, IDNPS, NNNPS, NDNPS, IERR)
+C
+C       READ NODE SET PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPS           ! (R)
+        INTEGER NNNPS           ! (W)
+        INTEGER NDNPS           ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGNP4 (IDEXO4, IDNPS, NNNPS, NDNPS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNS (IDEXO, IDNPS, LTNNPS, IERR)
+C
+C       READ NODE SET
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPS           ! (R)
+        INTEGER LTNNPS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGNS4 (IDEXO4, IDNPS, LTNNPS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNSD (IDEXO, IDNPS, FACNPS, IERR)
+C
+C       READ NODE SET DISTRIBUTION FACTORS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPS           ! (R)
+        REAL FACNPS (*)         ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXGNSD4 (IDEXO4, IDNPS, FACNPS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNSI (IDEXO, IDNPSS, IERR)
+C
+C       READ NODE SET IDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPSS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGNSI4 (IDEXO4, IDNPSS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNV (IDEXO, ISTEP, IXNODV, NUMNP, VALNV, IERR)
+C
+C       READ NODAL VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXNODV          ! (R)
+        INTEGER NUMNP           ! (R)
+        REAL VALNV (*)          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXNODV4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        ISTEP4  = ISTEP
+        IXNODV4 = IXNODV
+        CALL EXGNV4 (IDEXO4, ISTEP4, IXNODV4, NUMNP, VALNV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNVT (IDEXO, IXNODV, NODNUM, ISTPB, ISTPE,
+     &          VALNV, IERR)
+C
+C       READ NODAL VARIABLE VALUES THROUGH TIME
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IXNODV          ! (R)
+        INTEGER NODNUM          ! (R)
+        INTEGER ISTPB           ! (R)
+        INTEGER ISTPE           ! (R)
+        REAL VALNV (*)          ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IXNODV4       ! (R)
+        INTEGER*4 ISTPB4        ! (R)
+        INTEGER*4 ISTPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        IXNODV4 = IXNODV
+        ISTPB4  = ISTPB
+        ISTPE4  = ISTPE
+        CALL EXGNVT4 (IDEXO4, IXNODV4, NODNUM, ISTPB4, ISTPE4,
+     &          VALNV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGP (IDEXO, ITYPE, ID, NAMEPR, IVAL, IERR)
+C
+C       READ OBJECT PROPERTY
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        INTEGER ID              ! (R)
+        CHARACTER* (*) NAMEPR   ! (R)
+        INTEGER IVAL            ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        CALL EXGP4 (IDEXO4, ITYPE4, ID, NAMEPR, IVAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGPA (IDEXO, ITYPE, NAMEPR, IVAL, IERR)
+C
+C       READ OBJECT PROPERTY ARRAY
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        CHARACTER* (*) NAMEPR   ! (R)
+        INTEGER IVAL (*)        ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        CALL EXGPA4 (IDEXO4, ITYPE4, NAMEPR, IVAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGPN (IDEXO, ITYPE, NAMEPR, IERR)
+C
+C       READ PROPERTY ARRAY NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        CHARACTER* (*) NAMEPR (*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        CALL EXGPN4 (IDEXO4, ITYPE4, NAMEPR, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGQA (IDEXO, QAREC, IERR)
+C
+C       READ QA RECORDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER* (*) QAREC (4,*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGQA4 (IDEXO4, QAREC, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSP (IDEXO, IDESS, NSESS, NDESS, IERR)
+C
+C       READ SIDE SET PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER NSESS           ! (W)
+        INTEGER NDESS           ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGSP4 (IDEXO4, IDESS, NSESS, NDESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSNL (IDEXO, IDESS, NNESS, IERR)
+C
+C       GET SIDE SET NODELIST LENGTH
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER NNESS           ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGSNL4 (IDEXO4, IDESS, NNESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSS (IDEXO, IDESS, LTEESS, LTSESS, IERR)
+C
+C       READ SIDE SET
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER LTEESS (*)      ! (W)
+        INTEGER LTSESS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGSS4 (IDEXO4, IDESS, LTEESS, LTSESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSSD (IDEXO, IDESS, FACESS, IERR)
+C
+C       READ SIDE SET DISTRIBUTION FACTORS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        REAL FACESS (*)         ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGSSD4 (IDEXO4, IDESS, FACESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSSI (IDEXO, IDESSS, IERR)
+C
+C       READ SIDE SET IDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESSS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGSSI4 (IDEXO4, IDESSS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSSN (IDEXO, IDESS, INCNT, LTNESS, IERR)
+C
+C       READ SIDE SET NODE LIST
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER INCNT (*)       ! (W)
+        INTEGER LTNESS (*)      ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGSSN4 (IDEXO4, IDESS, INCNT, LTNESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSSC (IDEXO, IDESS, INCNT, IERR)
+C
+C       READ SIDE SET NODE LIST COUNT
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER INCNT (*)       ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 INCNT4 (1)    ! (W)
+        POINTER (PINCNT4, INCNT4)
+        INTEGER*4 IERR4         ! (W)
+
+        integer*4 nsess4
+        integer*4 ndess4
+        INTEGER   NINCNT
+
+        IDEXO4 = IDEXO
+        CALL EXGSP4 (IDEXO4, IDESS, NSESS4, NDESS4, IERR4)
+        NINCNT = NSESS4
+        CALL I4ALLOC (NINCNT, PINCNT4)
+
+        CALL EXGSSC4 (IDEXO4, IDESS, INCNT4, IERR4)
+
+        CALL I4I8 (NINCNT, PINCNT4, INCNT)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGCSSC (IDEXO, INCNT, IERR)
+C
+C       READ CONCATENATED SIDE SET NODE COUNT LIST
+C       (nodes/face for all faces)
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER INCNT (*)       ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 INCNT4 (1)    ! (W)
+        POINTER (PINCNT4, INCNT4)
+        INTEGER*4 IERR4         ! (W)
+
+        INTEGER   NINCNT
+
+        IDEXO4 = IDEXO
+        NINCNT = EXINQI (IDEXO, EXSSEL)
+
+        CALL I4ALLOC (NINCNT, PINCNT4)
+
+        CALL EXGCSSC4 (IDEXO4, INCNT4, IERR4)
+
+        CALL I4I8 (NINCNT, PINCNT4, INCNT)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGTIM (IDEXO, NSTEP, TIME, IERR)
+C
+C       READ TIME VALUE FOR A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NSTEP           ! (R)
+        REAL TIME               ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NSTEP4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NSTEP4 = NSTEP
+        CALL EXGTIM4 (IDEXO4, NSTEP4, TIME, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGVAN (IDEXO, VARTYP, NVAR, NAMES, IERR)
+C
+C       READ RESULTS VARIABLE NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER*1 VARTYP      ! (R)
+        INTEGER NVAR            ! (R)
+        CHARACTER* (*) NAMES (*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NVAR4 = NVAR
+        CALL EXGVAN4 (IDEXO4, VARTYP, NVAR4, NAMES, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGVNM (IDEXO, VARTYP, NVAR, NAME, IERR)
+C
+C       READ RESULTS VARIABLE NAME
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER*1 VARTYP      ! (R)
+        INTEGER NVAR            ! (R)
+        CHARACTER* (*) NAME     ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NVAR4 = NVAR
+        CALL EXGVNM4 (IDEXO4, VARTYP, NVAR4, NAME, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPVNM (IDEXO, VARTYP, NVAR, NAME, IERR)
+C
+C       WRITE RESULTS VARIABLE NAME
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER*1 VARTYP      ! (R)
+        INTEGER NVAR            ! (R)
+        CHARACTER* (*) NAME     ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NVAR4 = NVAR
+        CALL EXPVNM4 (IDEXO4, VARTYP, NVAR4, NAME, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGVP (IDEXO, VARTYP, NVAR, IERR)
+C
+C       READ RESULTS VARIABLE PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER*1 VARTYP      ! (R)
+        INTEGER NVAR            ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NVAR4         ! (W)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXGVP4 (IDEXO4, VARTYP, NVAR4, IERR4)
+        NVAR = NVAR4
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGVTT (IDEXO, NELBLK, NVAREL, ISEVOK, IERR)
+C
+C       READ ELEMENT VARIABLE TRUTH TABLE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NELBLK          ! (R)
+        INTEGER NVAREL          ! (R)
+        INTEGER ISEVOK(*)       ! (NVAREL,NELBLK) (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NELBLK4       ! (R)
+        INTEGER*4 NVAREL4       ! (R)
+        INTEGER*4 ISEVOK4(1)    ! (NVAREL,NELBLK) (W)
+        POINTER (PISEVOK4, ISEVOK4)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NELBLK4 = NELBLK
+        NVAREL4 = NVAREL
+        CALL I4ALLOC (NVAREL*NELBLK, PISEVOK4)
+        CALL EXGVTT4 (IDEXO4, NELBLK4, NVAREL4, ISEVOK4, IERR4)
+        CALL I4I8 (NVAREL*NELBLK, PISEVOK4, ISEVOK)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNSTT (IDEXO, NBLK, NVAR, ISVOK, IERR)
+C
+C       READ NODESET VARIABLE TRUTH TABLE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NBLK            ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER ISVOK(*)        ! (NVAR,NBLK) (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NBLK4         ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 ISVOK4(1)     ! (NVAR,NBLK) (W)
+        POINTER (PISVOK4, ISVOK4)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NBLK4  = NBLK
+        NVAR4  = NVAR
+        CALL I4ALLOC (NVAR*NBLK, PISVOK4)
+        CALL EXGNSTT4 (IDEXO4, NBLK4, NVAR4, ISVOK4, IERR4)
+        CALL I4I8 (NVAR*NBLK, PISVOK4, ISVOK)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGSSTT (IDEXO, NBLK, NVAR, ISVOK, IERR)
+C
+C       READ SIDESET VARIABLE TRUTH TABLE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NBLK            ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER ISVOK(*)        ! (NVAR,NBLK) (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NBLK4         ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 ISVOK4(1)     ! (NVAR,NBLK) (W)
+        POINTER (PISVOK4, ISVOK4)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NBLK4  = NBLK
+        NVAR4  = NVAR
+        CALL I4ALLOC (NVAR*NBLK, PISVOK4)
+        CALL EXGSSTT4 (IDEXO4, NBLK4, NVAR4, ISVOK4, IERR4)
+        CALL I4I8 (NVAR*NBLK, PISVOK4, ISVOK)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXINQ (IDEXO, INFREQ, INTRET, RELRET, CHRRET, IERR)
+C
+C       INQUIRE EXODUS PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER INFREQ          ! (R)
+        INTEGER INTRET          ! (W)
+        REAL RELRET             ! (W)
+        CHARACTER* (*) CHRRET   ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 INFREQ4       ! (R)
+        REAL*4 RELRET4          ! (W)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        INFREQ4 = INFREQ
+        CALL EXINQ4 (IDEXO4, INFREQ4, INTRET, RELRET4, CHRRET, IERR4)
+        RELRET = RELRET4
+        IERR = IERR4
+        END
+
+        INTEGER FUNCTION EXINQI (IDEXO, INFREQ)
+C
+C       INQUIRE EXODUS PARAMETERS
+C
+        IMPLICIT NONE
+        INTEGER IDEXO           ! (R)
+        INTEGER INFREQ          ! (R)
+
+        INTEGER*4 EXINQI4
+        EXTERNAL EXINQI4
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 INFREQ4       ! (R)
+
+        IDEXO4 = IDEXO
+        INFREQ4 = INFREQ
+        EXINQI = EXINQI4 (IDEXO4, INFREQ4)
+        END
+
+        INTEGER FUNCTION EXOPEN (PATH, IMODE, ICOMPWS, IOWS, VERS, IERR)
+C
+C       OPEN EXODUS II FILE
+C
+        IMPLICIT NONE
+        CHARACTER* (*) PATH     ! (R)
+        INTEGER IMODE           ! (R)
+        INTEGER ICOMPWS         ! (RW)
+        INTEGER IOWS            ! (RW)
+        REAL VERS               ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 EXOPEN4
+        EXTERNAL EXOPEN4
+        INTEGER*4 IRET4
+        INTEGER IRET
+        INTEGER*4 IMODE4        ! (R)
+        INTEGER*4 ICOMPWS4      ! (RW)
+        INTEGER*4 IOWS4         ! (RW)
+        REAL*4 VERS4            ! (W)
+        INTEGER*4 IERR4         ! (W)
+        INTEGER*4 IFLAG4
+
+C ... This is hardwired instead of getting from exodusII.inc due to compiler errors about
+C     exopen/excre already having a type...        
+        integer EX_MAPS_INT64_API
+        integer EX_BULK_INT64_API
+        integer EX_IDS_INT64_API
+        integer EX_INQ_INT64_API
+        parameter (EX_MAPS_INT64_API=   8192) ! All maps (id, order, ...) store int64_t values
+        parameter (EX_IDS_INT64_API =  16384) ! All entity ids
+        parameter (EX_BULK_INT64_API=  32768) ! All integer bulk data
+        parameter (EX_INQ_INT64_API =  65536) ! All integer inquire arguments
+
+        IMODE4 = IMODE
+
+C ... This needs to be set explicitly since all wrapper routines
+C     are passing REAL*8 and the exo_jack.c routines all take double*
+        ICOMPWS4 = 8
+        IOWS4 = IOWS
+
+C ... All wrapper routines are passing INTEGER*8, but at this 
+C     time, only the maps are supported...
+        IFLAG4 = EX_MAPS_INT64_API+EX_IDS_INT64_API+EX_BULK_INT64_API+
+     *    EX_INQ_INT64_API
+        IMODE4 = IOR(IMODE4, IFLAG4)
+
+        IRET4 = EXOPEN4 (PATH, IMODE4, ICOMPWS4, IOWS4, VERS4, IERR4)
+        ICOMPWS = ICOMPWS4
+        IOWS = IOWS4
+        VERS = VERS4
+        IERR = IERR4
+        IRET = IRET4
+        EXOPEN = IRET
+        END
+
+        INTEGER FUNCTION EXLGMD (IDEXO)
+        IMPLICIT NONE
+        INTEGER IDEXO           ! (R)
+        INTEGER IRET
+
+        INTEGER*4 EXLGMD4
+        EXTERNAL  EXLGMD4
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IRET4
+
+        IDEXO4 = IDEXO
+        IRET4  = EXLGMD4(IDEXO4)
+        IRET   = IRET4
+        EXLGMD = IRET
+        END
+
+        SUBROUTINE EXOPTS (OPTVAL, IERR)
+C
+C       SET ERROR REPORTING LEVEL
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER OPTVAL          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 OPTVAL4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        OPTVAL4 = OPTVAL
+        CALL EXOPTS4 (OPTVAL4, IERR4)
+        IERR = IERR4
+        END
+
+
+        SUBROUTINE EXMXNM (IDEXO, LENGTH, IERR)
+C
+C       SET MAXIMUM NAME LENGTH
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER LENGTH          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 LENGTH4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        LENGTH4 = LENGTH
+        CALL EXMXNM4 (IDEXO4, LENGTH4, IERR4)
+        IERR = IERR4
+        END
+
+
+        SUBROUTINE EXPCNS (IDEXO, IDNPSS, NNNPS, NDNPS, IXNNPS,
+     &          IXDNPS, LTNNPS, FACNPS, IERR)
+C
+C       WRITE CONCATENATED NODE SETS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPSS (*)      ! (R)
+        INTEGER NNNPS (*)       ! (R)
+        INTEGER NDNPS (*)       ! (R)
+        INTEGER IXNNPS (*)      ! (R)
+        INTEGER IXDNPS (*)      ! (R)
+        INTEGER LTNNPS (*)      ! (R)
+        REAL FACNPS (*)         ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPCNS4 (IDEXO4, IDNPSS, NNNPS, NDNPS, IXNNPS,
+     &          IXDNPS, LTNNPS, FACNPS, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPCON (IDEXO, NAMECO, IERR)
+C
+C       WRITE COORDINATE NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER* (*) NAMECO (*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPCON4 (IDEXO4, NAMECO, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPCOR (IDEXO, XN, YN, ZN, IERR)
+C
+C       WRITE NODAL COORDINATES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        REAL XN (*)             ! (R)
+        REAL YN (*)             ! (R)
+        REAL ZN (*)             ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPCOR4 (IDEXO4, XN, YN, ZN, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPCSS (IDEXO, IDESSS, NSESS, NDESS, IXEESS,
+     &          IXDESS, LTEESS, LTSESS, FACESS, IERR)
+C
+C       WRITE CONCATENATED SIDE SETS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESSS (*)      ! (R)
+        INTEGER NSESS (*)       ! (R)
+        INTEGER NDESS (*)       ! (R)
+        INTEGER IXEESS (*)      ! (R)
+        INTEGER IXDESS (*)      ! (R)
+        INTEGER LTEESS (*)      ! (R)
+        INTEGER LTSESS (*)      ! (R)
+        REAL FACESS (*)         ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPCSS4 (IDEXO4, IDESSS, NSESS, NDESS, IXEESS,
+     &          IXDESS, LTEESS, LTSESS, FACESS, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPEAT (IDEXO, IDELB, ATRIB, IERR)
+C
+C       WRITE ELEMENT BLOCK ATTRIBUTES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        REAL ATRIB(*)           ! (NUMATR,NUMELB) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPEAT4 (IDEXO4, IDELB, ATRIB, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPEAN (IDEXO, IDELB, NATTR, NAMES, IERR)
+C
+C       WRITE ELEMENT BLOCK ATTRIBUTE NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER NATTR           ! (R)
+        CHARACTER* (*) NAMES (*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NATTR4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NATTR4 = NATTR
+
+        CALL EXPEAN4 (IDEXO4, IDELB, NATTR4, NAMES, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPCLB (IDEXO, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, MKMAP, IERR)
+C
+C       WRITE ELEMENT BLOCK PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB(*)        ! (R)
+        CHARACTER*(*) NAMELB(*) ! (R)
+        INTEGER NUMELB(*)       ! (R)
+        INTEGER NUMLNK(*)       ! (R)
+        INTEGER NUMATR(*)       ! (R)
+        INTEGER MKMAP           ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 MKMAP4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        MKMAP4  = MKMAP
+
+        CALL EXPCLB4 (IDEXO4, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, MKMAP4, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPELB (IDEXO, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, IERR)
+C
+C       WRITE ELEMENT BLOCK PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        CHARACTER* (*) NAMELB   ! (R)
+        INTEGER NUMELB          ! (R)
+        INTEGER NUMLNK          ! (R)
+        INTEGER NUMATR          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPELB4 (IDEXO4, IDELB, NAMELB, NUMELB, NUMLNK,
+     &          NUMATR, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPELC (IDEXO, IDELB, LINK, IERR)
+C
+C       WRITE ELEMENT BLOCK CONNECTIVITY
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER LINK (*)        ! (NUMLNK,NUMELB) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPELC4 (IDEXO4, IDELB, LINK, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPECPP (IDEXO, ITYPE, IDELB, COUNTS, IERR)
+C
+C       WRITE ELEMENT BLOCK ELEMENT COUNT PER POLYHEDRA
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER COUNTS (*)      ! (NUMELB) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 COUNTS4 (1)   ! (NUMELB) ! (R)
+        POINTER (PCOUNTS4, COUNTS4)
+        INTEGER*4 IERR4         ! (W)
+
+        CHARACTER* (MXSTLN) NAMELB
+
+        INTEGER   NUMELB
+        INTEGER   NUMLNK
+        INTEGER   NUMATR
+        
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+
+        CALL EXGELB4 (IDEXO4, IDELB, NAMELB, NUMELB, NUMLNK,
+     &    NUMATR, IERR4)
+
+        CALL I8I4 (NUMELB, COUNTS, PCOUNTS4)
+        CALL EXPECPP4 (IDEXO4, ITYPE4, IDELB, COUNTS4, IERR4)
+        CALL I4FREE (PCOUNTS4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPENM (IDEXO, MAPEL, IERR)
+C
+C       WRITE ELEMENT NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPEL (*)       ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPENM4 (IDEXO4, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPEM (IDEXO, MAPID, MAPEL, IERR)
+C
+C       WRITE ELEMENT NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPID           ! (R)
+        INTEGER MAPEL (*)       ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPEM4 (IDEXO4, MAPID, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPPEM (IDEXO, MAPID, ISTART, ICOUNT, MAPEL, IERR)
+C
+C       WRITE ELEMENT NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPID           ! (R)
+        INTEGER ISTART          ! (R)
+        INTEGER ICOUNT          ! (R)
+        INTEGER MAPEL (*)       ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+
+        CALL EXPPEM4 (IDEXO4, MAPID, ISTART, ICOUNT, MAPEL, IERR4)
+
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPEV (IDEXO, ISTEP, IXELEV, IDELB, NUMELB,
+     &          VALEV, IERR)
+C
+C       WRITE ELEMENT VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXELEV          ! (R)
+        INTEGER IDELB           ! (R)
+        INTEGER NUMELB          ! (R)
+        REAL VALEV (*)          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXELEV4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        ISTEP4  = ISTEP
+        IXELEV4 = IXELEV
+        CALL EXPEV4 (IDEXO4, ISTEP4, IXELEV4, IDELB, NUMELB,
+     &          VALEV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNSV (IDEXO, ISTEP, IXV, ID, NUM, VAL, IERR)
+C
+C       WRITE NODESET VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXV             ! (R)
+        INTEGER ID              ! (R)
+        INTEGER NUM             ! (R)
+        REAL VAL (*)            ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXV4  ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        ISTEP4  = ISTEP
+        IXV4 = IXV
+        CALL EXPNSV4 (IDEXO4, ISTEP4, IXV4, ID, NUM, VAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPSSV (IDEXO, ISTEP, IXV, ID, NUM, VAL, IERR)
+C
+C       WRITE SIDESET VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXV             ! (R)
+        INTEGER ID              ! (R)
+        INTEGER NUM             ! (R)
+        REAL VAL (*)            ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXV4  ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        ISTEP4  = ISTEP
+        IXV4 = IXV
+        CALL EXPSSV4 (IDEXO4, ISTEP4, IXV4, ID, NUM, VAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPGV (IDEXO, ISTEP, NVARGL, VALGV, IERR)
+C
+C       WRITE GLOBAL VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER NVARGL          ! (R)
+        REAL VALGV (*)          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 NVARGL4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ISTEP4 = ISTEP
+        NVARGL4 = NVARGL
+        CALL EXPGV4 (IDEXO4, ISTEP4, NVARGL4, VALGV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPINF (IDEXO, NINFO, INFO, IERR)
+C
+C       WRITE INFORMATION RECORDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NINFO           ! (R)
+        CHARACTER* (*) INFO (*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NINFO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NINFO4 = NINFO
+        CALL EXPINF4 (IDEXO4, NINFO4, INFO, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPINI (IDEXO, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
+     &          NUMNPS, NUMESS, IERR)
+C
+C       WRITE INITIALIZATION PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER* (*) TITLE    ! (R)
+        INTEGER NDIM            ! (R)
+        INTEGER NUMNP           ! (R)
+        INTEGER NUMEL           ! (R)
+        INTEGER NELBLK          ! (R)
+        INTEGER NUMNPS          ! (R)
+        INTEGER NUMESS          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPINI4 (IDEXO4, TITLE, NDIM, NUMNP, NUMEL, NELBLK,
+     &          NUMNPS, NUMESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPMAP (IDEXO, MAPEL, IERR)
+C
+C       WRITE ELEMENT ORDER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPEL (*)       ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPMAP4 (IDEXO4, MAPEL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNNM (IDEXO, MAPNOD, IERR)
+C
+C       WRITE NODE NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPNOD (*)      ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPNNM4 (IDEXO4, MAPNOD, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNM (IDEXO, MAPID, MAPNOD, IERR)
+C
+C       WRITE NODE NUMBER MAP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER MAPID           ! (R)
+        INTEGER MAPNOD (*)      ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPNM4 (IDEXO4, MAPID, MAPNOD, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNP (IDEXO, IDNPS, NNNPS, NDNPS, IERR)
+C
+C       WRITE NODE SET PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPS           ! (R)
+        INTEGER NNNPS           ! (R)
+        INTEGER NDNPS           ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPNP4 (IDEXO4, IDNPS, NNNPS, NDNPS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNS (IDEXO, IDNPS, LTNNPS, IERR)
+C
+C       WRITE NODE SET
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPS           ! (R)
+        INTEGER LTNNPS (*)      ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPNS4 (IDEXO4, IDNPS, LTNNPS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNSD (IDEXO, IDNPS, FACNPS, IERR)
+C
+C       WRITE NODE SET DISTRIBUTION FACTORS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDNPS           ! (R)
+        REAL FACNPS (*)         ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPNSD4 (IDEXO4, IDNPS, FACNPS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNV (IDEXO, ISTEP, IXNODV, NUMNP, VALNV, IERR)
+C
+C       WRITE NODAL VARIABLE VALUES AT A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ISTEP           ! (R)
+        INTEGER IXNODV          ! (R)
+        INTEGER NUMNP           ! (R)
+        REAL VALNV (*)          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ISTEP4        ! (R)
+        INTEGER*4 IXNODV4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4  = IDEXO
+        ISTEP4  = ISTEP
+        IXNODV4 = IXNODV
+        CALL EXPNV4 (IDEXO4, ISTEP4, IXNODV4, NUMNP, VALNV, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPP (IDEXO, ITYPE, ID, NAMEPR, IVAL, IERR)
+C
+C       WRITE OBJECT PROPERTY
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        INTEGER ID              ! (R)
+        CHARACTER* (*) NAMEPR   ! (R)
+        INTEGER IVAL            ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        CALL EXPP4 (IDEXO4, ITYPE4, ID, NAMEPR, IVAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPPA (IDEXO, ITYPE, NAMEPR, IVAL, IERR)
+C
+C       WRITE OBJECT PROPERTY ARRAY
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        CHARACTER* (*) NAMEPR   ! (R)
+        INTEGER IVAL (*)        ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        CALL EXPPA4 (IDEXO4, ITYPE4, NAMEPR, IVAL, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPPN (IDEXO, ITYPE, NPROPS, NAMEPR, IERR)
+C
+C       WRITE PROPERTY ARRAY NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER ITYPE           ! (R)
+        INTEGER NPROPS          ! (R)
+        CHARACTER* (*) NAMEPR (*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 NPROPS4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        NPROPS4 = NPROPS
+        CALL EXPPN4 (IDEXO4, ITYPE4, NPROPS4, NAMEPR, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPQA (IDEXO, NQAREC, QAREC, IERR)
+C
+C       WRITE QA RECORDS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NQAREC          ! (R)
+        CHARACTER* (*) QAREC (4,*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NQAREC4       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NQAREC4 = NQAREC
+        CALL EXPQA4 (IDEXO4, NQAREC4, QAREC, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPSP (IDEXO, IDESS, NSESS, NDESS, IERR)
+C
+C       WRITE SIDE SET PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER NSESS           ! (R)
+        INTEGER NDESS           ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPSP4 (IDEXO4, IDESS, NSESS, NDESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPSS (IDEXO, IDESS, LTEESS, LTSESS, IERR)
+C
+C       WRITE SIDE SET
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        INTEGER LTEESS (*)      ! (R)
+        INTEGER LTSESS (*)      ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPSS4 (IDEXO4, IDESS, LTEESS, LTSESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPSSD (IDEXO, IDESS, FACESS, IERR)
+C
+C       WRITE SIDE SET DISTRIBUTION FACTORS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IDESS           ! (R)
+        REAL FACESS (*)         ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXPSSD4 (IDEXO4, IDESS, FACESS, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPTIM (IDEXO, NSTEP, TIME, IERR)
+C
+C       WRITE TIME VALUE FOR A TIME STEP
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NSTEP           ! (R)
+        REAL TIME               ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NSTEP4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NSTEP4 = NSTEP
+        CALL EXPTIM4 (IDEXO4, NSTEP4, TIME, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPVAN (IDEXO, VARTYP, NVAR, NAMES, IERR)
+C
+C       WRITE RESULTS VARIABLE NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER*1 VARTYP      ! (R)
+        INTEGER NVAR            ! (R)
+        CHARACTER* (*) NAMES (*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NVAR4 = NVAR
+        CALL EXPVAN4 (IDEXO4, VARTYP, NVAR4, NAMES, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPVP (IDEXO, VARTYP, NVAR, IERR)
+C
+C       WRITE RESULTS VARIABLE PARAMETERS
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        CHARACTER*1 VARTYP      ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NVAR4 = NVAR
+        CALL EXPVP4 (IDEXO4, VARTYP, NVAR4, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPVTT (IDEXO, NELBLK, NVAREL, ISEVOK, IERR)
+C
+C       WRITE ELEMENT VARIABLE TRUTH TABLE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NELBLK          ! (R)
+        INTEGER NVAREL          ! (R)
+        INTEGER ISEVOK (*)      ! (NVAREL,NELBLK) (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NELBLK4       ! (R)
+        INTEGER*4 NVAREL4       ! (R)
+        INTEGER*4 ISEVOK4 (1)   ! (NVAREL,NELBLK) (R)
+        POINTER (PISEVOK4, ISEVOK4)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NELBLK4 = NELBLK
+        NVAREL4 = NVAREL
+        CALL I8I4 (NVAREL*NELBLK, ISEVOK, PISEVOK4)
+        CALL EXPVTT4 (IDEXO4, NELBLK4, NVAREL4, ISEVOK4, IERR4)
+        CALL I4FREE (PISEVOK4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNSTT (IDEXO, NBLK, NVAR, ISVOK, IERR)
+C
+C       WRITE NODESET VARIABLE TRUTH TABLE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NBLK            ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER ISVOK (*)       ! (NVAR,NBLK) (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NBLK4 ! (R)
+        INTEGER*4 NVAR4 ! (R)
+        INTEGER*4 ISVOK4 (1)    ! (NVAR,NBLK) (R)
+        POINTER (PISVOK4, ISVOK4)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NBLK4 = NBLK
+        NVAR4 = NVAR
+        CALL I8I4 (NVAR*NBLK, ISVOK, PISVOK4)
+        CALL EXPNSTT4 (IDEXO4, NBLK4, NVAR4, ISVOK4, IERR4)
+        CALL I4FREE (PISVOK4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPSSTT (IDEXO, NBLK, NVAR, ISVOK, IERR)
+C
+C       WRITE SIDESET VARIABLE TRUTH TABLE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NBLK            ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER ISVOK (*)       ! (NVAR,NBLK) (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 NBLK4 ! (R)
+        INTEGER*4 NVAR4 ! (R)
+        INTEGER*4 ISVOK4 (1)    ! (NVAR,NBLK) (R)
+        POINTER (PISVOK4, ISVOK4)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        NBLK4 = NBLK
+        NVAR4 = NVAR
+        CALL I8I4 (NVAR*NBLK, ISVOK, PISVOK4)
+        CALL EXPSSTT4 (IDEXO4, NBLK4, NVAR4, ISVOK4, IERR4)
+        CALL I4FREE (PISVOK4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXGNAMS (IDEXO, ITYPE, NVAR, NAMES, IERR)
+C
+C       READ OBJECT NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER ITYPE           ! (R)
+        CHARACTER* (*) NAMES (*) ! (W)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        NVAR4 = NVAR
+        CALL EXGNAMS4 (IDEXO4, ITYPE4, NVAR4, NAMES, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXPNAMS (IDEXO, ITYPE, NVAR, NAMES, IERR)
+C
+C       WRITE OBJECT NAMES
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER NVAR            ! (R)
+        INTEGER ITYPE           ! (R)
+        CHARACTER* (*) NAMES (*) ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 ITYPE4        ! (R)
+        INTEGER*4 NVAR4         ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        ITYPE4 = ITYPE
+        NVAR4 = NVAR
+        CALL EXPNAMS4 (IDEXO4, ITYPE4, NVAR4, NAMES, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXUPDA (IDEXO, IERR)
+C
+C       UPDATE EXODUS II FILE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO           ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO4        ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO4 = IDEXO
+        CALL EXUPDA4 (IDEXO4, IERR4)
+        IERR = IERR4
+        END
+
+        SUBROUTINE EXCOPY (IDEXO1, IDEXO2, IERR)
+C
+C       COPY EXODUS II FILE
+C
+        IMPLICIT NONE
+        INCLUDE 'exodusII.inc'
+        INTEGER IDEXO1          ! (R)
+        INTEGER IDEXO2          ! (R)
+        INTEGER IERR            ! (W)
+
+        INTEGER*4 IDEXO14       ! (R)
+        INTEGER*4 IDEXO24       ! (R)
+        INTEGER*4 IERR4         ! (W)
+
+        IDEXO14 = IDEXO1
+        IDEXO24 = IDEXO2
+        CALL EXCOPY4 (IDEXO14, IDEXO24, IERR4)
+        IERR = IERR4
+        END
+
+
+C-----------------------------------------------------------------------
+C
+C   Get initial information from nemesis file
+C
+      subroutine exgii (idexo, nproc, nproc_in_f, ftype, ierr)
+      implicit none
+      integer idexo 
+      integer nproc 
+      integer nproc_in_f 
+      character*(*) ftype 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 nproc4 
+      integer*4 nproc_in_f4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgii4 (idexo4, nproc4, nproc_in_f4, ftype, ierr4)
+      nproc = nproc4
+      nproc_in_f = nproc_in_f4
+      ierr = ierr4
+C       
+      end
+      
+C-----------------------------------------------------------------------
+C
+C   Write initial information from nemesis file
+C
+      subroutine expii (idexo, nproc, nproc_in_f, ftype, ierr)
+      implicit none
+      integer idexo 
+      integer nproc 
+      integer nproc_in_f 
+      character*(*) ftype 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 nproc4 
+      integer*4 nproc_in_f4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      nproc4 = nproc
+      nproc_in_f4 = nproc_in_f
+      call expii4 (idexo4, nproc4, nproc_in_f4, ftype, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read initial global information
+C
+      subroutine exgig (idexo, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr)
+      implicit none
+      integer idexo 
+      integer nnodes_g 
+      integer nelems_g 
+      integer nelem_blks_g 
+      integer nnode_sets_g 
+      integer nside_sets_g 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgig4 (idexo4, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write initial global information
+C
+      subroutine expig (idexo, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr)
+      implicit none
+      integer idexo 
+      integer nnodes_g 
+      integer nelems_g 
+      integer nelem_blks_g 
+      integer nnode_sets_g 
+      integer nside_sets_g 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expig4 (idexo4, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read load balance parameters
+C
+      subroutine exglbp (idexo, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor, ierr)
+      implicit none
+      integer idexo 
+      integer nint_nodes 
+      integer nbor_nodes 
+      integer next_nodes 
+      integer nint_elems 
+      integer nbor_elems 
+      integer nnode_cmaps 
+      integer nelem_cmaps 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call exglbp4 (idexo4, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write load balance parameters
+C
+      subroutine explbp (idexo, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor, ierr)
+      implicit none
+      integer idexo 
+      integer nint_nodes 
+      integer nbor_nodes 
+      integer next_nodes 
+      integer nint_elems 
+      integer nbor_elems 
+      integer nnode_cmaps 
+      integer nelem_cmaps 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call explbp4 (idexo4, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write concatenated load balance parameters
+C
+      subroutine explbpc (idexo, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps, ierr)
+      implicit none
+      integer idexo 
+      integer nint_nodes(*) 
+      integer nbor_nodes(*) 
+      integer next_nodes(*) 
+      integer nint_elems(*) 
+      integer nbor_elems(*) 
+      integer nnode_cmaps(*) 
+      integer nelem_cmaps(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call explbpc4 (idexo4, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read global node set parameters
+C
+      subroutine exgnspg (idexo, ns_ids_glob, ns_n_cnt_glob,
+     $  ns_df_cnt_glob, ierr)
+      implicit none
+      integer idexo 
+      integer ns_ids_glob(*) 
+      integer ns_n_cnt_glob(*) 
+      integer ns_df_cnt_glob(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnspg4 (idexo4, ns_ids_glob, ns_n_cnt_glob,
+     $  ns_df_cnt_glob, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write global node set parameters
+C
+      subroutine expnspg (idexo, global_ids, global_n_cnts,
+     $  global_df_cnts, ierr)
+      integer idexo 
+      integer global_ids(*) 
+      integer global_n_cnts(*) 
+      integer global_df_cnts(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnspg4 (idexo4, global_ids, global_n_cnts,
+     $  global_df_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read global side set parameters
+C
+      subroutine exgsspg (idexo, ss_ids_glob, ss_n_cnt_glob,
+     $  ss_df_cnt_glob, ierr)
+      implicit none
+      integer idexo 
+      integer ss_ids_glob(*) 
+      integer ss_n_cnt_glob(*) 
+      integer ss_df_cnt_glob(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgsspg4 (idexo4, ss_ids_glob, ss_n_cnt_glob,
+     $  ss_df_cnt_glob, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write global side set parameters
+C
+      subroutine expsspg (idexo, global_ids, global_el_cnts,
+     $  global_df_cnts, ierr)
+      implicit none
+      integer idexo 
+      integer global_ids(*) 
+      integer global_el_cnts(*) 
+      integer global_df_cnts(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expsspg4 (idexo4, global_ids, global_el_cnts,
+     $  global_df_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read global element block information
+C
+      subroutine exgebig (idexo, el_blk_ids, el_blk_cnts, ierr)
+      implicit none
+      integer idexo 
+      integer el_blk_ids(*) 
+      integer el_blk_cnts(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgebig4 (idexo4, el_blk_ids, el_blk_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write global element block information
+C
+      subroutine expebig (idexo, el_blk_ids, el_blk_cnts, ierr)
+      implicit none
+      integer idexo 
+      integer el_blk_ids(*) 
+      integer el_blk_cnts(*) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expebig4 (idexo4, el_blk_ids, el_blk_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read side set element list and side set side list
+C
+      subroutine exgnss (idexo, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr)
+      implicit none
+      integer idexo 
+      integer ss_id 
+      integer start_side_num 
+      integer num_sides 
+      integer ss_elem_list(num_sides) 
+      integer ss_side_list(num_sides) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnss4 (idexo4, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write side set element list and side set side list
+C
+      subroutine expnss (idexo, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr)
+      implicit none
+      integer idexo 
+      integer ss_id 
+      integer start_side_num 
+      integer num_sides 
+      integer ss_elem_list(num_sides) 
+      integer ss_side_list(num_sides) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnss4 (idexo4, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read side set distribution factor
+C
+      subroutine exgnssd (idexo, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr)
+      implicit none
+      integer idexo 
+      integer ss_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ss_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnssd4 (idexo4, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write side set distribution factor
+C
+      subroutine expnssd (idexo, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr)
+      implicit none
+      integer idexo 
+      integer ss_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ss_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnssd4 (idexo4, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read node set list for a single node set
+C
+      subroutine exgnns (idexo, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr)
+      implicit none
+      integer idexo 
+      integer ns_id 
+      integer start_node_num 
+      integer num_node 
+      integer ns_node_list(num_node) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnns4 (idexo4, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write node set list for a single node set
+C
+      subroutine expnns (idexo, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr)
+      implicit none
+      integer idexo 
+      integer ns_id 
+      integer start_node_num 
+      integer num_node 
+      integer ns_node_list(num_node) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnns4 (idexo4, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read node set distribution factor
+C
+      subroutine exgnnsd (idexo, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr)
+      implicit none
+      integer idexo 
+      integer ns_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ns_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnnsd4 (idexo4, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write node set distribution factor
+C
+      subroutine expnnsd (idexo, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr)
+      implicit none
+      integer idexo 
+      integer ns_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ns_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnnsd4 (idexo4, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read coordinates of the nodes
+C
+      subroutine exgncor (idexo, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr)
+      implicit none
+      integer idexo 
+      integer start_node_num 
+      integer num_nodes 
+      real x_coor(num_nodes) 
+      real y_coor(num_nodes) 
+      real z_coor(num_nodes) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgcor4 (idexo4, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write coordinates of the nodes
+C
+      subroutine expncor (idexo, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr)
+      implicit none
+      integer idexo 
+      integer start_node_num 
+      integer num_nodes 
+      real x_coor(num_nodes) 
+      real y_coor(num_nodes) 
+      real z_coor(num_nodes) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expcor4 (idexo4, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read an element blocks connectivity list
+C
+      subroutine exgnec (idexo, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr)
+      implicit none
+      integer idexo 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      integer connect(num_elems) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnec4 (idexo4, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write an element blocks connectivity list
+C
+      subroutine expnec (idexo, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr)
+      implicit none
+      integer idexo 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      integer connect(num_elems) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnec4 (idexo4, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read an element blocks attributes
+C
+      subroutine exgneat (idexo, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr)
+      implicit none
+      integer idexo 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      real attrib(num_elems) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgneat4 (idexo4, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write an element blocks attributes
+C
+      subroutine expneat (idexo, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr)
+      implicit none
+      integer idexo 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      real attrib(num_elems) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expneat4 (idexo4, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr4)
+      ierr = ierr4
+C
+      end
+C
+C-----------------------------------------------------------------------
+C  Read the element type for a specific element block
+C
+      subroutine exgelt (idexo, elem_blk_id, elem_type, ierr)
+      implicit none
+      integer idexo 
+      integer elem_blk_id 
+      character*(*) elem_type 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgelt4 (idexo4, elem_blk_id, elem_type, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read a variable for an element block
+C
+      subroutine exgnev (idexo, time_step, elem_var_index,
+     $  elem_blk_id, num_elem_this_blk, start_elem_num,
+     $  num_elem, elem_var_vals, ierr)
+      implicit none
+      integer idexo 
+      integer time_step 
+      integer elem_var_index 
+      integer elem_blk_id 
+      integer num_elem_this_blk 
+      integer start_elem_num 
+      integer num_elem 
+      real elem_var_vals(num_elem) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 time_step4 
+      integer*4 elem_var_index4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      time_step4 = time_step
+      elem_var_index4 = elem_var_index
+      call exgnev4 (idexo4, time_step4, elem_var_index4,
+     $  elem_blk_id, num_elem_this_blk, start_elem_num,
+     $  num_elem, elem_var_vals, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write a variable slab for an element block
+C
+      subroutine expevs (idexo, time_step, elem_var_index,
+     $  elem_blk_id, start_pos, num_vals, elem_var_vals,
+     $  ierr)
+      implicit none
+      integer idexo 
+      integer time_step 
+      integer elem_var_index 
+      integer elem_blk_id 
+      integer start_pos 
+      integer num_vals 
+      real elem_var_vals(num_vals) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 time_step4 
+      integer*4 elem_var_index4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      time_step4 = time_step
+      elem_var_index4 = elem_var_index
+      call expevs4 (idexo4, time_step4, elem_var_index4,
+     $  elem_blk_id, start_pos, num_vals, elem_var_vals,
+     $  ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the values of a single nodal variable for a single time step
+C
+      subroutine exgnnv (idexo, time_step, nodal_var_index,
+     $  start_node_num, num_nodes, nodal_vars, ierr)
+      implicit none
+      integer idexo 
+      integer time_step 
+      integer nodal_var_index 
+      integer start_node_num 
+      integer num_nodes 
+      real nodal_vars(num_nodes) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 time_step4 
+      integer*4 nodal_var_index4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      time_step4 = time_step
+      nodal_var_index4 = nodal_var_index
+      call exgnnv4 (idexo4, time_step4, nodal_var_index4,
+     $  start_node_num, num_nodes, nodal_vars, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write nodal variable slab
+C
+      subroutine expnvs (idexo, time_step, nodal_var_index,
+     $  start_pos, num_vals, nodal_var_vals, ierr)
+      implicit none
+      integer idexo 
+      integer time_step 
+      integer nodal_var_index 
+      integer start_pos 
+      integer num_vals 
+      real nodal_var_vals(num_vals) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 time_step4 
+      integer*4 nodal_var_index4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      time_step4 = time_step
+      nodal_var_index4 = nodal_var_index
+      call expnvs4 (idexo4, time_step4, nodal_var_index4,
+     $  start_pos, num_vals, nodal_var_vals, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the element numbering map
+C
+      subroutine exgnenm (idexo, starte, num_ent, elem_map, ierr)
+      implicit none
+      integer idexo 
+      integer starte 
+      integer num_ent 
+      integer elem_map(num_ent) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnenm4 (idexo4, starte, num_ent, elem_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the element numbering map
+C
+      subroutine expnenm (idexo, starte, num_ent, elem_map, ierr)
+      implicit none
+      integer idexo 
+      integer starte 
+      integer num_ent 
+      integer elem_map(num_ent) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnenm4 (idexo4, starte, num_ent, elem_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the node numbering map
+C
+      subroutine exgnnnm (idexo, startn, num_ent, node_map, ierr)
+      implicit none
+      integer idexo 
+      integer startn 
+      integer num_ent 
+      integer node_map(num_ent) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call exgnnnm4 (idexo4, startn, num_ent, node_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the node numbering map
+C
+      subroutine expnnnm (idexo, startn, num_ent, node_map, ierr)
+      implicit none
+      integer idexo 
+      integer startn 
+      integer num_ent 
+      integer node_map(num_ent) 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expnnnm4 (idexo4, startn, num_ent, node_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the node map for a processor
+C
+      subroutine exgnmp (idexo, node_mapi, node_mapb, node_mape,
+     $  processor, ierr)
+      implicit none
+      integer idexo 
+      integer node_mapi(*) 
+      integer node_mapb(*) 
+      integer node_mape(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call exgnmp4 (idexo4, node_mapi, node_mapb, node_mape,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write a node map for a processor
+C
+      subroutine expnmp (idexo, node_mapi, node_mapb, node_mape,
+     $  processor, ierr)
+      implicit none
+      integer idexo 
+      integer node_mapi(*) 
+      integer node_mapb(*) 
+      integer node_mape(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call expnmp4 (idexo4, node_mapi, node_mapb, node_mape,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the element map for a processor
+C
+      subroutine exgemp (idexo, elem_mapi, elem_mapb, processor, ierr)
+      implicit none
+      integer idexo 
+      integer elem_mapi(*) 
+      integer elem_mapb(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call exgemp4 (idexo4, elem_mapi, elem_mapb, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the element map for a processor
+C
+      subroutine expemp (idexo, elem_mapi, elem_mapb, processor, ierr)
+      implicit none
+      integer idexo 
+      integer elem_mapi(*) 
+      integer elem_mapb(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call expemp4 (idexo4, elem_mapi, elem_mapb, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the communications map parameters for a single processor
+C
+      subroutine exgcmp (idexo, ncmap_ids, ncmap_node_cnts,
+     $  ecmap_ids, ecmap_elem_cnts, processor, ierr)
+      implicit none
+      integer idexo 
+      integer ncmap_ids(*) 
+      integer ncmap_node_cnts(*) 
+      integer ecmap_ids(*) 
+      integer ecmap_elem_cnts(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call exgcmp4 (idexo4, ncmap_ids, ncmap_node_cnts,
+     $  ecmap_ids, ecmap_elem_cnts, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the communications map parameters for a single processor
+C
+      subroutine expcmp (idexo, nmap_ids, nmap_node_cnts, emap_ids,
+     $  emap_elem_cnts, processor, ierr)
+      implicit none
+      integer idexo 
+      integer nmap_ids(*) 
+      integer nmap_node_cnts(*) 
+      integer emap_ids(*) 
+      integer emap_elem_cnts(*) 
+      integer processor 
+      integer ierr
+
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call expcmp4 (idexo4, nmap_ids, nmap_node_cnts, emap_ids,
+     $  emap_elem_cnts, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the communications map parameters for all processors
+C
+      subroutine expcmpc (idexo, nmap_ids, nmap_node_cnts,
+     $  nproc_ptrs, emap_ids, emap_elem_cnts, eproc_ptrs, ierr)
+      implicit none
+      integer idexo 
+      integer nmap_ids(*) 
+      integer nmap_node_cnts(*) 
+      integer nproc_ptrs(*) 
+      integer emap_ids(*) 
+      integer emap_elem_cnts(*) 
+      integer eproc_ptrs(*) 
+      integer ierr
+      
+      integer*4 idexo4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      call expcmpc4 (idexo4, nmap_ids, nmap_node_cnts,
+     $  nproc_ptrs, emap_ids, emap_elem_cnts, eproc_ptrs, ierr4)
+      ierr = ierr4
+      
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the nodal communications map for a single processor
+C
+      subroutine exgncm (idexo, map_id, node_ids, proc_ids,
+     $  processor, ierr)
+      implicit none
+      integer idexo 
+      integer map_id 
+      integer node_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call exgncm4 (idexo4, map_id, node_ids, proc_ids,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the nodal communications map for a single processor
+C
+      subroutine expncm (idexo, map_id, node_ids, proc_ids,
+     $  processor, ierr)
+      implicit none
+      integer idexo 
+      integer map_id 
+      integer node_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call expncm4 (idexo4, map_id, node_ids, proc_ids,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the elemental communications map for a single processor
+C
+      subroutine exgecm (idexo, map_id, elem_ids, side_ids,
+     $  proc_ids, processor, ierr)
+      implicit none
+      integer idexo 
+      integer map_id 
+      integer elem_ids(*) 
+      integer side_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idexo4 = idexo
+      processor4 = processor
+      call exgecm4 (idexo4, map_id, elem_ids, side_ids,
+     $  proc_ids, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the elemental communications map for a single processor
+C
+      subroutine expecm (idexo, map_id, elem_ids, side_ids,
+     $  proc_ids, processor, ierr)
+      implicit none
+      integer idexo 
+      integer map_id 
+      integer elem_ids(*) 
+      integer side_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+
+      integer*4 idexo4 
+      integer*4 processor4 
+      integer*4 ierr4
+
+      idexo4 = idexo
+      processor4 = processor
+      call expecm4 (idexo4, map_id, elem_ids, side_ids,
+     $  proc_ids, processor4, ierr4)
+      ierr = ierr4
+
+         end
+C-----------------------------------------------------------------------
+
+        SUBROUTINE I8I4 (N, I8, PI4)
+C
+C       CREATE I4 ARRAY AND COPY I8 ARRAY CONTENTS TO I4
+C
+        IMPLICIT NONE
+        INTEGER N
+        INTEGER I8 (*)
+        INTEGER*4 I4 (1)
+        POINTER (PI4, I4)
+        INTEGER I
+
+        CALL I4ALLOC (N, PI4)
+        DO I = 1, N
+                I4 (I) = I8 (I)
+        END DO
+        END
+
+        SUBROUTINE I4I8 (N, PI4, I8)
+C
+C       COPY I4 ARRAY CONTENTS TO I8 AND FREE I4 ARRAY
+C
+        IMPLICIT NONE
+        INTEGER   N
+        INTEGER*4 I4 (1)
+        POINTER (PI4, I4)
+        INTEGER I8 (*)
+        INTEGER I
+
+        DO I = 1, N
+                I8 (I) = I4 (I)
+        END DO
+        CALL I4FREE (PI4)
+        END
+
+        SUBROUTINE I4ALLOC (N, PI4)
+C
+C       ALLOCATE DYNAMIC I4 ARRAY N ELEMENTS IN SIZE
+C
+        IMPLICIT NONE
+        INTEGER N
+        INTEGER*4 I4 (1)
+        POINTER (PI4, I4)
+        INTEGER MALLOC
+        INTEGER NB
+
+        PI4 = 0
+        IF (N .EQ. 0) RETURN
+        NB = N * 4
+        PI4 = MALLOC (NB)
+        if (PI4 .EQ. 0) then
+          write (*,*)
+     *      'ERROR: Unable to allocate array of size ',N,' in I4ALLOC'
+          stop 'Exodus Memory Allocation Error'
+        end if
+        END
+
+        SUBROUTINE I4FREE (PI4)
+C
+C       FREE DYNAMIC MEMORY ASSOCIATED WITH I4 ARRAY REFERENCED BY PI4
+C
+        IMPLICIT NONE
+        INTEGER*4 I4 (1)
+        POINTER (PI4, I4)
+
+        IF (PI4 .EQ. 0) RETURN
+#ifndef __XLF__
+        CALL FREE (PI4)
+#endif
+        PI4 = 0
+        END
+#endif
diff --git a/exodus/forbind/src/exo_jack-windows.c b/exodus/forbind/src/exo_jack-windows.c
new file mode 100644
index 0000000..b78ec90
--- /dev/null
+++ b/exodus/forbind/src/exo_jack-windows.c
@@ -0,0 +1,4166 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/*
+ * OVERVIEW
+ *
+ * This file contains jacket routines written in C for interfacing Fortran
+ * ExodusII function calls to the actual C binding for ExodusII.
+
+ * In general, these functions handle
+ * character-string parameter conventions, convert between
+ * column-major-order arrays and row-major-order arrays, and map between
+ * array indices beginning at one and array indices beginning at zero.
+ *
+ */
+
+/* LINTLIBRARY */
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "netcdf.h"
+#include "exodusII.h"
+#include "exodusII_int.h"
+
+/*
+ * The Build64 is for the "normal" SEACAS build which uses compiler
+ * options to change reals and integers into 8-byte quantities.  The
+ * routines in addrwrap.F are used to down-convert the 8-byte integers
+ * into 4-byte integers which then call through to the routines in
+ * this file which have a '4' or '4_' appended to the routine name.
+ * These routines then call through to the C API routines.
+ *
+ * If DEFAULT_REAL_INT is defined, then the build is to build a
+ * fortran library interface that takes 4-byte ints and either 4-byte
+ * or 8-byte floating point (real/double) variables. In this case, the
+ * addrwrap routines are not built and a fortran client will call the
+ * routines in this file directly.
+ *
+ */
+
+#if defined(Build64) && !defined(DEFAULT_REAL_INT)
+/* 64-bit */
+#define real double
+#define entity_id ex_entity_id
+#ifdef ADDC_
+#define F2C(name) name##4_
+#else
+#define F2C(name) name##4
+#endif
+
+#else
+/* 32-bit */
+#define real float
+#define entity_id int
+#ifdef ADDC_
+#define F2C(name) name##_
+#else
+#define F2C(name) name
+#endif
+#endif
+
+extern int      ncopts;         /* default is (NC_FATAL | NC_VERBOSE) */
+extern int      exerrval;       /* global integer that contains a
+                                 * Exodus-specific error code */
+
+/* blank fill C string to make FORTRAN string */
+static void
+ex_fcdcpy(char *fstring,        /* output string to be blank-filled */
+          int fslen,            /* length of output string */
+          char *sstring)
+{                               /* input string, null-terminated */
+  int             i, len;
+
+  if (sstring != NULL) {
+    len = strlen(sstring);
+    if (len > fslen)
+      len = fslen;
+
+    for (i = 0; i < len; i++)
+      *(fstring + i) = *(sstring + i);
+    for (i = len; i < fslen; i++)
+      *(fstring + i) = ' ';
+  } else {
+    for (i = 0; i < fslen; i++)
+      *(fstring + i) = ' ';
+  }
+}
+
+/* copy function used to copy strings and strip trailing blanks */
+static void
+ex_fstrncpy(char *target,       /* space to be copied into */
+            char *source,       /* string to be copied */
+            int maxlen)
+{                               /* maximum length of *source */
+  int             len = maxlen;
+
+  while (len-- && *source != '\0')
+    *target++ = *source++;
+
+  len = maxlen;
+  while (len-- && *(--target) == ' ');  /* strip blanks */
+  *(++target) = '\0';           /* insert new EOS marker */
+}
+
+/* copy function used to copy strings terminated with blanks */
+static void
+ex_nstrncpy(char *target,       /* space to be copied into */
+            char *source,       /* string to be copied */
+            int maxlen)
+{                               /* maximum length of *source */
+  while (maxlen-- && *source != ' ')
+    *target++ = *source++;
+  *target = '\0';
+}
+
+/* Above are utility functions used below                                   */
+/* ======================================================================== */
+/* Below are the exodus API functions                                       */
+/*
+ * Adding a new function:
+ * +  Protect the name with the f2c (uppercase) macro which will add/not add '4' and or '_'
+ *    depending on the compilation mode.
+ *
+ * +  float/double arguments are declared as 'real' which will be replaced with float or double.
+ *
+ * +  If there are any character arguments 'X', then add an int* argument 'Xlen' at end of argument list
+ *    This will contain the length of the passed in character argument.
+ *
+ * +  Look at existing functions for guidance...
+ */
+
+/*
+ * create an EXODUS II file
+ */
+int
+F2C(EXCRE) (char *path,
+            int *clobmode,
+            int *cpu_word_size,
+            int *io_word_size,
+            int *ierr,
+            int pathlen)
+{
+  char           *name;
+  int             idexo;
+
+  if (!(name = malloc((pathlen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return (EX_FATAL);
+  }
+  (void) ex_nstrncpy(name, path, pathlen);
+
+  if ((idexo = ex_create(name, *clobmode, cpu_word_size, io_word_size)) != EX_FATAL) {
+    free(name);
+    *ierr = 0;
+    return (idexo);
+  }
+  free(name);
+  *ierr = exerrval;
+  return (EX_FATAL);
+}
+
+/*
+ * open an EXODUS II file
+ */
+int
+F2C(EXOPEN) (char *path,
+             int *mode,
+             int *cpu_word_size,
+             int *io_word_size,
+             float *version,    /* This is float always; not real */
+             int *ierr,
+             int pathlen)
+{
+  char           *name;
+  int             idexo;
+
+  if (!(name = malloc((pathlen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return (EX_FATAL);
+  }
+  (void) ex_nstrncpy(name, path, pathlen);
+  if ((idexo = ex_open(name, *mode, cpu_word_size, io_word_size, version)) != EX_FATAL) {
+    free(name);
+    *ierr = 0;
+    return (idexo);
+  }
+  free(name);
+  *ierr = EX_FATAL;
+  return (EX_FATAL);
+}
+
+/*
+ * close an EXODUS II file
+ */
+void
+F2C(EXCLOS) (int *idexo, int *ierr)
+{
+  *ierr = ex_close(*idexo);
+}
+
+/*
+ * update an EXODUS II file
+ */
+void
+F2C(EXUPDA) (int *idexo, int *ierr)
+{
+  *ierr = ex_update(*idexo);
+}
+
+/*
+ * write initialization parameters
+ */
+void
+F2C(EXPINI) (int *idexo,
+             char *title,
+             void_int *num_dim,
+             void_int *num_nodes,
+             void_int *num_elem,
+             void_int *num_elem_blk,
+             void_int *num_node_sets,
+             void_int *num_side_sets,
+             int *ierr,
+             int titlelen)
+{
+  int             slen;
+  char           *name;
+
+  slen = MAX_LINE_LENGTH;       /* max line size */
+// AIS
+  printf("%i\n",slen);
+  printf("%i\n",titlelen);
+  if (titlelen != MAX_LINE_LENGTH) {
+    slen = titlelen;
+  }
+  name = malloc((slen + 1) * sizeof(char));
+  (void) ex_fstrncpy(name, title, slen);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t *n_dim 	 = num_dim;
+    int64_t *n_nodes 	 = num_nodes;
+    int64_t *n_elem  	 = num_elem;
+    int64_t *n_elem_blk  = num_elem_blk;
+    int64_t *n_node_sets = num_node_sets;
+    int64_t *n_side_sets = num_side_sets;
+// AIS
+    printf("I am in then");
+// AIF
+    *ierr = ex_put_init(*idexo, name, *n_dim, *n_nodes, *n_elem,
+			*n_elem_blk, *n_node_sets, *n_side_sets);
+// AIS
+    printf("%i\n",*ierr);
+// AIF
+  } else {
+    int *n_dim 	     = num_dim;
+    int *n_nodes     = num_nodes;
+    int *n_elem      = num_elem;
+    int *n_elem_blk  = num_elem_blk;
+    int *n_node_sets = num_node_sets;
+    int *n_side_sets = num_side_sets;
+// AIS
+    printf("I am in else");
+// AIF
+    *ierr = ex_put_init(*idexo, name, *n_dim, *n_nodes, *n_elem,
+			*n_elem_blk, *n_node_sets, *n_side_sets);
+  }
+  free(name);
+}
+
+/*
+ * read initialization parameters
+ */
+void
+F2C(EXGINI) (int *idexo,
+             char *title,
+             void_int *num_dim,
+             void_int *num_nodes,
+             void_int *num_elem,
+             void_int *num_elem_blk,
+             void_int *num_node_sets,
+             void_int *num_side_sets,
+             int *ierr,
+             int titlelen)
+{
+  int             slen;
+  char           *name;
+
+  *ierr = 0;
+  slen = MAX_LINE_LENGTH;       /* max line size */
+  if (titlelen != MAX_LINE_LENGTH) {
+    slen = titlelen;
+  }
+  name = malloc((slen + 1) * sizeof(char));
+  memset(name, 0, slen + 1);
+
+  *ierr = ex_get_init(*idexo, name, num_dim, num_nodes, num_elem, num_elem_blk,
+                      num_node_sets, num_side_sets);
+
+  ex_fcdcpy(title, slen, name);
+  free(name);
+}
+
+/*
+ * write QA records
+ */
+void
+F2C(EXPQA) (int *idexo,
+            int *num_qa_records,
+            char *qa_record,
+            int *ierr,
+            int qa_recordlen)
+{
+  char            errmsg[MAX_ERR_LENGTH];
+  char          **sptr;         /* internal string pointer array for malloc
+                                 * use */
+  int             i, ii, iii, slen, alen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (qa_recordlen != MAX_STR_LENGTH) {
+    slen = qa_recordlen;
+  }
+  alen = 4;                     /* qa records are 4 strings deep */
+
+  /* Allocate space for the name ptr array */
+  if (!(sptr = malloc(((*num_qa_records) * alen + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate space for each of the strings, where size = slen, place
+   * ptr into str ptr array,  and Copy Fortran qa records to staging
+   * space
+   */
+  iii = 0;                      /* offset counter */
+  for (i = 0; i < *num_qa_records; i++) {
+    for (ii = 0; ii < alen; ii++) {
+      *(sptr + iii) = malloc((slen + 1) * sizeof(char));
+      if (*(sptr + iii) == 0) {
+        free(sptr);             /* free up array ptr space */
+        *ierr = EX_MEMFAIL;
+        sprintf(errmsg,
+          "Error: failed to allocate space for qa record %d for file id %d",
+                i, *idexo);
+        ex_err("expqa", errmsg, EX_MEMFAIL);
+        return;
+      }
+      /* copy fortran string into allocated space */
+      ex_fstrncpy(*(sptr + iii), qa_record + iii * qa_recordlen, slen);
+      iii++;                    /* bump char array pointer */
+    }
+  }
+  *(sptr + iii) = 0;            /* set last pointer to null */
+
+  if (ex_put_qa(*idexo, *num_qa_records, (void *) sptr) == EX_FATAL)
+    *ierr = EX_FATAL;
+
+  /* Free up the space we used */
+  iii = 0;
+  for (i = 0; i < *num_qa_records; i++) {
+    for (ii = 0; ii < alen; ii++) {
+      free(*(sptr + iii));      /* First free up string space */
+      iii++;
+    }
+  }
+  free(sptr);                   /* Then free up array ptr space */
+}
+
+/*
+ * read QA records
+ */
+void
+F2C(EXGQA) (int *idexo,
+            char *qa_record,
+            int *ierr,
+            int qa_recordlen)
+{
+  int             num_qa_records;
+  char          **sptr;         /* internal string pointer array for malloc
+                                 * use */
+  int             i, ii, iii, slen, alen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (qa_recordlen != MAX_STR_LENGTH) {
+    slen = qa_recordlen;
+  }
+  alen = 4;                     /* qa records are 4 strings deep */
+
+  /* do ExodusII C call to find out how many qa records are avail */
+  num_qa_records = ex_inquire_int(*idexo, EX_INQ_QA);
+
+  /* Allocate space for the QA string ptr array */
+  if (!(sptr = malloc((num_qa_records * alen + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Step 1: Allocate space for each of the strings, where size = slen,
+   * place string ptr into str ptr array. Step 2: Call routine to get
+   * qa records Step 3: Copy C qa records to passed Fortran array space
+   */
+
+  iii = 0;                      /* offset counter */
+  for (i = 0; i < num_qa_records; i++) {        /* pointer allocation loop */
+    for (ii = 0; ii < alen; ii++) {
+      *(sptr + iii) = malloc((slen + 1) * sizeof(char));
+      if (*(sptr + iii) == 0) {
+        *ierr = EX_MEMFAIL;
+        return;
+      }
+      iii++;                    /* bump char array pointer */
+    }
+  }
+  *(sptr + iii) = 0;            /* null out last pointer */
+
+  /* do ExodusII C call to get qa records */
+  if (ex_get_qa(*idexo, (void *) sptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    return;
+  }
+  iii = 0;                      /* offset counter */
+  for (i = 0; i < num_qa_records; i++) {        /* string copy loop */
+    for (ii = 0; ii < alen; ii++) {
+      /* copy fortran string into allocated space */
+      ex_fcdcpy(qa_record + iii * qa_recordlen, slen, *(sptr + iii));
+      iii++;                    /* bump char array pointer */
+    }
+  }
+
+  /* Free up the space we used */
+  iii = 0;
+  for (i = 0; i < num_qa_records; i++) {
+    for (ii = 0; ii < alen; ii++) {
+      free(*(sptr + iii));      /* First free up string space */
+      iii++;
+    }
+  }
+  free(sptr);                   /* Then free up array ptr space */
+}
+
+/*
+ * write information records
+ */
+void
+F2C(EXPINF) (int *idexo,
+             int *num_info,
+             char *info,
+             int *ierr,
+             int infolen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+  slen = MAX_LINE_LENGTH;       /* max str size */
+  if (infolen != MAX_LINE_LENGTH) {
+    slen = infolen;
+  }
+  /* Allocate space for the string ptr array */
+  if (!(aptr = malloc(((*num_info) + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the info records */
+  if (!(sptr = malloc(*num_info * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy Fortran info records to staging space */
+  for (i = 0; i < *num_info; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), info + i * infolen, slen); /* copy string into
+                                                         * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+  if (ex_put_info(*idexo, *num_info, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* Free up string staging area */
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * read information records
+ */
+void
+F2C(EXGINF) (int *idexo,
+             char *info,
+             int *ierr,
+             int infolen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen, num_info;
+
+  *ierr = 0;                    /* default no errror */
+
+  /* do exodusII C call to find out how many info records are avail */
+  num_info = ex_inquire_int(*idexo, EX_INQ_INFO);
+
+  slen = MAX_LINE_LENGTH;       /* max str size */
+  if (infolen != MAX_LINE_LENGTH) {
+    slen = infolen;
+  }
+  /*
+   * Step 1: Allocate space for string ptr array Step 2: Allocate space
+   * for info record strings, and put pointers into str ptr array Step
+   * 3: Do ExodusII call to get records Step 4: Copy strings into
+   * passed Fortran buffer space
+   */
+
+  /* Allocate space for the string ptr array */
+  if (!(aptr = malloc((num_info + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate block of space for info strings */
+  if (!(sptr = malloc(num_info * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  for (i = 0; i < num_info; i++)/* Put pointers to the info records in ptr
+                                 * array */
+    *(aptr + i) = sptr + i * (slen + 1);        /* put ptr in string ptr
+                                                 * array */
+  *(aptr + i) = 0;              /* null out last pointer */
+
+  /* Do exodusII call to get info records */
+  if (ex_get_info(*idexo, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);
+    free(aptr);
+    return;
+  }
+  for (i = 0; i < num_info; i++) {      /* Copy Fortran info records to
+                                         * staging space */
+    ex_fcdcpy(info + i * infolen, slen, *(aptr + i));   /* copy string into
+                                                         * buffer */
+    /** printf("[exginf] rec: %d , %s\n",i,*(aptr+i)); **/
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+
+}
+
+/*
+ * write nodal coordinates
+ */
+void
+F2C(EXPCOR) (int *idexo,
+             real * x_coor,
+             real * y_coor,
+             real * z_coor,
+             int *ierr)
+{
+  *ierr = ex_put_coord(*idexo, x_coor, y_coor, z_coor);
+}
+
+/*
+ * read nodal coordinates
+ */
+void
+F2C(EXGCOR) (int *idexo,
+             real * x_coor,
+             real * y_coor,
+             real * z_coor,
+             int *ierr)
+{
+  *ierr = ex_get_coord(*idexo, x_coor, y_coor, z_coor);
+}
+
+/*
+ * write coordinate names
+ */
+void
+F2C(EXPCON) (int *idexo,
+             char *coord_names,
+             int *ierr,
+             int coord_nameslen)
+{
+  char          **aptr;         /* internal array of string pointers for
+                                 * malloc use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, ndim, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (coord_nameslen < slen) {
+    slen = coord_nameslen;
+  }
+  /* do ExodusII C call to find out how many dimensions  */
+  ndim = ex_inquire_int(*idexo, EX_INQ_DIM);
+
+  /* Allocate space for the name ptr array */
+  if (!(aptr = malloc((ndim + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate a block of space for the strings, where size = slen,
+   * place ptrs into str ptr array,  and Copy Fortran coordinate names
+   * to staging space
+   */
+
+  if (!(sptr = malloc(ndim * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);
+    return;
+  }
+  for (i = 0; i < ndim; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);
+    /* copy fortran string into allocated space */
+    ex_fstrncpy(*(aptr + i), coord_names + i * coord_nameslen, slen);
+  }
+  *(aptr + i) = 0;              /* set last pointer to null */
+
+  if (ex_put_coord_names(*idexo, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  /* Free up the space we used */
+  free(sptr);                   /* First free up string space */
+  free(aptr);                   /* Then free up array ptr space */
+}
+/*
+ * read coordinate names
+ */
+void
+F2C(EXGCON) (int *idexo,
+             char *coord_names,
+             int *ierr,
+             int coord_nameslen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             ndim;
+  int             i, slen;
+
+  *ierr = 0;                    /* default no error */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (coord_nameslen < slen) {
+    slen = coord_nameslen;
+  }
+  /* do ExodusII C call to find out how many dimensions */
+  ndim = ex_inquire_int(*idexo, EX_INQ_DIM);
+
+  /* allocate memory to stage the coordinate name ptrs into */
+  if (!(aptr = malloc((ndim + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* allocate a block of memory to stage the coordinate names into */
+  if (!(sptr = malloc(ndim * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* free up array ptr space */
+    return;
+  }
+  for (i = 0; i < ndim; i++) {  /* put pointers to staging space into ptr
+                                 * array */
+    *(aptr + i) = sptr + i * (slen + 1);
+  }
+
+  /* do ExodusII C call to get coord name records */
+  if (ex_get_coord_names(*idexo, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up string space */
+    free(aptr);                 /* free up array ptr space */
+    return;
+  }
+  /* copy C strings to Fortran arrays */
+  memset(coord_names, 0, ndim * coord_nameslen);
+  for (i = 0; i < ndim; i++) {
+    ex_fcdcpy(coord_names + i * coord_nameslen, slen, *(aptr + i));     /* copy and blank fill */
+  }
+
+  free(sptr);                   /* Free up string buffer space */
+  free(aptr);                   /* Finally, free up array ptr space */
+  return;
+}
+
+/*
+ * write element order map
+ */
+void
+F2C(EXPMAP) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_put_map(*idexo, elem_map);
+}
+
+/*
+ * read element order map
+ */
+void
+F2C(EXGMAP) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_get_map(*idexo, elem_map);
+}
+
+/*
+ * write concatenated element block parameters
+ */
+void
+F2C(EXPCLB) (int *idexo,
+             void_int *elem_blk_id,
+             char *elem_type,
+             void_int *num_elem_this_blk,
+             void_int *num_nodes_per_elem,
+             void_int *num_attr,
+             int *create_maps,
+             int *ierr,
+             int elem_typelen)
+{
+  size_t          num_elem_blk;
+
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  size_t          i, slen;
+
+  *ierr = 0;                    /* default no error */
+
+  num_elem_blk = ex_inquire_int(*idexo, EX_INQ_ELEM_BLK);
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (elem_typelen != MAX_STR_LENGTH) {
+    slen = elem_typelen;
+  }
+  /* allocate memory for pointer array */
+  if (!(aptr = malloc((num_elem_blk + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* allocate memory to stage the element type name into */
+  if (!(sptr = malloc(num_elem_blk * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy element type names from Fortran array to staging area */
+  for (i = 0; i < num_elem_blk; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), elem_type + i * elem_typelen, slen);       /* copy string into
+                                                                         * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  if (ex_put_concat_elem_block(*idexo, elem_blk_id, aptr, num_elem_this_blk,
+                  num_nodes_per_elem, num_attr, *create_maps) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+  free(aptr);
+}
+
+/*
+ * write element block parameters
+ */
+void
+F2C(EXPELB) (int *idexo,
+             entity_id *elem_blk_id,
+             char *elem_type,
+             void_int *num_elem_this_blk,
+             void_int *num_nodes_per_elem,
+             void_int *num_attr,
+             int *ierr,
+             int elem_typelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;                    /* default no error */
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (elem_typelen != MAX_STR_LENGTH) {
+    slen = elem_typelen;
+  }
+  /* allocate memory to stage the element type name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy element type names from Fortran array to staging area */
+  ex_fstrncpy(sptr, elem_type, slen);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t *n_elem_this_blk  = num_elem_this_blk;
+    int64_t *n_nodes_per_elem = num_nodes_per_elem;
+    int64_t *n_attr           = num_attr;
+
+    *ierr = ex_put_elem_block(*idexo, *elem_blk_id, sptr, *n_elem_this_blk,
+			      *n_nodes_per_elem, *n_attr);
+  } else {
+    int *n_elem_this_blk  = num_elem_this_blk;
+    int *n_nodes_per_elem = num_nodes_per_elem;
+    int *n_attr           = num_attr;
+
+    *ierr = ex_put_elem_block(*idexo, *elem_blk_id, sptr, *n_elem_this_blk,
+			      *n_nodes_per_elem, *n_attr);
+  }
+  free(sptr);
+}
+
+/*
+ * read element block parameters
+ */
+void
+F2C(EXGELB) (int *idexo,
+             entity_id *elem_blk_id,
+             char *elem_type,
+             void_int *num_elem_this_blk,
+             void_int *num_nodes_per_elem,
+             void_int *num_attr,
+             int *ierr,
+             int elem_typelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (elem_typelen != MAX_STR_LENGTH) {
+    slen = elem_typelen;
+  }
+  /* allocate memory to stage the element type names into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  if (ex_get_elem_block(*idexo, *elem_blk_id, sptr, num_elem_this_blk,
+                        num_nodes_per_elem, num_attr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    return;
+  }
+  /* Copy element type name from staging area to Fortran array */
+  memset(elem_type, 0, elem_typelen);
+  ex_fcdcpy(elem_type, slen, sptr);
+  free(sptr);
+
+}
+
+/*
+ * read element blocks IDs
+ */
+void
+F2C(EXGEBI) (int *idexo,
+             void_int *elem_blk_ids,
+             int *ierr)
+{
+  *ierr = ex_get_elem_blk_ids(*idexo, elem_blk_ids);
+}
+
+/*
+ * write element block connectivity
+ */
+void
+F2C(EXPELC) (int *idexo,
+             entity_id *elem_blk_id,
+             void_int *connect,
+             int *ierr)
+{
+  *ierr = ex_put_elem_conn(*idexo, *elem_blk_id, connect);
+}
+
+/*
+ * read element block connectivity
+ */
+void
+F2C(EXGELC) (int *idexo,
+             entity_id *elem_blk_id,
+             void_int *connect,
+             int *ierr)
+{
+  *ierr = ex_get_elem_conn(*idexo, *elem_blk_id, connect);
+}
+
+/*
+ * write entity count-per-polyhedra information for nsided block
+ */
+void
+F2C(EXPECPP) (int *idexo,
+              int *obj_type,
+              entity_id *elem_blk_id,
+              int *counts,
+              int *ierr)
+{
+  *ierr = ex_put_entity_count_per_polyhedra(*idexo, (ex_entity_type) * obj_type, *elem_blk_id, counts);
+}
+
+/*
+ * read entity count-per-polyhedra information for nsided block
+ */
+void
+F2C(EXGECPP) (int *idexo,
+              int *obj_type,
+              entity_id *elem_blk_id,
+              int *counts,
+              int *ierr)
+{
+  *ierr = ex_get_entity_count_per_polyhedra(*idexo, (ex_entity_type) * obj_type, *elem_blk_id, counts);
+}
+
+/*
+ * write element block attributes
+ */
+void
+F2C(EXPEAT) (int *idexo,
+             entity_id *elem_blk_id,
+             real * attrib,
+             int *ierr)
+{
+  *ierr = ex_put_elem_attr(*idexo, *elem_blk_id, attrib);
+}
+
+
+/*
+ * read element block attributes
+ */
+void
+F2C(EXGEAT) (int *idexo,
+             entity_id *elem_blk_id,
+             real * attrib,
+             int *ierr)
+{
+  *ierr = ex_get_elem_attr(*idexo, *elem_blk_id, attrib);
+}
+
+/*
+ * read element block attribute names
+ */
+void
+F2C(EXGEAN) (int *idexo,
+             entity_id *elem_blk_id,
+             int *num_attr,
+             char *names,
+             int *ierr,
+             int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_attr + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_attr * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  for (i = 0; i < *num_attr; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  *ierr = 0;
+  if (ex_get_elem_attr_names(*idexo, *elem_blk_id, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    free(aptr);
+  }
+  /* Copy Fortran names from staging space */
+  memset(names, 0, *num_attr * nameslen);
+  for (i = 0; i < *num_attr; i++) {
+    ex_fcdcpy(names + i * nameslen, slen, *(aptr + i)); /* copy str into Fortran
+                                                         * buffer */
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write element block attribute names
+ */
+void
+F2C(EXPEAN) (int *idexo,
+             entity_id *elem_blk_id,
+             int *num_attr,
+             char *names,
+             int *ierr,
+             int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_attr + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_attr * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  /* Copy Fortran names to staging space */
+  for (i = 0; i < *num_attr; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), names + i * nameslen, slen);       /* copy string into
+                                                                 * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  *ierr = 0;
+  if (ex_put_elem_attr_names(*idexo, *elem_blk_id, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write object names
+ */
+void
+F2C(EXPNAMS) (int *idexo,
+              int *type,
+              int *num_obj,
+              char *names,
+              int *ierr,
+              int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory for pointer array */
+  if (!(aptr = malloc((*num_obj + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_obj * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy Fortran names to staging space */
+  for (i = 0; i < *num_obj; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), names + i * nameslen, slen);       /* copy string into
+                                                                 * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+  /* do ExodusII C call to write results variables names */
+  if (ex_put_names(*idexo, (ex_entity_type) * type, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * read object names
+ */
+void
+F2C(EXGNAMS) (int *idexo,
+              int *type,
+              int *num_obj,
+              char *names,
+              int *ierr,
+              int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_obj + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_obj * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  for (i = 0; i < *num_obj; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  /* do ExodusII C call to read results variables names */
+  if (ex_get_names(*idexo, (ex_entity_type) * type, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    free(aptr);
+    return;
+  }
+  /* Copy Fortran names from staging space */
+  memset(names, 0, *num_obj * nameslen);
+  for (i = 0; i < *num_obj; i++) {
+    ex_fcdcpy(names + i * nameslen, slen, *(aptr + i)); /* copy str into Fortran
+                                                         * buffer */
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write property array names
+ */
+void
+F2C(EXPPN) (int *idexo,
+            int *obj_type,
+            int *num_props,
+            char *prop_names,
+            int *ierr,
+            int prop_nameslen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (prop_nameslen < slen) {
+    slen = prop_nameslen;
+  }
+  /* Allocate space for the name ptr array */
+  if (!(aptr = malloc((*num_props + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate a block of space for the strings, where size = slen,
+   * place ptrs into str ptr array,  and Copy Fortran coordinate names
+   * to staging space
+   */
+
+  if (!(sptr = malloc((*num_props) * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);
+    return;
+  }
+  for (i = 0; i < *num_props; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);
+    /* copy fortran string into allocated space */
+    ex_fstrncpy(*(aptr + i), prop_names + i * prop_nameslen, slen);
+  }
+  *(aptr + i) = 0;              /* set last pointer to null */
+
+  if (ex_put_prop_names(*idexo, (ex_entity_type) * obj_type, *num_props, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  /* Free up the space we used */
+  free(sptr);                   /* First free up string space */
+  free(aptr);                   /* Then free up array ptr space */
+}
+
+
+/*
+ * read property array names
+ */
+void
+F2C(EXGPN) (int *idexo,
+            int *obj_type,
+            char *prop_names,
+            int *ierr,
+            int prop_nameslen)
+{
+  char            errmsg[MAX_ERR_LENGTH];
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen;
+  ex_inquiry      inq_code;
+  int             num_props;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (prop_nameslen < slen) {
+    slen = prop_nameslen;
+  }
+  switch ((ex_entity_type) * obj_type) {
+  case EX_ELEM_BLOCK:
+    inq_code = EX_INQ_EB_PROP;
+    break;
+  case EX_NODE_SET:
+    inq_code = EX_INQ_NS_PROP;
+    break;
+  case EX_SIDE_SET:
+    inq_code = EX_INQ_SS_PROP;
+    break;
+  case EX_ELEM_MAP:
+    inq_code = EX_INQ_EM_PROP;
+    break;
+  case EX_NODE_MAP:
+    inq_code = EX_INQ_NM_PROP;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    *ierr = EX_BADPARAM;
+    sprintf(errmsg, "Error: object type %d not supported; file id %d",
+            *obj_type, *idexo);
+    ex_err("exgpn", errmsg, exerrval);
+    return;
+  }
+
+
+  /* do ExodusII C call to find out how many properties */
+  num_props = ex_inquire_int(*idexo, inq_code);
+
+  /* Allocate space for the name ptr array */
+  if (!(aptr = malloc((num_props + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate a block of space for the strings, where size = slen,
+   * place ptrs into str ptr array,  and Copy Fortran coordinate names
+   * to staging space
+   */
+
+  if (!(sptr = malloc(num_props * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);
+    return;
+  }
+  memset(sptr, 0, num_props * (slen + 1));
+
+  for (i = 0; i < num_props; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put ptrs to staging space
+                                                 * into ptr array */
+  *(aptr + i) = 0;              /* set last pointer to null */
+
+  /* do ExodusII C call to get property name records */
+  if (ex_get_prop_names(*idexo, (ex_entity_type) * obj_type, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up string space */
+    free(aptr);                 /* free up array ptr space */
+    return;
+  }
+  /* copy C strings to Fortran arrays */
+  memset(prop_names, 0, num_props * prop_nameslen);
+  for (i = 0; i < num_props; i++) {
+    ex_fcdcpy(prop_names + i * prop_nameslen, slen, *(aptr + i));       /* copy and blank fill */
+  }
+
+  /* Free up the space we used */
+  free(sptr);                   /* First free up string space */
+  free(aptr);                   /* Then free up array ptr space */
+}
+
+/*
+ * write object property
+ */
+void
+F2C(EXPP) (int *idexo,
+           int *obj_type,
+           entity_id *obj_id,
+           char *prop_name,
+           entity_id *value,
+           int *ierr,
+           int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+  *ierr = ex_put_prop(*idexo, (ex_entity_type) * obj_type, *obj_id, sptr, *value);
+
+  free(sptr);
+}
+
+/*
+ * read object property
+ */
+void
+F2C(EXGP) (int *idexo,
+           int *obj_type,
+           entity_id *obj_id,
+           char *prop_name,
+           void_int *value,
+           int *ierr,
+           int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+  }
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+  /* use exodusII C routine to get the property value */
+  if (ex_get_prop(*idexo, (ex_entity_type) * obj_type, *obj_id, sptr, value) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+}
+
+/*
+ * read object property array
+ */
+void
+F2C(EXGPA) (int *idexo,
+            int *obj_type,
+            char *prop_name,
+            void_int *values,
+            int *ierr,
+            int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+  }
+  memset(sptr, 0, slen + 1);
+
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+
+  /* use exodusII C routine to get the values array */
+  if (ex_get_prop_array(*idexo, (ex_entity_type) * obj_type, sptr, values) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+}
+
+/*
+ * write object property array
+ */
+void
+F2C(EXPPA) (int *idexo,
+            int *obj_type,
+            char *prop_name,
+            void_int *values,
+            int *ierr,
+            int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+  }
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+
+  /* Use exodusII C routine to store the property values */
+  if (ex_put_prop_array(*idexo, (ex_entity_type) * obj_type, sptr, values) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+}
+
+/*
+ * write node set parameters
+ */
+void
+F2C(EXPNP) (int *idexo,
+            entity_id *node_set_id,
+            void_int *num_nodes_in_set,
+            void_int *num_dist_in_set,
+            int *ierr)
+{
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t nnis = *(int64_t*)num_nodes_in_set;
+    int64_t ndis = *(int64_t*)num_dist_in_set;
+    *ierr = ex_put_node_set_param(*idexo, *node_set_id, nnis, ndis);
+  } else {
+    int nnis = *(int*)num_nodes_in_set;
+    int ndis = *(int*)num_dist_in_set;
+    *ierr = ex_put_node_set_param(*idexo, *node_set_id, nnis, ndis);
+  }
+}
+
+/*
+ * read node set parameters
+ */
+void
+F2C(EXGNP) (int *idexo,
+            entity_id *node_set_id,
+            void_int *num_nodes_in_set,
+            void_int *num_dist_in_set,
+            int *ierr)
+{
+  *ierr = ex_get_node_set_param(*idexo, *node_set_id, num_nodes_in_set, num_dist_in_set);
+}
+
+/*
+ * write node set
+ */
+void
+F2C(EXPNS) (int *idexo,
+            entity_id *node_set_id,
+            void_int *node_set_node_list,
+            int *ierr)
+{
+  *ierr = ex_put_node_set(*idexo, *node_set_id, node_set_node_list);
+}
+
+/*
+ * write node set dist factors
+ */
+void
+F2C(EXPNSD) (int *idexo,
+             entity_id *node_set_id,
+             real * node_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_put_node_set_dist_fact(*idexo, *node_set_id, node_set_dist_fact);
+}
+
+/*
+ * read node set
+ */
+void
+F2C(EXGNS) (int *idexo,
+            entity_id *node_set_id,
+            void_int *node_set_node_list,
+            int *ierr)
+{
+  *ierr = ex_get_node_set(*idexo, *node_set_id, node_set_node_list);
+}
+
+/*
+ * read node set dist factors
+ */
+void
+F2C(EXGNSD) (int *idexo,
+             entity_id *node_set_id,
+             real * node_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_get_node_set_dist_fact(*idexo, *node_set_id, node_set_dist_fact);
+}
+
+
+/*
+ * read node sets IDs
+ */
+void
+F2C(EXGNSI) (int *idexo,
+             void_int *node_set_ids,
+             int *ierr)
+{
+  *ierr = ex_get_node_set_ids(*idexo, node_set_ids);
+}
+
+/*
+ * write concatenated node sets
+ */
+void
+F2C(EXPCNS) (int *idexo,
+             void_int *node_set_ids,
+             void_int *num_nodes_per_set,
+             void_int *num_dist_per_set,
+             void_int *node_sets_node_index,
+             void_int *node_sets_dist_index,
+             void_int *node_sets_node_list,
+             real * node_sets_dist_fact,
+             int *ierr)
+{
+  size_t num_node_sets, i;
+  int int_size;
+
+  void_int *node_index_ptr, *dist_index_ptr;
+
+  *ierr = 0;
+
+  num_node_sets = ex_inquire_int(*idexo, EX_INQ_NODE_SETS);
+
+  int_size = sizeof(int);
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int_size = sizeof(int64_t);
+  }
+  
+  /* allocate memory for C node index array */
+  if (!(node_index_ptr = malloc(num_node_sets * int_size))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* allocate memory for C dist factor index array */
+  if (!(dist_index_ptr = malloc(num_node_sets * int_size))) {
+    free(node_index_ptr);
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+
+  if (int_size == sizeof(int64_t)) {
+    for (i = 0; i < num_node_sets; i++) { /* change from 1-based to 0 index */
+      ((int64_t*)node_index_ptr)[i] = ((int64_t*)node_sets_node_index)[i] - 1;
+      ((int64_t*)dist_index_ptr)[i] = ((int64_t*)node_sets_dist_index)[i] - 1;
+    }
+  } else {
+    for (i = 0; i < num_node_sets; i++) { /* change from 1-based to 0 index */
+      ((int*)node_index_ptr)[i] = ((int*)node_sets_node_index)[i] - 1;
+      ((int*)dist_index_ptr)[i] = ((int*)node_sets_dist_index)[i] - 1;
+    }
+  }
+
+  *ierr = ex_put_concat_node_sets(*idexo, node_set_ids, num_nodes_per_set,
+				  num_dist_per_set, node_index_ptr,
+				  dist_index_ptr, node_sets_node_list,
+				  node_sets_dist_fact);
+  free(node_index_ptr);
+  free(dist_index_ptr);
+}
+
+/*
+ * read concatenated node sets
+ */
+void
+F2C(EXGCNS) (int *idexo,
+             void_int *node_set_ids,
+             void_int *num_nodes_per_set,
+             void_int *num_dist_per_set,
+             void_int *node_sets_node_index,
+             void_int *node_sets_dist_index,
+             void_int *node_sets_node_list,
+             real * node_sets_dist_fact,
+             int *ierr)
+{
+  size_t num_node_sets, i;
+
+  *ierr = ex_get_concat_node_sets(*idexo, node_set_ids, num_nodes_per_set,
+				  num_dist_per_set, node_sets_node_index,
+				  node_sets_dist_index, node_sets_node_list,
+				  node_sets_dist_fact);
+
+  num_node_sets = ex_inquire_int(*idexo, EX_INQ_NODE_SETS);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    for (i = 0; i < num_node_sets; i++) { /* change from 0-based to 1 index */
+      ((int64_t*)node_sets_node_index)[i] += 1;
+      ((int64_t*)node_sets_dist_index)[i] += 1;
+    }
+  } else {
+    for (i = 0; i < num_node_sets; i++) { /* change from 0-based to 1 index */
+      ((int*)node_sets_node_index)[i] += 1;
+      ((int*)node_sets_dist_index)[i] += 1;
+    }
+  }
+}
+
+/*
+ * write side set parameters
+ */
+void
+F2C(EXPSP) (int *idexo,
+            entity_id *side_set_id,
+            void_int *num_sides_in_set,
+            void_int *num_df_in_set,
+            int *ierr)
+{
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t nsis = *(int64_t*)num_sides_in_set;
+    int64_t ndis = *(int64_t*)num_df_in_set;
+    *ierr = ex_put_side_set_param(*idexo, *side_set_id, nsis, ndis);
+  } else {
+    int nsis = *(int*)num_sides_in_set;
+    int ndis = *(int*)num_df_in_set;
+    *ierr = ex_put_side_set_param(*idexo, *side_set_id, nsis, ndis);
+  }
+}
+
+/*
+ * read side set parameters
+ */
+void
+F2C(EXGSP) (int *idexo,
+            entity_id *side_set_id,
+            void_int *num_sides_in_set,
+            void_int *num_df_in_set,
+            int *ierr)
+{
+  *ierr = ex_get_side_set_param(*idexo, *side_set_id, num_sides_in_set, num_df_in_set);
+}
+
+/*
+ * get side set node list length
+ */
+void
+F2C(EXGSNL) (int *idexo,
+             entity_id *side_set_id,
+             void_int *num_nodes_in_set,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_node_list_len(*idexo, *side_set_id, num_nodes_in_set);
+}
+
+/*
+ * write side set
+ */
+void
+F2C(EXPSS) (int *idexo,
+            entity_id *side_set_id,
+            void_int *side_set_elem_list,
+            void_int *side_set_side_list,
+            int *ierr)
+{
+  *ierr = ex_put_side_set(*idexo, *side_set_id, side_set_elem_list, side_set_side_list);
+}
+
+/*
+ * read side set
+ */
+void
+F2C(EXGSS) (int *idexo,
+            entity_id *side_set_id,
+            void_int *side_set_elem_list,
+            void_int *side_set_side_list,
+            int *ierr)
+{
+  *ierr = ex_get_side_set(*idexo, *side_set_id, side_set_elem_list, side_set_side_list);
+}
+
+/*
+ * write side set distribution factors
+ */
+void
+F2C(EXPSSD) (int *idexo,
+             entity_id *side_set_id,
+             real * side_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_put_side_set_dist_fact(*idexo, *side_set_id, side_set_dist_fact);
+}
+
+/*
+ * read side set distribution factors
+ */
+void
+F2C(EXGSSD) (int *idexo,
+             entity_id *side_set_id,
+             real * side_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_dist_fact(*idexo, *side_set_id, side_set_dist_fact);
+}
+
+/*
+ * read side sets IDs
+ */
+void
+F2C(EXGSSI) (int *idexo,
+             void_int *side_set_ids,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_ids(*idexo, side_set_ids);
+}
+
+/*
+ * write concatenated side sets
+ */
+void
+F2C(EXPCSS) (int *idexo,
+             void_int *side_set_ids,
+             void_int *num_elem_per_set,
+             void_int *num_dist_per_set,
+             void_int *side_sets_elem_index,
+             void_int *side_sets_dist_index,
+             void_int *side_sets_elem_list,
+             void_int *side_sets_side_list,
+             real * side_sets_dist_fact,
+             int *ierr)
+{
+  size_t num_side_sets, i;
+  void_int *elem_index_ptr, *dist_index_ptr;
+  int int_size;
+
+  *ierr = 0;
+
+  num_side_sets = ex_inquire_int(*idexo, EX_INQ_SIDE_SETS);
+
+  int_size = sizeof(int);
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int_size = sizeof(int64_t);
+  }
+
+  /* allocate memory for C element index array */
+  if (!(elem_index_ptr = malloc(num_side_sets * int_size))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+
+  /* allocate memory for C dist factor index array */
+  if (!(dist_index_ptr = malloc(num_side_sets * int_size))) {
+    free(elem_index_ptr);
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+
+  if (int_size == sizeof(int64_t)) {
+    for (i = 0; i < num_side_sets; i++) { /* change from 1-based to 0 index */
+      ((int64_t*)elem_index_ptr)[i] = ((int64_t*)side_sets_elem_index)[i] - 1;
+      ((int64_t*)dist_index_ptr)[i] = ((int64_t*)side_sets_dist_index)[i] - 1;
+    }
+  } else {
+    for (i = 0; i < num_side_sets; i++) { /* change from 1-based to 0 index */
+      ((int*)elem_index_ptr)[i] = ((int*)side_sets_elem_index)[i] - 1;
+      ((int*)dist_index_ptr)[i] = ((int*)side_sets_dist_index)[i] - 1;
+    }
+  }
+
+  *ierr = ex_put_concat_side_sets(*idexo, side_set_ids, num_elem_per_set,
+				  num_dist_per_set, elem_index_ptr,
+				  dist_index_ptr, side_sets_elem_list,
+				  side_sets_side_list, side_sets_dist_fact);
+  free(elem_index_ptr);
+  free(dist_index_ptr);
+}
+
+/*
+ * read concatenated side sets
+ */
+void
+F2C(EXGCSS) (int *idexo,
+             void_int *side_set_ids,
+             void_int *num_elem_per_set,
+             void_int *num_dist_per_set,
+             void_int *side_sets_elem_index,
+             void_int *side_sets_dist_index,
+             void_int *side_sets_elem_list,
+             void_int *side_sets_side_list,
+             real * side_sets_dist_fact,
+             int *ierr)
+{
+  size_t i, num_side_sets;
+
+  *ierr = 0;
+
+  num_side_sets = ex_inquire_int(*idexo, EX_INQ_SIDE_SETS);
+
+  *ierr = ex_get_concat_side_sets(*idexo, side_set_ids, num_elem_per_set,
+				  num_dist_per_set, side_sets_elem_index,
+				  side_sets_dist_index, side_sets_elem_list,
+				  side_sets_side_list, side_sets_dist_fact);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int64_t*)side_sets_elem_index)[i] += 1;
+      ((int64_t*)side_sets_dist_index)[i] += 1;
+    }
+  } else {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int*)side_sets_elem_index)[i] += 1;
+      ((int*)side_sets_dist_index)[i] += 1;
+    }
+  }
+}
+
+/*
+ * read concatenated side sets (no dist factors)
+ */
+void
+F2C(EXGCSSF) (int *idexo,
+              void_int *side_set_ids,
+              void_int *num_elem_per_set,
+              void_int *num_dist_per_set,
+              void_int *side_sets_elem_index,
+              void_int *side_sets_dist_index,
+              void_int *side_sets_elem_list,
+              void_int *side_sets_side_list,
+              int *ierr)
+{
+  size_t i, num_side_sets;
+
+  num_side_sets = ex_inquire_int(*idexo, EX_INQ_SIDE_SETS);
+
+  *ierr = ex_get_concat_side_sets(*idexo, side_set_ids, num_elem_per_set,
+				  num_dist_per_set, side_sets_elem_index,
+				  side_sets_dist_index, side_sets_elem_list,
+				  side_sets_side_list, 0);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int64_t*)side_sets_elem_index)[i] += 1;
+      ((int64_t*)side_sets_dist_index)[i] += 1;
+    }
+  } else {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int*)side_sets_elem_index)[i] += 1;
+      ((int*)side_sets_dist_index)[i] += 1;
+    }
+  }
+}
+
+/*
+ * write results variables parameters
+ */
+void
+F2C(EXPVP) (int *idexo,
+            char *var_type,
+            int *num_vars,
+            int *ierr,
+            int var_typelen)
+{
+  *ierr = ex_put_var_param(*idexo, var_type, *num_vars);
+}
+
+/*
+ * read results variables parameters
+ */
+void
+F2C(EXGVP) (int *idexo,
+            char *var_type,
+            int *num_vars,
+            int *ierr,
+            int var_typelen)
+{
+  *ierr = ex_get_var_param(*idexo, var_type, num_vars);
+}
+
+/*
+ * write results variables names
+ */
+void
+F2C(EXPVAN) (int *idexo,
+             char *var_type,
+             int *num_vars,
+             char *var_names,
+             int *ierr,
+             int var_typelen,
+             int var_nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (var_nameslen < slen) {
+    slen = var_nameslen;
+  }
+  /* allocate memory for pointer array */
+  if (!(aptr = malloc((*num_vars + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_vars * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy Fortran variable names to staging space */
+  for (i = 0; i < *num_vars; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), var_names + i * var_nameslen, slen);       /* copy string into
+                                                                         * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+  /* do ExodusII C call to write results variables names */
+  if (ex_put_var_names(*idexo, var_type, *num_vars, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+/*
+ * read results variables names
+ */
+void
+F2C(EXGVAN) (int *idexo,
+             char *var_type,
+             int *num_vars,
+             char *var_names,
+             int *ierr,
+             int var_typelen,
+             int var_nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (var_nameslen < slen) {
+    slen = var_nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_vars + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_vars * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  for (i = 0; i < *num_vars; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  /* do ExodusII C call to read results variables names */
+  if (ex_get_var_names(*idexo, var_type, *num_vars, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    free(aptr);
+    return;
+  }
+  /* Copy Fortran variable names to staging space */
+  memset(var_names, 0, *num_vars * var_nameslen);
+  for (i = 0; i < *num_vars; i++) {
+    ex_fcdcpy(var_names + i * var_nameslen, slen, *(aptr + i)); /* copy str into Fortran
+                                                                 * buffer */
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write element variable truth table
+ */
+void
+F2C(EXPVTT) (int *idexo,
+             int *num_elem_blk,
+             int *num_elem_var,
+             int *elem_var_tab,
+             int *ierr)
+{
+  *ierr = ex_put_elem_var_tab(*idexo, *num_elem_blk, *num_elem_var, elem_var_tab);
+}
+
+/*
+ * write nodeset variable truth table
+ */
+void
+F2C(EXPNSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_put_nset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * write sideset variable truth table
+ */
+void
+F2C(EXPSSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_put_sset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * read element variable truth table
+ */
+void
+F2C(EXGVTT) (int *idexo,
+             int *num_elem_blk,
+             int *num_elem_var,
+             int *elem_var_tab,
+             int *ierr)
+{
+  *ierr = ex_get_elem_var_tab(*idexo, *num_elem_blk, *num_elem_var, elem_var_tab);
+}
+
+/*
+ * read nodeset variable truth table
+ */
+void
+F2C(EXGNSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_get_nset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * read sideset variable truth table
+ */
+void
+F2C(EXGSSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_get_sset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * write global variable values at time step
+ */
+void
+F2C(EXPGV) (int *idexo,
+            int *time_step,
+            int *num_glob_vars,
+            real * glob_var_vals,
+            int *ierr)
+{
+  *ierr = ex_put_glob_vars(*idexo, *time_step, *num_glob_vars, glob_var_vals);
+}
+
+/*
+ * read global variable values at a time step
+ */
+void
+F2C(EXGGV) (int *idexo,
+            int *time_step,
+            int *num_glob_vars,
+            real * glob_var_vals,
+            int *ierr)
+{
+  *ierr = ex_get_glob_vars(*idexo, *time_step, *num_glob_vars, glob_var_vals);
+}
+
+/*
+ * read global variable values through time
+ */
+void
+F2C(EXGGVT) (int *idexo,
+             int *glob_var_index,
+             int *beg_time_step,
+             int *end_time_step,
+             real * glob_var_vals,
+             int *ierr)
+{
+  *ierr = ex_get_glob_var_time(*idexo, *glob_var_index, *beg_time_step, *end_time_step, glob_var_vals);
+}
+
+/*
+ * write nodal variable values at a time step
+ */
+void
+F2C(EXPNV) (int *idexo,
+            int *time_step,
+            int *nodal_var_index,
+            void_int *num_nodes,
+            real * nodal_var_vals,
+            int *ierr)
+{
+  int64_t nnodes;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    nnodes = *(int64_t*)num_nodes;
+  } else {
+    nnodes = *(int*)num_nodes;
+  }
+  
+  *ierr = ex_put_nodal_var(*idexo, *time_step, *nodal_var_index, nnodes, nodal_var_vals);
+}
+
+/*
+ * read nodal variable values at a time step
+ */
+void
+F2C(EXGNV) (int *idexo,
+            int *time_step,
+            int *nodal_var_index,
+            void_int *num_nodes,
+            real * nodal_var_vals,
+            int *ierr)
+{
+  int64_t nnodes;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    nnodes = *(int64_t*)num_nodes;
+  } else {
+    nnodes = *(int*)num_nodes;
+  }
+  
+  *ierr = ex_get_nodal_var(*idexo, *time_step, *nodal_var_index, nnodes, nodal_var_vals);
+}
+
+/*
+ * read nodal variable values through time
+ */
+void
+F2C(EXGNVT) (int *idexo,
+             int *nodal_var_index,
+             void_int *node_number,
+             int *beg_time_step,
+             int *end_time_step,
+             real * nodal_var_vals,
+             int *ierr)
+{
+  int64_t nnode;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    nnode = *(int64_t*)node_number;
+  } else {
+    nnode = *(int*)node_number;
+  }
+  
+  *ierr = ex_get_nodal_var_time(*idexo, *nodal_var_index, nnode, *beg_time_step, *end_time_step, nodal_var_vals);
+}
+
+/*
+ * write element variable values at a time step
+ */
+void
+F2C(EXPEV) (int *idexo,
+            int *time_step,
+            int *elem_var_index,
+            entity_id *elem_blk_id,
+            void_int *num_elem_this_blk,
+            real * elem_var_vals,
+            int *ierr)
+{
+  int64_t neblk;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    neblk = *(int64_t*)num_elem_this_blk;
+  } else {
+    neblk = *(int*)num_elem_this_blk;
+  }
+  
+  *ierr = ex_put_elem_var(*idexo, *time_step, *elem_var_index, *elem_blk_id, neblk, elem_var_vals);
+}
+
+/*
+ * read element variable values at a time step
+ */
+void
+F2C(EXGEV) (int *idexo,
+            int *time_step,
+            int *elem_var_index,
+            entity_id *elem_blk_id,
+            void_int *num_elem_this_blk,
+            real * elem_var_vals,
+            int *ierr)
+{
+  int64_t neblk;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    neblk = *(int64_t*)num_elem_this_blk;
+  } else {
+    neblk = *(int*)num_elem_this_blk;
+  }
+  
+  *ierr = ex_get_elem_var(*idexo, *time_step, *elem_var_index, *elem_blk_id, neblk, elem_var_vals);
+}
+
+/*
+ * read element variable values through time
+ */
+void
+F2C(EXGEVT) (int *idexo,
+             int *elem_var_index,
+             void_int *elem_number,
+             int *beg_time_step,
+             int *end_time_step,
+             real * elem_var_vals,
+             int *ierr)
+{
+  int64_t el_num;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    el_num = *(int64_t*)elem_number;
+  } else {
+    el_num = *(int*)elem_number;
+  }
+  
+  *ierr = ex_get_elem_var_time(*idexo, *elem_var_index, el_num, *beg_time_step, *end_time_step, elem_var_vals);
+}
+
+/*
+ * write nodeset variable values at a time step
+ */
+void
+F2C(EXPNSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_put_nset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * read nodeset variable values at a time step
+ */
+void
+F2C(EXGNSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_get_nset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * write sideset variable values at a time step
+ */
+void
+F2C(EXPSSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_put_sset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * read sideset variable values at a time step
+ */
+void
+F2C(EXGSSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_get_sset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * write time value for a time step
+ */
+void
+F2C(EXPTIM) (int *idexo,
+             int *time_step,
+             real * time_value,
+             int *ierr)
+{
+  *ierr = ex_put_time(*idexo, *time_step, time_value);
+}
+
+/*
+ * read time value for a time step
+ */
+void
+F2C(EXGTIM) (int *idexo,
+             int *time_step,
+             real * time_value,
+             int *ierr)
+{
+  *ierr = ex_get_time(*idexo, *time_step, time_value);
+}
+
+/*
+ * read all time values
+ */
+void
+F2C(EXGATM) (int *idexo,
+             real * time_values,
+             int *ierr)
+{
+  *ierr = ex_get_all_times(*idexo, time_values);
+}
+
+/*
+ * inquire EXODUS parameters
+ */
+void
+F2C(EXINQ) (int *idexo,
+            int *req_info,
+            void_int *ret_int,
+            float *ret_float,
+            char *ret_char,
+            int *ierr,
+            int ret_charlen)
+{
+  *ierr = ex_inquire(*idexo, (ex_inquiry) * req_info, ret_int, ret_float, ret_char);
+}
+
+/*
+ * inquire integer EXODUS parameters
+ */
+int64_t
+F2C(EXINQI) (int *idexo,
+            int *req_info)
+{
+  return ex_inquire_int(*idexo, (ex_inquiry) *req_info);
+}
+
+/*
+ * convert side set node lists to side set side lists
+ */
+void
+F2C(EXCN2S) (int *idexo,
+             void_int *num_elem_per_set,
+             void_int *num_nodes_per_set,
+             void_int *side_sets_elem_index,
+             void_int *side_sets_node_index,
+             void_int *side_sets_elem_list,
+             void_int *side_sets_node_list,
+             void_int *side_sets_side_list,
+             int *ierr)
+{
+  *ierr = ex_cvt_nodes_to_sides(*idexo,
+				num_elem_per_set,
+				num_nodes_per_set,
+				NULL, /* unused */
+				NULL, /* unused */
+				side_sets_elem_list,
+				side_sets_node_list,
+				side_sets_side_list);
+}
+
+/*
+ * read side set node list
+ */
+void
+F2C(EXGSSN) (int *idexo,
+             entity_id *side_set_id,
+             int *side_set_node_cnt_list,
+             void_int *side_set_node_list,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_node_list(*idexo, *side_set_id, side_set_node_cnt_list, side_set_node_list);
+}
+
+/*
+ * read side set node count
+ */
+void
+F2C(EXGSSC) (int *idexo,
+             entity_id *side_set_id,
+             int *side_set_node_cnt_list,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_node_count(*idexo, *side_set_id, side_set_node_cnt_list);
+}
+
+/*
+ * read concatenated side set node count
+ */
+void
+F2C(EXGCSSC) (int *idexo,
+              int *side_set_node_cnt_list,
+              int *ierr)
+{
+  *ierr = ex_get_concat_side_set_node_count(*idexo, side_set_node_cnt_list);
+}
+
+/* ex_get_coordinate_frames -- read coordinate frames */
+void
+F2C(EXGFRM) (int *idexo,
+             int *nframeo,
+             void_int *cfids,
+             real * coord,
+             int *tags,
+             int *ierr)
+{
+  int             i;
+  char           *ctags = NULL;
+
+  /* Determine number of coordinate frames stored in file */
+  int             nframe = ex_inquire_int(*idexo, EX_INQ_COORD_FRAMES);
+
+  if (nframe != *nframeo) {
+    *ierr = EX_FATAL;
+    return;
+  }
+  /* Create array of characters to store tags... */
+  if (nframe > 0) {
+    if (!(ctags = calloc(nframe, sizeof(char)))) {
+      *ierr = EX_MEMFAIL;
+      return;
+    }
+    *ierr = 0;
+
+    if (ex_get_coordinate_frames(*idexo, &nframe, cfids, coord, ctags) == EX_FATAL) {
+      *ierr = EX_FATAL;
+      return;
+    }
+    /* Convert character tags back to integer tags for fortran */
+    for (i = 0; i < nframe; i++) {
+      if (ctags[i] == 'R' || ctags[i] == 'r')
+        tags[i] = EX_CF_RECTANGULAR;
+      else if (ctags[i] == 'C' || ctags[i] == 'c')
+        tags[i] = EX_CF_CYLINDRICAL;
+      else if (ctags[i] == 'S' || ctags[i] == 's')
+        tags[i] = EX_CF_SPHERICAL;
+    }
+    free(ctags);
+  }
+}
+
+/* ex_put_coordinate_frames -- define/write coordinate frames */
+void
+F2C(EXPFRM) (int *idexo,
+             int *nframe,
+             void_int *cfids,
+             real * coord,
+             int *tags,
+             int *ierr)
+{
+  int             i;
+  char           *ctags = NULL;
+
+  /* Create array of characters to store tags... */
+  if (*nframe > 0) {
+    if (!(ctags = calloc(*nframe, sizeof(char)))) {
+      *ierr = EX_MEMFAIL;
+      return;
+    }
+    /* Convert fortran integer tags to C API character tags */
+    for (i = 0; i < *nframe; i++) {
+      if (tags[i] == EX_CF_RECTANGULAR)
+        ctags[i] = 'R';
+      else if (tags[i] == EX_CF_CYLINDRICAL)
+        ctags[i] = 'C';
+      else if (tags[i] == EX_CF_SPHERICAL)
+        ctags[i] = 'S';
+    }
+
+    *ierr = 0;
+
+    if (ex_put_coordinate_frames(*idexo, *nframe, cfids, coord, ctags) == EX_FATAL) {
+      *ierr = EX_FATAL;
+      return;
+    }
+    free(ctags);
+  }
+}
+
+
+/* Routine to return floating point word size */
+int
+F2C(EXCPWS) ()
+{
+  return (ex_get_cpu_ws());
+}
+
+/* Routine to return large model setting */
+int
+F2C(EXLGMD) (int *idexo)
+{
+  return (ex_large_model(*idexo));
+}
+
+
+/* Generalized error handling function */
+void
+F2C(EXERR) (char *pname,
+            char *err_string,
+            int *errcode,
+            int pnamelen,
+            int err_stringlen)
+{
+
+  char           *proc_name, *error_string;
+  if (!(proc_name = malloc((pnamelen + 1) * sizeof(char)))) {
+    ex_err("exerr", "Error: failed to allocate space for process name buffer",
+           EX_MEMFAIL);
+    return;
+  }
+  if (!(error_string = malloc((err_stringlen + 1) * sizeof(char)))) {
+    free(proc_name);
+    ex_err("exerr", "Error: failed to allocate space for error msg buffer",
+           EX_MEMFAIL);
+    return;
+  }
+  ex_fstrncpy(proc_name, pname, pnamelen);
+  ex_fstrncpy(error_string, err_string, err_stringlen);
+  ex_err(proc_name, error_string, *errcode);
+  free(proc_name);
+  free(error_string);
+}
+
+/* Error message reporting options setting function */
+void
+F2C(EXOPTS) (int *option_val,
+             int *ierr)
+{
+  *ierr = 0;
+  ex_opts((ex_options) * option_val);
+  if (exerrval != 0) {
+    *ierr = EX_FATAL;
+  }
+}
+
+void
+F2C(EXMXNM) (int *idexo,
+             int *length,
+             int *ierr)
+{
+  *ierr = ex_set_max_name_length(*idexo, *length);
+}
+
+/*
+ * copy EXODUS file
+ */
+void
+F2C(EXCOPY) (int *idexo_in,
+             int *idexo_out,
+             int *ierr)
+{
+  *ierr = ex_copy(*idexo_in, *idexo_out);
+}
+
+/*
+ * get element map
+ */
+void
+
+F2C(EXGEM) (int *idexo,
+            entity_id *map_id,
+            void_int *elem_map,
+            int *ierr)
+{
+  *ierr = ex_get_num_map(*idexo, EX_ELEM_MAP, *map_id, elem_map);
+}
+
+/*
+ * get partial_element map
+ */
+void
+F2C(EXGPEM) (int *idexo,
+             entity_id *map_id,
+             void_int *start,
+             void_int *count,
+             void_int *elem_map,
+             int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+  
+  *ierr = ex_get_partial_num_map(*idexo, EX_ELEM_MAP, *map_id, st, cnt, elem_map);
+}
+
+/*
+ * get element number map
+ */
+void
+F2C(EXGENM) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_get_id_map(*idexo, EX_ELEM_MAP, elem_map);
+}
+
+/*
+ * get map parameters
+ */
+void
+F2C(EXGMP) (int *idexo,
+            int *num_node_maps,
+            int *num_elem_maps,
+            int *ierr)
+{
+  *ierr = ex_get_map_param(*idexo, num_node_maps, num_elem_maps);
+}
+
+/*
+ * get node map
+ */
+void
+F2C(EXGNM) (int *idexo,
+            entity_id *map_id,
+            void_int *node_map,
+            int *ierr)
+{
+  *ierr = ex_get_num_map(*idexo, EX_NODE_MAP, *map_id, node_map);
+}
+
+/*
+ * get node number map
+ */
+void
+F2C(EXGNNM) (int *idexo,
+             void_int *node_map,
+             int *ierr)
+{
+  *ierr = ex_get_id_map(*idexo, EX_NODE_MAP, node_map);
+}
+
+/*
+ * read results variables names
+ */
+void
+F2C(EXGVNM) (int *idexo,
+             char *var_type,
+             int *var_index,
+             char *var_name,
+             int *ierr,
+             int var_typelen,
+             int var_namelen)
+{
+  char           *sptr;         /* ptr to temp staging space for string */
+  int             slen;
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (var_namelen < slen) {
+    slen = var_namelen;
+  }
+  /* Allocate staging space for the variable name */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* do ExodusII C call to read results variables names */
+  if (ex_get_var_name(*idexo, var_type, *var_index, sptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    return;
+  }
+  /* Copy Fortran variable names to staging space */
+  /** printf("[exgvnm] var_name(%d): %s\n",*var_index,sptr)); **/
+  memset(var_name, 0, var_namelen);
+  ex_fcdcpy(var_name, slen, sptr);      /* copy string into Fortran buffer */
+
+  free(sptr);                   /* Free up string staging area */
+}
+
+/*
+ * put element map
+ */
+void
+F2C(EXPEM) (int *idexo,
+            entity_id *map_id,
+            void_int *elem_map,
+            int *ierr)
+{
+  *ierr = ex_put_num_map(*idexo, EX_ELEM_MAP, *map_id, elem_map);
+}
+
+/*
+ * put partial element map
+ */
+void
+F2C(EXPPEM) (int *idexo,
+             entity_id *map_id,
+             void_int *start,
+             void_int *count,
+             void_int *elem_map,
+             int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+  *ierr = ex_put_partial_num_map(*idexo, EX_ELEM_MAP, *map_id, st, cnt, elem_map);
+}
+
+/*
+ * put element number map
+ */
+void
+F2C(EXPENM) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_put_id_map(*idexo, EX_ELEM_MAP, elem_map);
+}
+
+/*
+ * put map parameters
+ */
+void
+F2C(EXPMP) (int *idexo,
+            int *num_node_maps,
+            int *num_elem_maps,
+            int *ierr)
+{
+  *ierr = ex_put_map_param(*idexo, *num_node_maps, *num_elem_maps);
+}
+
+/*
+ * put node map
+ */
+void
+F2C(EXPNM) (int *idexo,
+            entity_id *map_id,
+            void_int *node_map,
+            int *ierr)
+{
+  *ierr = ex_put_num_map(*idexo, EX_NODE_MAP, *map_id, node_map);
+}
+
+/*
+ * put node number map
+ */
+void
+F2C(EXPNNM) (int *idexo,
+             void_int *node_map,
+             int *ierr)
+{
+  *ierr = ex_put_id_map(*idexo, EX_NODE_MAP, node_map);
+}
+
+/*
+ * write results variable name
+ */
+void
+F2C(EXPVNM) (int *idexo,
+             char *var_type,
+             int *var_index,
+             char *var_name,
+             int *ierr,
+             int var_typelen,
+             int var_namelen)
+{
+  char           *sptr;         /* ptr to temp staging space for string */
+  int             slen;
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (var_namelen < slen) {
+    slen = var_namelen;
+  }
+  /* Allocate staging space for the variable name */
+  if (!(sptr = (char *) malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  ex_fstrncpy(sptr, var_name, slen);    /* copy string into buffer */
+
+
+  /* do ExodusII C call to write results variable name */
+  if (ex_put_var_name(*idexo, var_type, *var_index, sptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    return;
+  }
+  free(sptr);                   /* Free up string staging area */
+}
+
+/*
+ *  Get initial information from nemesis file
+ */
+void
+F2C(EXGII)(int	*idne,	
+	   int	*nproc,
+	   int	*nproc_in_f,
+	   char	*ftype,
+	   int  *ierr, 
+	   size_t ftypelen)
+{
+  size_t slen = 1;
+  char *file_type;
+
+  /* WARNING: ftypelen SHOULD be 1, but may not be depending on how
+              the Fortran programmer passed it. It is best at
+              this time to hard code it per NEPII spec. */
+  if (ftypelen != 1) {
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,"Warning: file type string length is %d in file id %d\n",
+            ftypelen, *idne);
+    ex_err("negii",errmsg,EX_MSG);
+#endif
+    slen = ftypelen;
+  }
+
+  file_type = (char *) malloc((slen+1)*sizeof(char));
+
+  if ((*ierr = ex_get_init_info(*idne, nproc, nproc_in_f, file_type)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to get initial information from file id %d",
+	    *idne);
+    ex_err("negii",errmsg,EX_MSG);
+  }
+
+  if (*ierr == 0)
+    ex_fcdcpy (ftype, slen, file_type);
+
+  free(file_type);
+}
+
+/*
+ *  Write initial information from nemesis file
+ */
+void
+F2C(EXPII)(int	*idne,
+	   int	*nproc,
+	   int	*nproc_in_f,
+	   char	*ftype,
+	   int  *ierr,
+	   size_t ftypelen)
+{
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  size_t slen = 1;
+  char *file_type;
+
+  /* WARNING: ftypelen SHOULD be 1, but may not be depending on how
+              the Fortran programmer passed it. It is best at
+              this time to hard code it per NEPII spec. */
+  if (ftypelen != 1) {
+    slen = ftypelen;
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    sprintf(errmsg,"Warning: file type string length is %d in file id %d\n",
+            ftypelen, *idne);
+    ex_err("nepii",errmsg,EX_MSG);
+#endif
+  }
+
+  file_type = (char *) malloc((slen+1)*sizeof(char));
+
+  ex_fstrncpy (file_type, ftype, slen);
+
+  if ((*ierr = ex_put_init_info(*idne, *nproc, *nproc_in_f, file_type)) != 0)
+  {
+    sprintf(errmsg,
+	    "Error: failed to put initial information in file id %d",
+	    *idne);
+    ex_err("nepii",errmsg,EX_MSG);
+  }
+
+  free(file_type);
+}
+
+/*
+ * Read initial global information
+ */
+void
+F2C(EXGIG)(int	*idne,
+	   void_int	*nnodes_g,
+	   void_int	*nelems_g,
+	   void_int	*nelem_blks_g,
+	   void_int	*nnode_sets_g,
+	   void_int	*nside_sets_g,
+	   int	*ierr)
+{
+  if ((*ierr = ex_get_init_global(*idne, nnodes_g, nelems_g, nelem_blks_g,
+                                  nnode_sets_g, nside_sets_g)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read initial global information from file id %d",
+	    *idne);
+    ex_err("negig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write initial global information
+ */
+void
+F2C(EXPIG)(int	*idne,
+	   void_int	*nnodes_g,
+	   void_int	*nelems_g,
+	   void_int	*nelem_blks_g,
+	   void_int	*nnode_sets_g,
+	   void_int	*nside_sets_g,
+	   int	*ierr)
+{
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    int64_t *n_nnodes_g = (int64_t*)nnodes_g;
+    int64_t *n_nelems_g = (int64_t*)nelems_g;
+    int64_t *n_nelem_blks_g = (int64_t*)nelem_blks_g;
+    int64_t *n_nnode_sets_g = (int64_t*)nnode_sets_g;
+    int64_t *n_nside_sets_g = (int64_t*)nside_sets_g;
+    *ierr =  ex_put_init_global(*idne, *n_nnodes_g, *n_nelems_g, *n_nelem_blks_g,
+				*n_nnode_sets_g, *n_nside_sets_g);
+  } else {
+    int *n_nnodes_g = (int*)nnodes_g;
+    int *n_nelems_g = (int*)nelems_g;
+    int *n_nelem_blks_g = (int*)nelem_blks_g;
+    int *n_nnode_sets_g = (int*)nnode_sets_g;
+    int *n_nside_sets_g = (int*)nside_sets_g;
+    *ierr =  ex_put_init_global(*idne, *n_nnodes_g, *n_nelems_g, *n_nelem_blks_g,
+				*n_nnode_sets_g, *n_nside_sets_g);
+  }
+
+  if (*ierr != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store initial global information in file id %d",
+	    *idne);
+    ex_err("nepig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read load balance parameters
+ */
+void
+F2C(EXGLBP)(int	*idne,
+	    void_int	*nint_nodes,
+	    void_int	*nbor_nodes,
+	    void_int	*next_nodes,
+	    void_int	*nint_elems,
+	    void_int	*nbor_elems,
+	    void_int	*nnode_cmaps,
+	    void_int	*nelem_cmaps,
+	    int	*processor,
+	    int	*ierr)
+{
+  if ((*ierr = ex_get_loadbal_param(*idne, nint_nodes, nbor_nodes,
+                                    next_nodes, nint_elems, nbor_elems,
+                                    nnode_cmaps, nelem_cmaps, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read load balance parameters from file id %d",
+	    *idne);
+    ex_err("neglbp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write load balance parameters
+ */
+void
+F2C(EXPLBP)(int	*idne,
+	    void_int	*nint_nodes,
+	    void_int	*nbor_nodes,
+	    void_int	*next_nodes,
+	    void_int	*nint_elems,
+	    void_int	*nbor_elems,
+	    void_int	*nnode_cmaps,
+	    void_int	*nelem_cmaps,
+	    int	*processor,
+	    int	*ierr)	
+{
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    int64_t *n_nint_nodes = (int64_t*)nint_nodes;
+    int64_t *n_nbor_nodes = (int64_t*)nbor_nodes;
+    int64_t *n_next_nodes = (int64_t*)next_nodes;
+    int64_t *n_nint_elems = (int64_t*)nint_elems;
+    int64_t *n_nbor_elems = (int64_t*)nbor_elems;
+    int64_t *n_nnode_cmaps = (int64_t*)nnode_cmaps;
+    int64_t *n_nelem_cmaps = (int64_t*)nelem_cmaps;
+    *ierr = ex_put_loadbal_param(*idne, *n_nint_nodes, *n_nbor_nodes,
+				 *n_next_nodes, *n_nint_elems, *n_nbor_elems,
+				 *n_nnode_cmaps, *n_nelem_cmaps,
+				 *processor);
+  } else {
+    int *n_nint_nodes = (int*)nint_nodes;
+    int *n_nbor_nodes = (int*)nbor_nodes;
+    int *n_next_nodes = (int*)next_nodes;
+    int *n_nint_elems = (int*)nint_elems;
+    int *n_nbor_elems = (int*)nbor_elems;
+    int *n_nnode_cmaps = (int*)nnode_cmaps;
+    int *n_nelem_cmaps = (int*)nelem_cmaps;
+    *ierr = ex_put_loadbal_param(*idne, *n_nint_nodes, *n_nbor_nodes,
+				 *n_next_nodes, *n_nint_elems, *n_nbor_elems,
+				 *n_nnode_cmaps, *n_nelem_cmaps,
+				 *processor);
+  }
+  if (*ierr != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store load balance parameters in file id %d",
+	    *idne);
+    ex_err("neplbp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write concatenated load balance parameters
+ */
+void
+F2C(EXPLBPC)(int *idne,
+	     void_int *nint_nodes,	
+	     void_int *nbor_nodes,	
+	     void_int *next_nodes,	
+	     void_int *nint_elems,	
+	     void_int *nbor_elems,	
+	     void_int *nnode_cmaps,	
+	     void_int *nelem_cmaps,	
+	     int *ierr)	
+{
+  if ((*ierr = ex_put_loadbal_param_cc(*idne, nint_nodes, nbor_nodes,
+                                       next_nodes, nint_elems, nbor_elems,
+                                       nnode_cmaps, nelem_cmaps)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store load balance parameters in file id %d",
+	    *idne);
+    ex_err("neplbpc",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global node set parameters
+ */
+void
+F2C(EXGNSPG)(int *idne,
+	     void_int *ns_ids_glob,
+	     void_int *ns_n_cnt_glob,
+	     void_int *ns_df_cnt_glob,
+	     int *ierr)
+{
+  if ((*ierr = ex_get_ns_param_global(*idne, ns_ids_glob, ns_n_cnt_glob, ns_df_cnt_glob)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global node set parameters from file id %d",
+	    *idne);
+    ex_err("negnspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global node set parameters
+ */
+void
+F2C(EXPNSPG)(int *idne,
+	     void_int *global_ids,
+	     void_int *global_n_cnts,
+	     void_int *global_df_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_ns_param_global(*idne, global_ids, global_n_cnts, global_df_cnts)) != 0)
+  {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global node set parameters in file id %d",
+	    *idne);
+    ex_err("nepnspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global side set parameters
+ */
+void
+F2C(EXGSSPG)(int *idne,
+	     void_int *ss_ids_glob,
+	     void_int *ss_n_cnt_glob,
+	     void_int *ss_df_cnt_glob,
+	     int *ierr)
+{
+
+  if ((*ierr = ex_get_ss_param_global(*idne, ss_ids_glob, ss_n_cnt_glob, ss_df_cnt_glob)) != 0)
+  {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global side set parameters from file id %d",
+	    *idne);
+    ex_err("negsspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global side set parameters
+ */
+void
+F2C(EXPSSPG)(int *idne,
+	     void_int *global_ids,
+	     void_int *global_el_cnts,
+	     void_int *global_df_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_ss_param_global(*idne, global_ids, global_el_cnts, global_df_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global side set parameters in file id %d",
+	    *idne);
+    ex_err("nepsspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global element block information
+ */
+void
+F2C(EXGEBIG)(int *idne,
+	     void_int *el_blk_ids,
+	     void_int *el_blk_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_get_eb_info_global(*idne, el_blk_ids, el_blk_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global element block info from file id %d",
+	    *idne);
+    ex_err("negebig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global element block information
+ */
+void
+F2C(EXPEBIG)(int *idne,
+	     void_int *el_blk_ids,
+	     void_int *el_blk_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_eb_info_global(*idne, el_blk_ids, el_blk_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global element block info in file id %d",
+	    *idne);
+    ex_err("nepebig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read side set element list and side set side list
+ */
+void
+F2C(EXGNSS)(int *idne,
+	    entity_id *ss_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ss_elem_list,
+	    void_int *ss_side_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_side_set(*idne, *ss_id, st, cnt, ss_elem_list, ss_side_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read side set element list from file id %d",
+	    *idne);
+    ex_err("negnss",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write side set element list and side set side list
+ */
+void
+F2C(EXPNSS)(int *idne,
+	    entity_id *ss_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ss_elem_list,
+	    void_int *ss_side_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_side_set(*idne, *ss_id, st, cnt, ss_elem_list, ss_side_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write side set element list to file id %d",
+	    *idne);
+    ex_err("nepnss",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read side set distribution factor
+ */
+void
+F2C(EXGNSSD)(int *idne,
+	     entity_id *ss_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ss_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_side_set_df(*idne, *ss_id, st, cnt, ss_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read side set dist factor from file id %d",
+	    *idne);
+    ex_err("negnssd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write side set distribution factor
+ */
+void
+F2C(EXPNSSD)(int *idne,
+	     entity_id *ss_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ss_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_side_set_df(*idne, *ss_id, st, cnt, ss_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write side set dist factor to file id %d",
+	    *idne);
+    ex_err("nepnssd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read node set list for a single node set
+ */
+void
+F2C(EXGNNS)(int *idne,
+	    entity_id *ns_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ns_node_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_node_set(*idne, *ns_id, st, cnt,ns_node_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node set node list from file id %d",
+	    *idne);
+    ex_err("negnns",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write node set list for a single node set
+ */
+void
+F2C(EXPNNS)(int *idne,
+	    entity_id *ns_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ns_node_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_node_set(*idne, *ns_id, st, cnt, ns_node_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node set node list to file id %d",
+	    *idne);
+    ex_err("nepnns",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read node set distribution factor
+ */
+void
+F2C(EXGNNSD)(int *idne,
+	     entity_id *ns_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ns_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_node_set_df(*idne, *ns_id, st, cnt, ns_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node set dist factor from file id %d",
+	    *idne);
+    ex_err("negnnsd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write node set distribution factor
+ */
+void
+F2C(EXPNNSD)(int *idne,
+	     entity_id *ns_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ns_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_node_set_df(*idne, *ns_id, st, cnt, ns_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node set dist factor to file id %d",
+	    *idne);
+    ex_err("nepnnsd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read coordinates of the nodes
+ */
+void
+F2C(EXGNCOR)(int *idne,
+	     void_int *start,
+	     void_int *count,
+	     real *x_coor,
+	     real *y_coor,
+	     real *z_coor,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_coord(*idne, st, cnt, x_coor, y_coor, z_coor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node coordinates from file id %d",
+	    *idne);
+    ex_err("negcor",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write coordinates of the nodes
+ */
+void
+F2C(EXPNCOR)(int *idne,
+	     void_int *start,
+	     void_int *count,
+	     real *x_coor,
+	     real *y_coor,
+	     real *z_coor,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_coord(*idne, st, cnt, x_coor, y_coor, z_coor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node coordinates to file id %d",
+	    *idne);
+    ex_err("nepcor",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read an element block's connectivity list
+ */
+void
+F2C(EXGNEC)(int *idne,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *connect,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_elem_conn(*idne, *elem_blk_id, st, cnt, connect)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block connectivity from file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write an element block's connectivity list
+ */
+void
+F2C(EXPNEC)(int *idne,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *connect,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_elem_conn(*idne, *elem_blk_id, st, cnt, connect)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element block connectivity to file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read an element block's attributes
+ */
+void
+F2C(EXGNEAT)(int *idne,
+	     entity_id *elem_blk_id,
+	     void_int *start,
+	     void_int *count,
+	     real *attrib,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_elem_attr(*idne, *elem_blk_id, st, cnt, attrib)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block attribute from file id %d",
+	    *idne);
+    ex_err("negneat",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write an element block's attributes
+ */
+void
+F2C(EXPNEAT)(int *idne,
+	     entity_id *elem_blk_id,
+	     void_int *start,
+	     void_int *count,
+	     real *attrib,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_elem_attr(*idne, *elem_blk_id, st, cnt, attrib)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element block attribute to file id %d",
+	    *idne);
+    ex_err("nepneat",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element type for a specific element block
+ */
+void
+F2C(EXGELT)(int *idne,
+	    entity_id *elem_blk_id,
+	    char *elem_type,
+	    int *ierr,
+	    size_t elem_typelen)
+{
+  size_t slen = MAX_STR_LENGTH;
+  char *etype;
+
+  /* WARNING: ftypelen SHOULD be MAX_STR_LENGTH, but may not be depending
+              on how the Fortran programmer passed it. It is best at
+              this time to hard code it per NEMESIS spec. */
+  if (elem_typelen != MAX_STR_LENGTH) {
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,"Warning: element type string length is %d in file id %d\n",
+            elem_typelen, *idne);
+    ex_err("negelt",errmsg,EX_MSG);
+#endif
+    slen = elem_typelen;
+  }
+
+  etype = (char *) malloc((slen+1)*sizeof(char));
+
+  if ((*ierr = ex_get_elem_type(*idne, *elem_blk_id, etype)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block type from file id %d",
+	    *idne);
+    ex_err("negelt",errmsg,EX_MSG);
+  }
+
+  if (*ierr == 0)
+    ex_fcdcpy (elem_type, slen, etype);
+
+  free(etype);
+}
+
+/*
+ * Read a variable for an element block
+ */
+void
+F2C(EXGNEV)(int *idne,
+	    int *time_step,
+	    int *elem_var_index,
+	    entity_id *elem_blk_id,
+	    void_int *num_elem_this_blk,
+	    void_int *start,
+	    void_int *count,
+	    real *elem_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_var(*idne, *time_step, EX_ELEM_BLOCK, *elem_var_index,
+			    *elem_blk_id, st, cnt, elem_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block variable from file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write a variable slab for an element block
+ */
+void
+F2C(EXPEVS)(int *idne,
+	    int *time_step,
+	    int *elem_var_index,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    real *elem_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_elem_var_slab(*idne, *time_step, *elem_var_index,
+                                    *elem_blk_id, st, cnt, elem_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write elem block variable slab to file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the values of a single nodal variable for a single time step
+ */
+void
+F2C(EXGNNV)(int *idne,
+	    int *time_step,
+	    int *nodal_var_index,
+	    void_int *start,
+	    void_int *count,
+	    real *nodal_vars,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_var(*idne, *time_step, EX_NODAL, *nodal_var_index,
+			    1, st, cnt, nodal_vars)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read nodal variable from file id %d",
+	    *idne);
+    ex_err("negnnv",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write nodal variable slab
+ */
+void
+F2C(EXPNVS)(int *idne,
+	    int *time_step,
+	    int *nodal_var_index,
+	    void_int *start,
+	    void_int *count,
+	    real *nodal_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_nodal_var_slab(*idne, *time_step, *nodal_var_index,
+                                     st, cnt, nodal_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write nodal variable slab to file id %d",
+	    *idne);
+    ex_err("nepnvs",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element numbering map
+ */
+void
+F2C(EXGNENM)(int *idne,
+	     void_int *starte,
+	     void_int *num_ent,
+	     void_int *elem_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)starte;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)starte;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_get_n_elem_num_map(*idne, st, cnt, elem_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element numbering map from file id %d",
+	    *idne);
+    ex_err("negnenm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the element numbering map
+ */
+void
+F2C(EXPNENM)(int *idne,
+	     void_int *starte,
+	     void_int *num_ent,
+	     void_int *elem_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)starte;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)starte;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_put_partial_id_map(*idne, EX_ELEM_MAP, st, cnt, elem_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element numbering map to file id %d",
+	    *idne);
+    ex_err("nepnenm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the node numbering map
+ */
+void
+F2C(EXGNNNM)(int *idne,
+	     void_int *startn,
+	     void_int *num_ent,
+	     void_int *node_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)startn;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)startn;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_get_n_node_num_map(*idne, st, cnt, node_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node numbering map from file id %d",
+	    *idne);
+    ex_err("negnnnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the node numbering map
+ */
+void
+F2C(EXPNNNM)(int *idne,
+	     void_int *startn,
+	     void_int *num_ent,
+	     void_int *node_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)startn;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)startn;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_put_partial_id_map(*idne, EX_NODE_MAP, st, cnt, node_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node numbering map to file id %d",
+	    *idne);
+    ex_err("nepnnnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the node map for a processor
+ */
+void
+F2C(EXGNMP)(int *idne,
+	   void_int *node_mapi,
+	   void_int *node_mapb,
+	   void_int *node_mape,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_get_processor_node_maps(*idne, node_mapi, node_mapb, node_mape, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read processor node map from file id %d",
+	    *idne);
+    ex_err("negnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write a node map for a processor
+ */
+void
+F2C(EXPNMP)(int *idne,
+	   void_int *node_mapi,
+	   void_int *node_mapb,
+	   void_int *node_mape,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_put_processor_node_maps(*idne, node_mapi, node_mapb, node_mape, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write processor node map to file id %d",
+	    *idne);
+    ex_err("nepnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element map for a processor
+ */
+void
+F2C(EXGEMP)(int *idne,
+	   void_int *elem_mapi,
+	   void_int *elem_mapb,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_get_processor_elem_maps(*idne, elem_mapi, elem_mapb, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read processor element map from file id %d",
+	    *idne);
+    ex_err("negem",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the element map for a processor
+ */
+void
+F2C(EXPEMP)(int *idne,
+	   void_int *elem_mapi,
+	   void_int *elem_mapb,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_put_processor_elem_maps(*idne, elem_mapi, elem_mapb, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write processor element map to file id %d",
+	    *idne);
+    ex_err("nepem",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the communications map parameters for a single processor
+ */
+void
+F2C(EXGCMP)(int *idne,
+	    void_int *ncmap_ids,
+	    void_int *ncmap_node_cnts,
+	    void_int *ecmap_ids,
+	    void_int *ecmap_elem_cnts,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_cmap_params(*idne, ncmap_ids, ncmap_node_cnts,
+                                  ecmap_ids, ecmap_elem_cnts, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read comm map parameters from file id %d",
+	    *idne);
+    ex_err("negcmp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the communications map parameters for a single processor
+ */
+void
+F2C(EXPCMP)(int *idne,
+	    void_int *nmap_ids,
+	    void_int *nmap_node_cnts,
+	    void_int *emap_ids,
+	    void_int *emap_elem_cnts,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_cmap_params(*idne, nmap_ids, nmap_node_cnts,
+                                  emap_ids, emap_elem_cnts, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write comm map parameters to file id %d",
+	    *idne);
+    ex_err("nepcmp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the communications map parameters for all processors
+ */
+void
+F2C(EXPCMPC)(int *idne,
+	     void_int *nmap_ids,
+	     void_int *nmap_node_cnts,
+	     void_int *nproc_ptrs,
+	     void_int *emap_ids,
+	     void_int *emap_elem_cnts,
+	     void_int *eproc_ptrs,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_cmap_params_cc(*idne, nmap_ids, nmap_node_cnts,
+                                     nproc_ptrs, emap_ids, emap_elem_cnts,
+                                     eproc_ptrs)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write comm map parameters to file id %d",
+	    *idne);
+    ex_err("nepcmpc",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the nodal communications map for a single processor
+ */
+void
+F2C(EXGNCM)(int *idne,
+	    entity_id *map_id,
+	    void_int *node_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_node_cmap(*idne, *map_id, node_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read nodal communications map from file id %d",
+	    *idne);
+    ex_err("negncm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the nodal communications map for a single processor
+ */
+void
+F2C(EXPNCM)(int *idne,
+	    entity_id *map_id,
+	    void_int *node_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_node_cmap(*idne, *map_id, node_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write nodal communications map to file id %d",
+	    *idne);
+    ex_err("nepncm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the elemental communications map for a single processor
+ */
+void
+F2C(EXGECM)(int *idne,
+	    entity_id *map_id,
+	    void_int *elem_ids,
+	    void_int *side_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_elem_cmap(*idne, *map_id, elem_ids, side_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read elemental comm map from file id %d",
+	    *idne);
+    ex_err("negecm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the elemental communications map for a single processor
+ */
+void
+F2C(EXPECM)(int *idne,
+	    entity_id *map_id,
+	    void_int *elem_ids,
+	    void_int *side_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_elem_cmap(*idne, *map_id, elem_ids, side_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write elemental comm map to file id %d",
+	    *idne);
+    ex_err("nepecm",errmsg,EX_MSG);
+  }
+}
diff --git a/exodus/forbind/src/exo_jack.c b/exodus/forbind/src/exo_jack.c
new file mode 100644
index 0000000..9fcc317
--- /dev/null
+++ b/exodus/forbind/src/exo_jack.c
@@ -0,0 +1,4305 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.
+ *
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+/*
+ * OVERVIEW
+ *
+ * This file contains jacket routines written in C for interfacing Fortran
+ * ExodusII function calls to the actual C binding for ExodusII.
+
+ * In general, these functions handle
+ * character-string parameter conventions, convert between
+ * column-major-order arrays and row-major-order arrays, and map between
+ * array indices beginning at one and array indices beginning at zero.
+ *
+ */
+
+/* LINTLIBRARY */
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "netcdf.h"
+#include "exodusII.h"
+#include "exodusII_int.h"
+
+/*
+ * The Build64 is for the "normal" SEACAS build which uses compiler
+ * options to change reals and integers into 8-byte quantities.  The
+ * routines in addrwrap.F are used to down-convert the 8-byte integers
+ * into 4-byte integers which then call through to the routines in
+ * this file which have a '4' or '4_' appended to the routine name.
+ * These routines then call through to the C API routines.
+ *
+ * If DEFAULT_REAL_INT is defined, then the build is to build a
+ * fortran library interface that takes 4-byte ints and either 4-byte
+ * or 8-byte floating point (real/double) variables. In this case, the
+ * addrwrap routines are not built and a fortran client will call the
+ * routines in this file directly.
+ *
+ */
+
+#if defined(Build64) && !defined(DEFAULT_REAL_INT)
+/* 64-bit */
+#define real double
+#define entity_id ex_entity_id
+
+#ifdef ADDC_
+#define F2C(name,NAME) name##4_
+#else
+#ifdef _MSC_VER
+#define F2C(name,NAME) NAME##4
+#else
+#define F2C(name,NAME) name##4
+#endif
+#endif
+
+#else
+/* 32-bit */
+#define real float
+#define entity_id int
+#ifdef ADDC_
+#define F2C(name,NAME) name##_
+#else
+#ifdef _MSC_VER
+#define F2C(name,NAME) NAME
+#else
+#define F2C(name,NAME) name
+#endif
+#endif
+
+#endif /* 64 vs 32 bit build */
+
+extern int      ncopts;         /* default is (NC_FATAL | NC_VERBOSE) */
+extern int      exerrval;       /* global integer that contains a
+                                 * Exodus-specific error code */
+
+/* blank fill C string to make FORTRAN string */
+static void
+ex_fcdcpy(char *fstring,        /* output string to be blank-filled */
+          int fslen,            /* length of output string */
+          char *sstring)
+{                               /* input string, null-terminated */
+  int             i, len;
+
+  if (sstring != NULL) {
+    len = strlen(sstring);
+    if (len > fslen)
+      len = fslen;
+
+    for (i = 0; i < len; i++)
+      *(fstring + i) = *(sstring + i);
+    for (i = len; i < fslen; i++)
+      *(fstring + i) = ' ';
+  } else {
+    for (i = 0; i < fslen; i++)
+      *(fstring + i) = ' ';
+  }
+}
+
+/* copy function used to copy strings and strip trailing blanks */
+static void
+ex_fstrncpy(char *target,       /* space to be copied into */
+            char *source,       /* string to be copied */
+            int maxlen)
+{                               /* maximum length of *source */
+  int             len = maxlen;
+
+  while (len-- && *source != '\0')
+    *target++ = *source++;
+
+  len = maxlen;
+  while (len-- && *(--target) == ' ');  /* strip blanks */
+  *(++target) = '\0';           /* insert new EOS marker */
+}
+
+/* copy function used to copy strings terminated with blanks */
+static void
+ex_nstrncpy(char *target,       /* space to be copied into */
+            char *source,       /* string to be copied */
+            int maxlen)
+{                               /* maximum length of *source */
+  while (maxlen-- && *source != ' ')
+    *target++ = *source++;
+  *target = '\0';
+}
+
+/* Above are utility functions used below                                   */
+/* ======================================================================== */
+/* Below are the exodus API functions                                       */
+/*
+ * Adding a new function:
+ * +  Protect the name with the f2c (uppercase) macro which will add/not add '4' and or '_'
+ *    depending on the compilation mode.
+ *
+ * +  float/double arguments are declared as 'real' which will be replaced with float or double.
+ *
+ * +  If there are any character arguments 'X', then add an int* argument 'Xlen' at end of argument list
+ *    This will contain the length of the passed in character argument.
+ *
+ * +  Look at existing functions for guidance...
+ */
+
+/*
+ * create an EXODUS II file
+ */
+int
+F2C(excre,EXCRE) (char *path,
+            int *clobmode,
+            int *cpu_word_size,
+            int *io_word_size,
+            int *ierr,
+            int pathlen)
+{
+  char           *name;
+  int             idexo;
+
+  if (!(name = malloc((pathlen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return (EX_FATAL);
+  }
+  (void) ex_nstrncpy(name, path, pathlen);
+
+  if ((idexo = ex_create(name, *clobmode, cpu_word_size, io_word_size)) != EX_FATAL) {
+    free(name);
+    *ierr = 0;
+    return (idexo);
+  }
+  free(name);
+  *ierr = exerrval;
+  return (EX_FATAL);
+}
+
+/*
+ * open an EXODUS II file
+ */
+int
+F2C(exopen,EXOPEN) (char *path,
+             int *mode,
+             int *cpu_word_size,
+             int *io_word_size,
+             float *version,    /* This is float always; not real */
+             int *ierr,
+             int pathlen)
+{
+  char           *name;
+  int             idexo;
+
+  if (!(name = malloc((pathlen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return (EX_FATAL);
+  }
+  (void) ex_nstrncpy(name, path, pathlen);
+  if ((idexo = ex_open(name, *mode, cpu_word_size, io_word_size, version)) != EX_FATAL) {
+    free(name);
+    *ierr = 0;
+    return (idexo);
+  }
+  free(name);
+  *ierr = EX_FATAL;
+  return (EX_FATAL);
+}
+
+/*
+ * close an EXODUS II file
+ */
+void
+F2C(exclos,EXCLOS) (int *idexo, int *ierr)
+{
+  *ierr = ex_close(*idexo);
+}
+
+/*
+ * update an EXODUS II file
+ */
+void
+F2C(exupda,EXUPDA) (int *idexo, int *ierr)
+{
+  *ierr = ex_update(*idexo);
+}
+
+/*
+ * write initialization parameters
+ */
+void
+F2C(expini,EXPINI) (int *idexo,
+             char *title,
+             void_int *num_dim,
+             void_int *num_nodes,
+             void_int *num_elem,
+             void_int *num_elem_blk,
+             void_int *num_node_sets,
+             void_int *num_side_sets,
+             int *ierr,
+             int titlelen)
+{
+  int             slen;
+  char           *name;
+
+  slen = MAX_LINE_LENGTH;       /* max line size */
+  if (titlelen != MAX_LINE_LENGTH) {
+    slen = titlelen;
+  }
+  name = malloc((slen + 1) * sizeof(char));
+  (void) ex_fstrncpy(name, title, slen);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t *n_dim 	 = num_dim;
+    int64_t *n_nodes 	 = num_nodes;
+    int64_t *n_elem  	 = num_elem;
+    int64_t *n_elem_blk  = num_elem_blk;
+    int64_t *n_node_sets = num_node_sets;
+    int64_t *n_side_sets = num_side_sets;
+
+    *ierr = ex_put_init(*idexo, name, *n_dim, *n_nodes, *n_elem,
+			*n_elem_blk, *n_node_sets, *n_side_sets);
+  } else {
+    int *n_dim 	     = num_dim;
+    int *n_nodes     = num_nodes;
+    int *n_elem      = num_elem;
+    int *n_elem_blk  = num_elem_blk;
+    int *n_node_sets = num_node_sets;
+    int *n_side_sets = num_side_sets;
+
+    *ierr = ex_put_init(*idexo, name, *n_dim, *n_nodes, *n_elem,
+			*n_elem_blk, *n_node_sets, *n_side_sets);
+  }
+  free(name);
+}
+
+/*
+ * read initialization parameters
+ */
+void
+F2C(exgini,EXGINI) (int *idexo,
+             char *title,
+             void_int *num_dim,
+             void_int *num_nodes,
+             void_int *num_elem,
+             void_int *num_elem_blk,
+             void_int *num_node_sets,
+             void_int *num_side_sets,
+             int *ierr,
+             int titlelen)
+{
+  int             slen;
+  char           *name;
+
+  *ierr = 0;
+  slen = MAX_LINE_LENGTH;       /* max line size */
+  if (titlelen != MAX_LINE_LENGTH) {
+    slen = titlelen;
+  }
+  name = malloc((slen + 1) * sizeof(char));
+  memset(name, 0, slen + 1);
+
+  *ierr = ex_get_init(*idexo, name, num_dim, num_nodes, num_elem, num_elem_blk,
+                      num_node_sets, num_side_sets);
+
+  ex_fcdcpy(title, slen, name);
+  free(name);
+}
+
+/*
+ * write QA records
+ */
+void
+F2C(expqa,EXPQA) (int *idexo,
+            int *num_qa_records,
+            char *qa_record,
+            int *ierr,
+            int qa_recordlen)
+{
+  char            errmsg[MAX_ERR_LENGTH];
+  char          **sptr;         /* internal string pointer array for malloc
+                                 * use */
+  int             i, ii, iii, slen, alen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (qa_recordlen != MAX_STR_LENGTH) {
+    slen = qa_recordlen;
+  }
+  alen = 4;                     /* qa records are 4 strings deep */
+
+  /* Allocate space for the name ptr array */
+  if (!(sptr = malloc(((*num_qa_records) * alen + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate space for each of the strings, where size = slen, place
+   * ptr into str ptr array,  and Copy Fortran qa records to staging
+   * space
+   */
+  iii = 0;                      /* offset counter */
+  for (i = 0; i < *num_qa_records; i++) {
+    for (ii = 0; ii < alen; ii++) {
+      *(sptr + iii) = malloc((slen + 1) * sizeof(char));
+      if (*(sptr + iii) == 0) {
+        free(sptr);             /* free up array ptr space */
+        *ierr = EX_MEMFAIL;
+        sprintf(errmsg,
+          "Error: failed to allocate space for qa record %d for file id %d",
+                i, *idexo);
+        ex_err("expqa", errmsg, EX_MEMFAIL);
+        return;
+      }
+      /* copy fortran string into allocated space */
+      ex_fstrncpy(*(sptr + iii), qa_record + iii * qa_recordlen, slen);
+      iii++;                    /* bump char array pointer */
+    }
+  }
+  *(sptr + iii) = 0;            /* set last pointer to null */
+
+  if (ex_put_qa(*idexo, *num_qa_records, (void *) sptr) == EX_FATAL)
+    *ierr = EX_FATAL;
+
+  /* Free up the space we used */
+  iii = 0;
+  for (i = 0; i < *num_qa_records; i++) {
+    for (ii = 0; ii < alen; ii++) {
+      free(*(sptr + iii));      /* First free up string space */
+      iii++;
+    }
+  }
+  free(sptr);                   /* Then free up array ptr space */
+}
+
+/*
+ * read QA records
+ */
+void
+F2C(exgqa,EXGQA) (int *idexo,
+            char *qa_record,
+            int *ierr,
+            int qa_recordlen)
+{
+  int             num_qa_records;
+  char          **sptr;         /* internal string pointer array for malloc
+                                 * use */
+  int             i, ii, iii, slen, alen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (qa_recordlen != MAX_STR_LENGTH) {
+    slen = qa_recordlen;
+  }
+  alen = 4;                     /* qa records are 4 strings deep */
+
+  /* do ExodusII C call to find out how many qa records are avail */
+  num_qa_records = ex_inquire_int(*idexo, EX_INQ_QA);
+  if (num_qa_records < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  /* Allocate space for the QA string ptr array */
+  if (!(sptr = malloc((num_qa_records * alen + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Step 1: Allocate space for each of the strings, where size = slen,
+   * place string ptr into str ptr array. Step 2: Call routine to get
+   * qa records Step 3: Copy C qa records to passed Fortran array space
+   */
+
+  iii = 0;                      /* offset counter */
+  for (i = 0; i < num_qa_records; i++) {        /* pointer allocation loop */
+    for (ii = 0; ii < alen; ii++) {
+      *(sptr + iii) = malloc((slen + 1) * sizeof(char));
+      if (*(sptr + iii) == 0) {
+	free(sptr);
+        *ierr = EX_MEMFAIL;
+        return;
+      }
+      iii++;                    /* bump char array pointer */
+    }
+  }
+  *(sptr + iii) = 0;            /* null out last pointer */
+
+  /* do ExodusII C call to get qa records */
+  if (ex_get_qa(*idexo, (void *) sptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    goto error_ret;
+  }
+  iii = 0;                      /* offset counter */
+  for (i = 0; i < num_qa_records; i++) {        /* string copy loop */
+    for (ii = 0; ii < alen; ii++) {
+      /* copy fortran string into allocated space */
+      ex_fcdcpy(qa_record + iii * qa_recordlen, slen, *(sptr + iii));
+      iii++;                    /* bump char array pointer */
+    }
+  }
+
+ error_ret:
+  /* Free up the space we used */
+  iii = 0;
+  for (i = 0; i < num_qa_records; i++) {
+    for (ii = 0; ii < alen; ii++) {
+      free(*(sptr + iii));      /* First free up string space */
+      iii++;
+    }
+  }
+  free(sptr);                   /* Then free up array ptr space */
+}
+
+/*
+ * write information records
+ */
+void
+F2C(expinf,EXPINF) (int *idexo,
+             int *num_info,
+             char *info,
+             int *ierr,
+             int infolen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+  slen = MAX_LINE_LENGTH;       /* max str size */
+  if (infolen != MAX_LINE_LENGTH) {
+    slen = infolen;
+  }
+  /* Allocate space for the string ptr array */
+  if (!(aptr = malloc(((*num_info) + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the info records */
+  if (!(sptr = malloc(*num_info * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy Fortran info records to staging space */
+  for (i = 0; i < *num_info; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), info + i * infolen, slen); /* copy string into
+                                                         * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+  if (ex_put_info(*idexo, *num_info, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* Free up string staging area */
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * read information records
+ */
+void
+F2C(exginf,EXGINF) (int *idexo,
+             char *info,
+             int *ierr,
+             int infolen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen, num_info;
+
+  *ierr = 0;                    /* default no errror */
+
+  /* do exodusII C call to find out how many info records are avail */
+  num_info = ex_inquire_int(*idexo, EX_INQ_INFO);
+  if (num_info < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  slen = MAX_LINE_LENGTH;       /* max str size */
+  if (infolen != MAX_LINE_LENGTH) {
+    slen = infolen;
+  }
+  /*
+   * Step 1: Allocate space for string ptr array Step 2: Allocate space
+   * for info record strings, and put pointers into str ptr array Step
+   * 3: Do ExodusII call to get records Step 4: Copy strings into
+   * passed Fortran buffer space
+   */
+
+  /* Allocate space for the string ptr array */
+  if (!(aptr = malloc((num_info + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate block of space for info strings */
+  if (!(sptr = malloc(num_info * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  for (i = 0; i < num_info; i++)/* Put pointers to the info records in ptr
+                                 * array */
+    *(aptr + i) = sptr + i * (slen + 1);        /* put ptr in string ptr
+                                                 * array */
+  *(aptr + i) = 0;              /* null out last pointer */
+
+  /* Do exodusII call to get info records */
+  if (ex_get_info(*idexo, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);
+    free(aptr);
+    return;
+  }
+  for (i = 0; i < num_info; i++) {      /* Copy Fortran info records to
+                                         * staging space */
+    ex_fcdcpy(info + i * infolen, slen, *(aptr + i));   /* copy string into
+                                                         * buffer */
+    /** printf("[exginf] rec: %d , %s\n",i,*(aptr+i)); **/
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+
+}
+
+/*
+ * write nodal coordinates
+ */
+void
+F2C(expcor,EXPCOR) (int *idexo,
+             real * x_coor,
+             real * y_coor,
+             real * z_coor,
+             int *ierr)
+{
+  *ierr = ex_put_coord(*idexo, x_coor, y_coor, z_coor);
+}
+
+/*
+ * read nodal coordinates
+ */
+void
+F2C(exgcor,EXGCOR) (int *idexo,
+             real * x_coor,
+             real * y_coor,
+             real * z_coor,
+             int *ierr)
+{
+  *ierr = ex_get_coord(*idexo, x_coor, y_coor, z_coor);
+}
+
+/*
+ * write coordinate names
+ */
+void
+F2C(expcon,EXPCON) (int *idexo,
+             char *coord_names,
+             int *ierr,
+             int coord_nameslen)
+{
+  char          **aptr;         /* internal array of string pointers for
+                                 * malloc use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, ndim, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (coord_nameslen < slen) {
+    slen = coord_nameslen;
+  }
+  /* do ExodusII C call to find out how many dimensions  */
+  ndim = ex_inquire_int(*idexo, EX_INQ_DIM);
+  if (ndim < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+
+  /* Allocate space for the name ptr array */
+  if (!(aptr = malloc((ndim + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate a block of space for the strings, where size = slen,
+   * place ptrs into str ptr array,  and Copy Fortran coordinate names
+   * to staging space
+   */
+
+  if (!(sptr = malloc(ndim * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);
+    return;
+  }
+  for (i = 0; i < ndim; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);
+    /* copy fortran string into allocated space */
+    ex_fstrncpy(*(aptr + i), coord_names + i * coord_nameslen, slen);
+  }
+  *(aptr + i) = 0;              /* set last pointer to null */
+
+  if (ex_put_coord_names(*idexo, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  /* Free up the space we used */
+  free(sptr);                   /* First free up string space */
+  free(aptr);                   /* Then free up array ptr space */
+}
+/*
+ * read coordinate names
+ */
+void
+F2C(exgcon,EXGCON) (int *idexo,
+             char *coord_names,
+             int *ierr,
+             int coord_nameslen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             ndim;
+  int             i, slen;
+
+  *ierr = 0;                    /* default no error */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (coord_nameslen < slen) {
+    slen = coord_nameslen;
+  }
+  /* do ExodusII C call to find out how many dimensions */
+  ndim = ex_inquire_int(*idexo, EX_INQ_DIM);
+  if (ndim < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+
+  /* allocate memory to stage the coordinate name ptrs into */
+  if (!(aptr = malloc((ndim + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* allocate a block of memory to stage the coordinate names into */
+  if (!(sptr = malloc(ndim * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* free up array ptr space */
+    return;
+  }
+  for (i = 0; i < ndim; i++) {  /* put pointers to staging space into ptr
+                                 * array */
+    *(aptr + i) = sptr + i * (slen + 1);
+  }
+
+  /* do ExodusII C call to get coord name records */
+  if (ex_get_coord_names(*idexo, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up string space */
+    free(aptr);                 /* free up array ptr space */
+    return;
+  }
+  /* copy C strings to Fortran arrays */
+  memset(coord_names, 0, ndim * coord_nameslen);
+  for (i = 0; i < ndim; i++) {
+    ex_fcdcpy(coord_names + i * coord_nameslen, slen, *(aptr + i));     /* copy and blank fill */
+  }
+
+  free(sptr);                   /* Free up string buffer space */
+  free(aptr);                   /* Finally, free up array ptr space */
+  return;
+}
+
+/*
+ * write element order map
+ */
+void
+F2C(expmap,EXPMAP) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_put_map(*idexo, elem_map);
+}
+
+/*
+ * read element order map
+ */
+void
+F2C(exgmap,EXGMAP) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_get_map(*idexo, elem_map);
+}
+
+/*
+ * write concatenated element block parameters
+ */
+void
+F2C(expclb,EXPCLB) (int *idexo,
+             void_int *elem_blk_id,
+             char *elem_type,
+             void_int *num_elem_this_blk,
+             void_int *num_nodes_per_elem,
+             void_int *num_attr,
+             int *create_maps,
+             int *ierr,
+             int elem_typelen)
+{
+  int     num_elem_blk;
+
+  char  **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char   *sptr;         /* ptr to temp staging space for strings */
+  int     i;
+  size_t  slen;
+
+  *ierr = 0;                    /* default no error */
+
+  num_elem_blk = ex_inquire_int(*idexo, EX_INQ_ELEM_BLK);
+  if (num_elem_blk < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (elem_typelen != MAX_STR_LENGTH) {
+    slen = elem_typelen;
+  }
+  /* allocate memory for pointer array */
+  if (!(aptr = malloc((num_elem_blk + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* allocate memory to stage the element type name into */
+  if (!(sptr = malloc(num_elem_blk * (slen + 1) * sizeof(char)))) {
+    free(aptr);
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy element type names from Fortran array to staging area */
+  for (i = 0; i < num_elem_blk; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), elem_type + i * elem_typelen, slen);       /* copy string into
+                                                                         * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  if (ex_put_concat_elem_block(*idexo, elem_blk_id, aptr, num_elem_this_blk,
+                  num_nodes_per_elem, num_attr, *create_maps) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+  free(aptr);
+}
+
+/*
+ * write element block parameters
+ */
+void
+F2C(expelb,EXPELB) (int *idexo,
+             entity_id *elem_blk_id,
+             char *elem_type,
+             void_int *num_elem_this_blk,
+             void_int *num_nodes_per_elem,
+             void_int *num_attr,
+             int *ierr,
+             int elem_typelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;                    /* default no error */
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (elem_typelen != MAX_STR_LENGTH) {
+    slen = elem_typelen;
+  }
+  /* allocate memory to stage the element type name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy element type names from Fortran array to staging area */
+  ex_fstrncpy(sptr, elem_type, slen);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t *n_elem_this_blk  = num_elem_this_blk;
+    int64_t *n_nodes_per_elem = num_nodes_per_elem;
+    int64_t *n_attr           = num_attr;
+
+    *ierr = ex_put_elem_block(*idexo, *elem_blk_id, sptr, *n_elem_this_blk,
+			      *n_nodes_per_elem, *n_attr);
+  } else {
+    int *n_elem_this_blk  = num_elem_this_blk;
+    int *n_nodes_per_elem = num_nodes_per_elem;
+    int *n_attr           = num_attr;
+
+    *ierr = ex_put_elem_block(*idexo, *elem_blk_id, sptr, *n_elem_this_blk,
+			      *n_nodes_per_elem, *n_attr);
+  }
+  free(sptr);
+}
+
+/*
+ * read element block parameters
+ */
+void
+F2C(exgelb,EXGELB) (int *idexo,
+             entity_id *elem_blk_id,
+             char *elem_type,
+             void_int *num_elem_this_blk,
+             void_int *num_nodes_per_elem,
+             void_int *num_attr,
+             int *ierr,
+             int elem_typelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = MAX_STR_LENGTH;        /* max str size */
+  if (elem_typelen != MAX_STR_LENGTH) {
+    slen = elem_typelen;
+  }
+  /* allocate memory to stage the element type names into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  if (ex_get_elem_block(*idexo, *elem_blk_id, sptr, num_elem_this_blk,
+                        num_nodes_per_elem, num_attr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    return;
+  }
+  /* Copy element type name from staging area to Fortran array */
+  memset(elem_type, 0, elem_typelen);
+  ex_fcdcpy(elem_type, slen, sptr);
+  free(sptr);
+
+}
+
+/*
+ * read element blocks IDs
+ */
+void
+F2C(exgebi,EXGEBI) (int *idexo,
+             void_int *elem_blk_ids,
+             int *ierr)
+{
+  *ierr = ex_get_elem_blk_ids(*idexo, elem_blk_ids);
+}
+
+/*
+ * write element block connectivity
+ */
+void
+F2C(expelc,EXPELC) (int *idexo,
+             entity_id *elem_blk_id,
+             void_int *connect,
+             int *ierr)
+{
+  *ierr = ex_put_elem_conn(*idexo, *elem_blk_id, connect);
+}
+
+/*
+ * read element block connectivity
+ */
+void
+F2C(exgelc,EXGELC) (int *idexo,
+             entity_id *elem_blk_id,
+             void_int *connect,
+             int *ierr)
+{
+  *ierr = ex_get_elem_conn(*idexo, *elem_blk_id, connect);
+}
+
+/*
+ * write entity count-per-polyhedra information for nsided block
+ */
+void
+F2C(expecpp,EXPECPP) (int *idexo,
+              int *obj_type,
+              entity_id *elem_blk_id,
+              int *counts,
+              int *ierr)
+{
+  *ierr = ex_put_entity_count_per_polyhedra(*idexo, (ex_entity_type) * obj_type, *elem_blk_id, counts);
+}
+
+/*
+ * read entity count-per-polyhedra information for nsided block
+ */
+void
+F2C(exgecpp,EXGECPP) (int *idexo,
+              int *obj_type,
+              entity_id *elem_blk_id,
+              int *counts,
+              int *ierr)
+{
+  *ierr = ex_get_entity_count_per_polyhedra(*idexo, (ex_entity_type) * obj_type, *elem_blk_id, counts);
+}
+
+/*
+ * write element block attributes
+ */
+void
+F2C(expeat,EXPEAT) (int *idexo,
+             entity_id *elem_blk_id,
+             real * attrib,
+             int *ierr)
+{
+  *ierr = ex_put_elem_attr(*idexo, *elem_blk_id, attrib);
+}
+
+
+/*
+ * read element block attributes
+ */
+void
+F2C(exgeat,EXGEAT) (int *idexo,
+             entity_id *elem_blk_id,
+             real * attrib,
+             int *ierr)
+{
+  *ierr = ex_get_elem_attr(*idexo, *elem_blk_id, attrib);
+}
+
+/*
+ * read element block attribute names
+ */
+void
+F2C(exgean,EXGEAN) (int *idexo,
+             entity_id *elem_blk_id,
+             int *num_attr,
+             char *names,
+             int *ierr,
+             int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_attr + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_attr * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  for (i = 0; i < *num_attr; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  *ierr = 0;
+  if (ex_get_elem_attr_names(*idexo, *elem_blk_id, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    free(aptr);
+    return;
+  }
+  /* Copy Fortran names from staging space */
+  memset(names, 0, *num_attr * nameslen);
+  for (i = 0; i < *num_attr; i++) {
+    ex_fcdcpy(names + i * nameslen, slen, *(aptr + i)); /* copy str into Fortran
+                                                         * buffer */
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write element block attribute names
+ */
+void
+F2C(expean,EXPEAN) (int *idexo,
+             entity_id *elem_blk_id,
+             int *num_attr,
+             char *names,
+             int *ierr,
+             int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_attr + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_attr * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  /* Copy Fortran names to staging space */
+  for (i = 0; i < *num_attr; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), names + i * nameslen, slen);       /* copy string into
+                                                                 * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  *ierr = 0;
+  if (ex_put_elem_attr_names(*idexo, *elem_blk_id, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write object names
+ */
+void
+F2C(expnams,EXPNAMS) (int *idexo,
+              int *type,
+              int *num_obj,
+              char *names,
+              int *ierr,
+              int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory for pointer array */
+  if (!(aptr = malloc((*num_obj + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_obj * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy Fortran names to staging space */
+  for (i = 0; i < *num_obj; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), names + i * nameslen, slen);       /* copy string into
+                                                                 * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+  /* do ExodusII C call to write results variables names */
+  if (ex_put_names(*idexo, (ex_entity_type) * type, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * read object names
+ */
+void
+F2C(exgnams,EXGNAMS) (int *idexo,
+              int *type,
+              int *num_obj,
+              char *names,
+              int *ierr,
+              int nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (nameslen < slen) {
+    slen = nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_obj + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_obj * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  for (i = 0; i < *num_obj; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  /* do ExodusII C call to read results variables names */
+  if (ex_get_names(*idexo, (ex_entity_type) * type, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    free(aptr);
+    return;
+  }
+  /* Copy Fortran names from staging space */
+  memset(names, 0, *num_obj * nameslen);
+  for (i = 0; i < *num_obj; i++) {
+    ex_fcdcpy(names + i * nameslen, slen, *(aptr + i)); /* copy str into Fortran
+                                                         * buffer */
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write property array names
+ */
+void
+F2C(exppn,EXPPN) (int *idexo,
+            int *obj_type,
+            int *num_props,
+            char *prop_names,
+            int *ierr,
+            int prop_nameslen)
+{
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (prop_nameslen < slen) {
+    slen = prop_nameslen;
+  }
+  /* Allocate space for the name ptr array */
+  if (!(aptr = malloc((*num_props + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate a block of space for the strings, where size = slen,
+   * place ptrs into str ptr array,  and Copy Fortran coordinate names
+   * to staging space
+   */
+
+  if (!(sptr = malloc((*num_props) * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);
+    return;
+  }
+  for (i = 0; i < *num_props; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);
+    /* copy fortran string into allocated space */
+    ex_fstrncpy(*(aptr + i), prop_names + i * prop_nameslen, slen);
+  }
+  *(aptr + i) = 0;              /* set last pointer to null */
+
+  if (ex_put_prop_names(*idexo, (ex_entity_type) * obj_type, *num_props, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  /* Free up the space we used */
+  free(sptr);                   /* First free up string space */
+  free(aptr);                   /* Then free up array ptr space */
+}
+
+
+/*
+ * read property array names
+ */
+void
+F2C(exgpn,EXGPN) (int *idexo,
+            int *obj_type,
+            char *prop_names,
+            int *ierr,
+            int prop_nameslen)
+{
+  char            errmsg[MAX_ERR_LENGTH];
+  char          **aptr;         /* internal string array pointer for malloc
+                                 * use */
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             i, slen;
+  ex_inquiry      inq_code;
+  int             num_props;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (prop_nameslen < slen) {
+    slen = prop_nameslen;
+  }
+  switch ((ex_entity_type) * obj_type) {
+  case EX_ELEM_BLOCK:
+    inq_code = EX_INQ_EB_PROP;
+    break;
+  case EX_NODE_SET:
+    inq_code = EX_INQ_NS_PROP;
+    break;
+  case EX_SIDE_SET:
+    inq_code = EX_INQ_SS_PROP;
+    break;
+  case EX_ELEM_MAP:
+    inq_code = EX_INQ_EM_PROP;
+    break;
+  case EX_NODE_MAP:
+    inq_code = EX_INQ_NM_PROP;
+    break;
+  default:
+    exerrval = EX_BADPARAM;
+    *ierr = EX_BADPARAM;
+    sprintf(errmsg, "Error: object type %d not supported; file id %d",
+            *obj_type, *idexo);
+    ex_err("exgpn", errmsg, exerrval);
+    return;
+  }
+
+
+  /* do ExodusII C call to find out how many properties */
+  num_props = ex_inquire_int(*idexo, inq_code);
+  if (num_props < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  /* Allocate space for the name ptr array */
+  if (!(aptr = malloc((num_props + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /*
+   * Allocate a block of space for the strings, where size = slen,
+   * place ptrs into str ptr array,  and Copy Fortran coordinate names
+   * to staging space
+   */
+
+  if (!(sptr = malloc(num_props * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);
+    return;
+  }
+  memset(sptr, 0, num_props * (slen + 1));
+
+  for (i = 0; i < num_props; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put ptrs to staging space
+                                                 * into ptr array */
+  *(aptr + i) = 0;              /* set last pointer to null */
+
+  /* do ExodusII C call to get property name records */
+  if (ex_get_prop_names(*idexo, (ex_entity_type) * obj_type, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up string space */
+    free(aptr);                 /* free up array ptr space */
+    return;
+  }
+  /* copy C strings to Fortran arrays */
+  memset(prop_names, 0, num_props * prop_nameslen);
+  for (i = 0; i < num_props; i++) {
+    ex_fcdcpy(prop_names + i * prop_nameslen, slen, *(aptr + i));       /* copy and blank fill */
+  }
+
+  /* Free up the space we used */
+  free(sptr);                   /* First free up string space */
+  free(aptr);                   /* Then free up array ptr space */
+}
+
+/*
+ * write object property
+ */
+void
+F2C(expp,EXPP) (int *idexo,
+           int *obj_type,
+           entity_id *obj_id,
+           char *prop_name,
+           entity_id *value,
+           int *ierr,
+           int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+  *ierr = ex_put_prop(*idexo, (ex_entity_type) * obj_type, *obj_id, sptr, *value);
+
+  free(sptr);
+}
+
+/*
+ * read object property
+ */
+void
+F2C(exgp,EXGP) (int *idexo,
+           int *obj_type,
+           entity_id *obj_id,
+           char *prop_name,
+           void_int *value,
+           int *ierr,
+           int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+  /* use exodusII C routine to get the property value */
+  if (ex_get_prop(*idexo, (ex_entity_type) * obj_type, *obj_id, sptr, value) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+}
+
+/*
+ * read object property array
+ */
+void
+F2C(exgpa,EXGPA) (int *idexo,
+            int *obj_type,
+            char *prop_name,
+            void_int *values,
+            int *ierr,
+            int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  memset(sptr, 0, slen + 1);
+
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+
+  /* use exodusII C routine to get the values array */
+  if (ex_get_prop_array(*idexo, (ex_entity_type) * obj_type, sptr, values) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+}
+
+/*
+ * write object property array
+ */
+void
+F2C(exppa,EXPPA) (int *idexo,
+            int *obj_type,
+            char *prop_name,
+            void_int *values,
+            int *ierr,
+            int prop_namelen)
+{
+  char           *sptr;         /* internal string pointer for malloc use */
+  int             slen;
+
+  *ierr = 0;
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (prop_namelen < slen) {
+    slen = prop_namelen;
+  }
+  /* allocate memory to stage the property name into */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy property name from Fortran string to staging area */
+  ex_fstrncpy(sptr, prop_name, slen);
+
+
+  /* Use exodusII C routine to store the property values */
+  if (ex_put_prop_array(*idexo, (ex_entity_type) * obj_type, sptr, values) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);
+}
+
+/*
+ * write node set parameters
+ */
+void
+F2C(expnp,EXPNP) (int *idexo,
+            entity_id *node_set_id,
+            void_int *num_nodes_in_set,
+            void_int *num_dist_in_set,
+            int *ierr)
+{
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t nnis = *(int64_t*)num_nodes_in_set;
+    int64_t ndis = *(int64_t*)num_dist_in_set;
+    *ierr = ex_put_node_set_param(*idexo, *node_set_id, nnis, ndis);
+  } else {
+    int nnis = *(int*)num_nodes_in_set;
+    int ndis = *(int*)num_dist_in_set;
+    *ierr = ex_put_node_set_param(*idexo, *node_set_id, nnis, ndis);
+  }
+}
+
+/*
+ * read node set parameters
+ */
+void
+F2C(exgnp,EXGNP) (int *idexo,
+            entity_id *node_set_id,
+            void_int *num_nodes_in_set,
+            void_int *num_dist_in_set,
+            int *ierr)
+{
+  *ierr = ex_get_node_set_param(*idexo, *node_set_id, num_nodes_in_set, num_dist_in_set);
+}
+
+/*
+ * write node set
+ */
+void
+F2C(expns,EXPNS) (int *idexo,
+            entity_id *node_set_id,
+            void_int *node_set_node_list,
+            int *ierr)
+{
+  *ierr = ex_put_node_set(*idexo, *node_set_id, node_set_node_list);
+}
+
+/*
+ * write node set dist factors
+ */
+void
+F2C(expnsd,EXPNSD) (int *idexo,
+             entity_id *node_set_id,
+             real * node_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_put_node_set_dist_fact(*idexo, *node_set_id, node_set_dist_fact);
+}
+
+/*
+ * read node set
+ */
+void
+F2C(exgns,EXGNS) (int *idexo,
+            entity_id *node_set_id,
+            void_int *node_set_node_list,
+            int *ierr)
+{
+  *ierr = ex_get_node_set(*idexo, *node_set_id, node_set_node_list);
+}
+
+/*
+ * read node set dist factors
+ */
+void
+F2C(exgnsd,EXGNSD) (int *idexo,
+             entity_id *node_set_id,
+             real * node_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_get_node_set_dist_fact(*idexo, *node_set_id, node_set_dist_fact);
+}
+
+
+/*
+ * read node sets IDs
+ */
+void
+F2C(exgnsi,EXGNSI) (int *idexo,
+             void_int *node_set_ids,
+             int *ierr)
+{
+  *ierr = ex_get_node_set_ids(*idexo, node_set_ids);
+}
+
+/*
+ * write concatenated node sets
+ */
+void
+F2C(expcns,EXPCNS) (int *idexo,
+             void_int *node_set_ids,
+             void_int *num_nodes_per_set,
+             void_int *num_dist_per_set,
+             void_int *node_sets_node_index,
+             void_int *node_sets_dist_index,
+             void_int *node_sets_node_list,
+             real * node_sets_dist_fact,
+             int *ierr)
+{
+  int num_node_sets, i;
+  int int_size;
+
+  void_int *node_index_ptr, *dist_index_ptr;
+
+  *ierr = 0;
+
+  num_node_sets = ex_inquire_int(*idexo, EX_INQ_NODE_SETS);
+  if (num_node_sets < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  int_size = sizeof(int);
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int_size = sizeof(int64_t);
+  }
+  
+  /* allocate memory for C node index array */
+  if (!(node_index_ptr = malloc(num_node_sets * int_size))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* allocate memory for C dist factor index array */
+  if (!(dist_index_ptr = malloc(num_node_sets * int_size))) {
+    free(node_index_ptr);
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+
+  if (int_size == sizeof(int64_t)) {
+    for (i = 0; i < num_node_sets; i++) { /* change from 1-based to 0 index */
+      ((int64_t*)node_index_ptr)[i] = ((int64_t*)node_sets_node_index)[i] - 1;
+      ((int64_t*)dist_index_ptr)[i] = ((int64_t*)node_sets_dist_index)[i] - 1;
+    }
+  } else {
+    for (i = 0; i < num_node_sets; i++) { /* change from 1-based to 0 index */
+      ((int*)node_index_ptr)[i] = ((int*)node_sets_node_index)[i] - 1;
+      ((int*)dist_index_ptr)[i] = ((int*)node_sets_dist_index)[i] - 1;
+    }
+  }
+
+  *ierr = ex_put_concat_node_sets(*idexo, node_set_ids, num_nodes_per_set,
+				  num_dist_per_set, node_index_ptr,
+				  dist_index_ptr, node_sets_node_list,
+				  node_sets_dist_fact);
+  free(node_index_ptr);
+  free(dist_index_ptr);
+}
+
+/*
+ * read concatenated node sets
+ */
+void
+F2C(exgcns,EXGCNS) (int *idexo,
+             void_int *node_set_ids,
+             void_int *num_nodes_per_set,
+             void_int *num_dist_per_set,
+             void_int *node_sets_node_index,
+             void_int *node_sets_dist_index,
+             void_int *node_sets_node_list,
+             real * node_sets_dist_fact,
+             int *ierr)
+{
+  int num_node_sets, i;
+
+  *ierr = ex_get_concat_node_sets(*idexo, node_set_ids, num_nodes_per_set,
+				  num_dist_per_set, node_sets_node_index,
+				  node_sets_dist_index, node_sets_node_list,
+				  node_sets_dist_fact);
+
+  num_node_sets = ex_inquire_int(*idexo, EX_INQ_NODE_SETS);
+  if (num_node_sets < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    for (i = 0; i < num_node_sets; i++) { /* change from 0-based to 1 index */
+      ((int64_t*)node_sets_node_index)[i] += 1;
+      ((int64_t*)node_sets_dist_index)[i] += 1;
+    }
+  } else {
+    for (i = 0; i < num_node_sets; i++) { /* change from 0-based to 1 index */
+      ((int*)node_sets_node_index)[i] += 1;
+      ((int*)node_sets_dist_index)[i] += 1;
+    }
+  }
+}
+
+/*
+ * write side set parameters
+ */
+void
+F2C(expsp,EXPSP) (int *idexo,
+            entity_id *side_set_id,
+            void_int *num_sides_in_set,
+            void_int *num_df_in_set,
+            int *ierr)
+{
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int64_t nsis = *(int64_t*)num_sides_in_set;
+    int64_t ndis = *(int64_t*)num_df_in_set;
+    *ierr = ex_put_side_set_param(*idexo, *side_set_id, nsis, ndis);
+  } else {
+    int nsis = *(int*)num_sides_in_set;
+    int ndis = *(int*)num_df_in_set;
+    *ierr = ex_put_side_set_param(*idexo, *side_set_id, nsis, ndis);
+  }
+}
+
+/*
+ * read side set parameters
+ */
+void
+F2C(exgsp,EXGSP) (int *idexo,
+            entity_id *side_set_id,
+            void_int *num_sides_in_set,
+            void_int *num_df_in_set,
+            int *ierr)
+{
+  *ierr = ex_get_side_set_param(*idexo, *side_set_id, num_sides_in_set, num_df_in_set);
+}
+
+/*
+ * get side set node list length
+ */
+void
+F2C(exgsnl,EXGSNL) (int *idexo,
+             entity_id *side_set_id,
+             void_int *num_nodes_in_set,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_node_list_len(*idexo, *side_set_id, num_nodes_in_set);
+}
+
+/*
+ * write side set
+ */
+void
+F2C(expss,EXPSS) (int *idexo,
+            entity_id *side_set_id,
+            void_int *side_set_elem_list,
+            void_int *side_set_side_list,
+            int *ierr)
+{
+  *ierr = ex_put_side_set(*idexo, *side_set_id, side_set_elem_list, side_set_side_list);
+}
+
+/*
+ * read side set
+ */
+void
+F2C(exgss,EXGSS) (int *idexo,
+            entity_id *side_set_id,
+            void_int *side_set_elem_list,
+            void_int *side_set_side_list,
+            int *ierr)
+{
+  *ierr = ex_get_side_set(*idexo, *side_set_id, side_set_elem_list, side_set_side_list);
+}
+
+/*
+ * write side set distribution factors
+ */
+void
+F2C(expssd,EXPSSD) (int *idexo,
+             entity_id *side_set_id,
+             real * side_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_put_side_set_dist_fact(*idexo, *side_set_id, side_set_dist_fact);
+}
+
+/*
+ * read side set distribution factors
+ */
+void
+F2C(exgssd,EXGSSD) (int *idexo,
+             entity_id *side_set_id,
+             real * side_set_dist_fact,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_dist_fact(*idexo, *side_set_id, side_set_dist_fact);
+}
+
+/*
+ * read side sets IDs
+ */
+void
+F2C(exgssi,EXGSSI) (int *idexo,
+             void_int *side_set_ids,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_ids(*idexo, side_set_ids);
+}
+
+/*
+ * write concatenated side sets
+ */
+void
+F2C(expcss,EXPCSS) (int *idexo,
+             void_int *side_set_ids,
+             void_int *num_elem_per_set,
+             void_int *num_dist_per_set,
+             void_int *side_sets_elem_index,
+             void_int *side_sets_dist_index,
+             void_int *side_sets_elem_list,
+             void_int *side_sets_side_list,
+             real * side_sets_dist_fact,
+             int *ierr)
+{
+  int num_side_sets, i;
+  void_int *elem_index_ptr, *dist_index_ptr;
+  int int_size;
+
+  *ierr = 0;
+
+  num_side_sets = ex_inquire_int(*idexo, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  int_size = sizeof(int);
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    int_size = sizeof(int64_t);
+  }
+
+  /* allocate memory for C element index array */
+  if (!(elem_index_ptr = malloc(num_side_sets * int_size))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+
+  /* allocate memory for C dist factor index array */
+  if (!(dist_index_ptr = malloc(num_side_sets * int_size))) {
+    free(elem_index_ptr);
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+
+  if (int_size == sizeof(int64_t)) {
+    for (i = 0; i < num_side_sets; i++) { /* change from 1-based to 0 index */
+      ((int64_t*)elem_index_ptr)[i] = ((int64_t*)side_sets_elem_index)[i] - 1;
+      ((int64_t*)dist_index_ptr)[i] = ((int64_t*)side_sets_dist_index)[i] - 1;
+    }
+  } else {
+    for (i = 0; i < num_side_sets; i++) { /* change from 1-based to 0 index */
+      ((int*)elem_index_ptr)[i] = ((int*)side_sets_elem_index)[i] - 1;
+      ((int*)dist_index_ptr)[i] = ((int*)side_sets_dist_index)[i] - 1;
+    }
+  }
+
+  *ierr = ex_put_concat_side_sets(*idexo, side_set_ids, num_elem_per_set,
+				  num_dist_per_set, elem_index_ptr,
+				  dist_index_ptr, side_sets_elem_list,
+				  side_sets_side_list, side_sets_dist_fact);
+  free(elem_index_ptr);
+  free(dist_index_ptr);
+}
+
+/*
+ * read concatenated side sets
+ */
+void
+F2C(exgcss,EXGCSS) (int *idexo,
+             void_int *side_set_ids,
+             void_int *num_elem_per_set,
+             void_int *num_dist_per_set,
+             void_int *side_sets_elem_index,
+             void_int *side_sets_dist_index,
+             void_int *side_sets_elem_list,
+             void_int *side_sets_side_list,
+             real * side_sets_dist_fact,
+             int *ierr)
+{
+  int i, num_side_sets;
+
+  *ierr = 0;
+
+  num_side_sets = ex_inquire_int(*idexo, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  *ierr = ex_get_concat_side_sets(*idexo, side_set_ids, num_elem_per_set,
+				  num_dist_per_set, side_sets_elem_index,
+				  side_sets_dist_index, side_sets_elem_list,
+				  side_sets_side_list, side_sets_dist_fact);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int64_t*)side_sets_elem_index)[i] += 1;
+      ((int64_t*)side_sets_dist_index)[i] += 1;
+    }
+  } else {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int*)side_sets_elem_index)[i] += 1;
+      ((int*)side_sets_dist_index)[i] += 1;
+    }
+  }
+}
+
+/*
+ * read concatenated side sets (no dist factors)
+ */
+void
+F2C(exgcssf,EXGCSSF) (int *idexo,
+              void_int *side_set_ids,
+              void_int *num_elem_per_set,
+              void_int *num_dist_per_set,
+              void_int *side_sets_elem_index,
+              void_int *side_sets_dist_index,
+              void_int *side_sets_elem_list,
+              void_int *side_sets_side_list,
+              int *ierr)
+{
+  int i, num_side_sets;
+
+  num_side_sets = ex_inquire_int(*idexo, EX_INQ_SIDE_SETS);
+  if (num_side_sets < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  *ierr = ex_get_concat_side_sets(*idexo, side_set_ids, num_elem_per_set,
+				  num_dist_per_set, side_sets_elem_index,
+				  side_sets_dist_index, side_sets_elem_list,
+				  side_sets_side_list, 0);
+
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int64_t*)side_sets_elem_index)[i] += 1;
+      ((int64_t*)side_sets_dist_index)[i] += 1;
+    }
+  } else {
+    for (i = 0; i < num_side_sets; i++) { /* change from 0-based to 1 index */
+      ((int*)side_sets_elem_index)[i] += 1;
+      ((int*)side_sets_dist_index)[i] += 1;
+    }
+  }
+}
+
+/*
+ * write results variables parameters
+ */
+void
+F2C(expvp,EXPVP) (int *idexo,
+            char *var_type,
+            int *num_vars,
+            int *ierr,
+            int var_typelen)
+{
+  *ierr = ex_put_var_param(*idexo, var_type, *num_vars);
+}
+
+/*
+ * read results variables parameters
+ */
+void
+F2C(exgvp,EXGVP) (int *idexo,
+            char *var_type,
+            int *num_vars,
+            int *ierr,
+            int var_typelen)
+{
+  *ierr = ex_get_var_param(*idexo, var_type, num_vars);
+}
+
+/*
+ * write results variables names
+ */
+void
+F2C(expvan,EXPVAN) (int *idexo,
+             char *var_type,
+             int *num_vars,
+             char *var_names,
+             int *ierr,
+             int var_typelen,
+             int var_nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (var_nameslen < slen) {
+    slen = var_nameslen;
+  }
+  /* allocate memory for pointer array */
+  if (!(aptr = malloc((*num_vars + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_vars * (slen + 1) * sizeof(char)))) {
+    free(aptr);                 /* Free up string ptr array */
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Copy Fortran variable names to staging space */
+  for (i = 0; i < *num_vars; i++) {
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+    ex_fstrncpy(*(aptr + i), var_names + i * var_nameslen, slen);       /* copy string into
+                                                                         * buffer */
+  }
+  *(aptr + i) = 0;              /* null out last ptr */
+  /* do ExodusII C call to write results variables names */
+  if (ex_put_var_names(*idexo, var_type, *num_vars, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+  }
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+/*
+ * read results variables names
+ */
+void
+F2C(exgvan,EXGVAN) (int *idexo,
+             char *var_type,
+             int *num_vars,
+             char *var_names,
+             int *ierr,
+             int var_typelen,
+             int var_nameslen)
+{
+  char          **aptr;         /* ptr to temp staging space for string array
+                                 * ptrs */
+  char           *sptr;         /* ptr to temp staging space for strings */
+  int             i, slen;
+
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (var_nameslen < slen) {
+    slen = var_nameslen;
+  }
+  /* allocate memory to for pointer array */
+  if (!(aptr = malloc((*num_vars + 1) * sizeof(char *)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* Allocate staging space for the variable names */
+  if (!(sptr = malloc(*num_vars * (slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    free(aptr);                 /* Free up string ptr array */
+    return;
+  }
+  for (i = 0; i < *num_vars; i++)
+    *(aptr + i) = sptr + i * (slen + 1);        /* put address into ptr array */
+  *(aptr + i) = 0;              /* null out last ptr */
+
+  /* do ExodusII C call to read results variables names */
+  if (ex_get_var_names(*idexo, var_type, *num_vars, aptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    free(aptr);
+    return;
+  }
+  /* Copy Fortran variable names to staging space */
+  memset(var_names, 0, *num_vars * var_nameslen);
+  for (i = 0; i < *num_vars; i++) {
+    ex_fcdcpy(var_names + i * var_nameslen, slen, *(aptr + i)); /* copy str into Fortran
+                                                                 * buffer */
+  }
+
+  free(sptr);                   /* Free up string staging area */
+  free(aptr);                   /* Free up string ptr array */
+}
+
+/*
+ * write element variable truth table
+ */
+void
+F2C(expvtt,EXPVTT) (int *idexo,
+             int *num_elem_blk,
+             int *num_elem_var,
+             int *elem_var_tab,
+             int *ierr)
+{
+  *ierr = ex_put_elem_var_tab(*idexo, *num_elem_blk, *num_elem_var, elem_var_tab);
+}
+
+/*
+ * write nodeset variable truth table
+ */
+void
+F2C(expnstt,EXPNSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_put_nset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * write sideset variable truth table
+ */
+void
+F2C(expsstt,EXPSSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_put_sset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * read element variable truth table
+ */
+void
+F2C(exgvtt,EXGVTT) (int *idexo,
+             int *num_elem_blk,
+             int *num_elem_var,
+             int *elem_var_tab,
+             int *ierr)
+{
+  *ierr = ex_get_elem_var_tab(*idexo, *num_elem_blk, *num_elem_var, elem_var_tab);
+}
+
+/*
+ * read nodeset variable truth table
+ */
+void
+F2C(exgnstt,EXGNSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_get_nset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * read sideset variable truth table
+ */
+void
+F2C(exgsstt,EXGSSTT) (int *idexo,
+              int *num_entity,
+              int *num_var,
+              int *var_tab,
+              int *ierr)
+{
+  *ierr = ex_get_sset_var_tab(*idexo, *num_entity, *num_var, var_tab);
+}
+
+/*
+ * write global variable values at time step
+ */
+void
+F2C(expgv,EXPGV) (int *idexo,
+            int *time_step,
+            int *num_glob_vars,
+            real * glob_var_vals,
+            int *ierr)
+{
+  *ierr = ex_put_glob_vars(*idexo, *time_step, *num_glob_vars, glob_var_vals);
+}
+
+/*
+ * read global variable values at a time step
+ */
+void
+F2C(exggv,EXGGV) (int *idexo,
+            int *time_step,
+            int *num_glob_vars,
+            real * glob_var_vals,
+            int *ierr)
+{
+  *ierr = ex_get_glob_vars(*idexo, *time_step, *num_glob_vars, glob_var_vals);
+}
+
+/*
+ * read global variable values through time
+ */
+void
+F2C(exggvt,EXGGVT) (int *idexo,
+             int *glob_var_index,
+             int *beg_time_step,
+             int *end_time_step,
+             real * glob_var_vals,
+             int *ierr)
+{
+  *ierr = ex_get_glob_var_time(*idexo, *glob_var_index, *beg_time_step, *end_time_step, glob_var_vals);
+}
+
+/*
+ * write nodal variable values at a time step
+ */
+void
+F2C(expnv,EXPNV) (int *idexo,
+            int *time_step,
+            int *nodal_var_index,
+            void_int *num_nodes,
+            real * nodal_var_vals,
+            int *ierr)
+{
+  int64_t nnodes;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    nnodes = *(int64_t*)num_nodes;
+  } else {
+    nnodes = *(int*)num_nodes;
+  }
+  
+  *ierr = ex_put_nodal_var(*idexo, *time_step, *nodal_var_index, nnodes, nodal_var_vals);
+}
+
+/*
+ * read nodal variable values at a time step
+ */
+void
+F2C(exgnv,EXGNV) (int *idexo,
+            int *time_step,
+            int *nodal_var_index,
+            void_int *num_nodes,
+            real * nodal_var_vals,
+            int *ierr)
+{
+  int64_t nnodes;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    nnodes = *(int64_t*)num_nodes;
+  } else {
+    nnodes = *(int*)num_nodes;
+  }
+  
+  *ierr = ex_get_nodal_var(*idexo, *time_step, *nodal_var_index, nnodes, nodal_var_vals);
+}
+
+/*
+ * read nodal variable values through time
+ */
+void
+F2C(exgnvt,EXGNVT) (int *idexo,
+             int *nodal_var_index,
+             void_int *node_number,
+             int *beg_time_step,
+             int *end_time_step,
+             real * nodal_var_vals,
+             int *ierr)
+{
+  int64_t nnode;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    nnode = *(int64_t*)node_number;
+  } else {
+    nnode = *(int*)node_number;
+  }
+  
+  *ierr = ex_get_nodal_var_time(*idexo, *nodal_var_index, nnode, *beg_time_step, *end_time_step, nodal_var_vals);
+}
+
+/*
+ * write element variable values at a time step
+ */
+void
+F2C(expev,EXPEV) (int *idexo,
+            int *time_step,
+            int *elem_var_index,
+            entity_id *elem_blk_id,
+            void_int *num_elem_this_blk,
+            real * elem_var_vals,
+            int *ierr)
+{
+  int64_t neblk;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    neblk = *(int64_t*)num_elem_this_blk;
+  } else {
+    neblk = *(int*)num_elem_this_blk;
+  }
+  
+  *ierr = ex_put_elem_var(*idexo, *time_step, *elem_var_index, *elem_blk_id, neblk, elem_var_vals);
+}
+
+/*
+ * read element variable values at a time step
+ */
+void
+F2C(exgev,EXGEV) (int *idexo,
+            int *time_step,
+            int *elem_var_index,
+            entity_id *elem_blk_id,
+            void_int *num_elem_this_blk,
+            real * elem_var_vals,
+            int *ierr)
+{
+  int64_t neblk;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    neblk = *(int64_t*)num_elem_this_blk;
+  } else {
+    neblk = *(int*)num_elem_this_blk;
+  }
+  
+  *ierr = ex_get_elem_var(*idexo, *time_step, *elem_var_index, *elem_blk_id, neblk, elem_var_vals);
+}
+
+/*
+ * read element variable values through time
+ */
+void
+F2C(exgevt,EXGEVT) (int *idexo,
+             int *elem_var_index,
+             void_int *elem_number,
+             int *beg_time_step,
+             int *end_time_step,
+             real * elem_var_vals,
+             int *ierr)
+{
+  int64_t el_num;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    el_num = *(int64_t*)elem_number;
+  } else {
+    el_num = *(int*)elem_number;
+  }
+  
+  *ierr = ex_get_elem_var_time(*idexo, *elem_var_index, el_num, *beg_time_step, *end_time_step, elem_var_vals);
+}
+
+/*
+ * write nodeset variable values at a time step
+ */
+void
+F2C(expnsv,EXPNSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_put_nset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * read nodeset variable values at a time step
+ */
+void
+F2C(exgnsv,EXGNSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_get_nset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * write sideset variable values at a time step
+ */
+void
+F2C(expssv,EXPSSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_put_sset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * read sideset variable values at a time step
+ */
+void
+F2C(exgssv,EXGSSV) (int *idexo,
+             int *time_step,
+             int *var_index,
+             entity_id *id,
+             void_int *num_entity,
+             real * var_vals,
+             int *ierr)
+{
+  int64_t n_entity;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    n_entity = *(int64_t*)num_entity;
+  } else {
+    n_entity = *(int*)num_entity;
+  }
+  
+  *ierr = ex_get_sset_var(*idexo, *time_step, *var_index, *id, n_entity, var_vals);
+}
+
+/*
+ * write time value for a time step
+ */
+void
+F2C(exptim,EXPTIM) (int *idexo,
+             int *time_step,
+             real * time_value,
+             int *ierr)
+{
+  *ierr = ex_put_time(*idexo, *time_step, time_value);
+}
+
+/*
+ * read time value for a time step
+ */
+void
+F2C(exgtim,EXGTIM) (int *idexo,
+             int *time_step,
+             real * time_value,
+             int *ierr)
+{
+  *ierr = ex_get_time(*idexo, *time_step, time_value);
+}
+
+/*
+ * read all time values
+ */
+void
+F2C(exgatm,EXGATM) (int *idexo,
+             real * time_values,
+             int *ierr)
+{
+  *ierr = ex_get_all_times(*idexo, time_values);
+}
+
+/*
+ * inquire EXODUS parameters
+ */
+void
+F2C(exinq,EXINQ) (int *idexo,
+            int *req_info,
+            void_int *ret_int,
+            float *ret_float,
+            char *ret_char,
+            int *ierr,
+            int ret_charlen)
+{
+  *ierr = ex_inquire(*idexo, (ex_inquiry) * req_info, ret_int, ret_float, ret_char);
+}
+
+/*
+ * inquire integer EXODUS parameters
+ */
+int64_t
+F2C(exinqi,EXINQI) (int *idexo,
+            int *req_info)
+{
+  return ex_inquire_int(*idexo, (ex_inquiry) *req_info);
+}
+
+/*
+ * convert side set node lists to side set side lists
+ */
+void
+F2C(excn2s,EXCN2S) (int *idexo,
+             void_int *num_elem_per_set,
+             void_int *num_nodes_per_set,
+             void_int *side_sets_elem_index,
+             void_int *side_sets_node_index,
+             void_int *side_sets_elem_list,
+             void_int *side_sets_node_list,
+             void_int *side_sets_side_list,
+             int *ierr)
+{
+  *ierr = ex_cvt_nodes_to_sides(*idexo,
+				num_elem_per_set,
+				num_nodes_per_set,
+				NULL, /* unused */
+				NULL, /* unused */
+				side_sets_elem_list,
+				side_sets_node_list,
+				side_sets_side_list);
+}
+
+/*
+ * read side set node list
+ */
+void
+F2C(exgssn,EXGSSN) (int *idexo,
+             entity_id *side_set_id,
+             int *side_set_node_cnt_list,
+             void_int *side_set_node_list,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_node_list(*idexo, *side_set_id, side_set_node_cnt_list, side_set_node_list);
+}
+
+/*
+ * read side set node count
+ */
+void
+F2C(exgssc,EXGSSC) (int *idexo,
+             entity_id *side_set_id,
+             int *side_set_node_cnt_list,
+             int *ierr)
+{
+  *ierr = ex_get_side_set_node_count(*idexo, *side_set_id, side_set_node_cnt_list);
+}
+
+/*
+ * read concatenated side set node count
+ */
+void
+F2C(exgcssc,EXGCSSC) (int *idexo,
+              int *side_set_node_cnt_list,
+              int *ierr)
+{
+  *ierr = ex_get_concat_side_set_node_count(*idexo, side_set_node_cnt_list);
+}
+
+/* ex_get_coordinate_frames -- read coordinate frames */
+void
+F2C(exgfrm,EXGFRM) (int *idexo,
+             int *nframeo,
+             void_int *cfids,
+             real * coord,
+             int *tags,
+             int *ierr)
+{
+  int             i;
+  char           *ctags = NULL;
+
+  /* Determine number of coordinate frames stored in file */
+  int             nframe = ex_inquire_int(*idexo, EX_INQ_COORD_FRAMES);
+  if (nframe < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (nframe != *nframeo) {
+    *ierr = EX_FATAL;
+    return;
+  }
+  /* Create array of characters to store tags... */
+  if (nframe > 0) {
+    if (!(ctags = calloc(nframe, sizeof(char)))) {
+      *ierr = EX_MEMFAIL;
+      return;
+    }
+    *ierr = 0;
+
+    if (ex_get_coordinate_frames(*idexo, &nframe, cfids, coord, ctags) == EX_FATAL) {
+      *ierr = EX_FATAL;
+      return;
+    }
+    /* Convert character tags back to integer tags for fortran */
+    for (i = 0; i < nframe; i++) {
+      if (ctags[i] == 'R' || ctags[i] == 'r')
+        tags[i] = EX_CF_RECTANGULAR;
+      else if (ctags[i] == 'C' || ctags[i] == 'c')
+        tags[i] = EX_CF_CYLINDRICAL;
+      else if (ctags[i] == 'S' || ctags[i] == 's')
+        tags[i] = EX_CF_SPHERICAL;
+    }
+    free(ctags);
+  }
+}
+
+/* ex_put_coordinate_frames -- define/write coordinate frames */
+void
+F2C(expfrm,EXPFRM) (int *idexo,
+             int *nframe,
+             void_int *cfids,
+             real * coord,
+             int *tags,
+             int *ierr)
+{
+  int             i;
+  char           *ctags = NULL;
+
+  /* Create array of characters to store tags... */
+  if (*nframe > 0) {
+    if (!(ctags = calloc(*nframe, sizeof(char)))) {
+      *ierr = EX_MEMFAIL;
+      return;
+    }
+    /* Convert fortran integer tags to C API character tags */
+    for (i = 0; i < *nframe; i++) {
+      if (tags[i] == EX_CF_RECTANGULAR)
+        ctags[i] = 'R';
+      else if (tags[i] == EX_CF_CYLINDRICAL)
+        ctags[i] = 'C';
+      else if (tags[i] == EX_CF_SPHERICAL)
+        ctags[i] = 'S';
+    }
+
+    *ierr = 0;
+
+    if (ex_put_coordinate_frames(*idexo, *nframe, cfids, coord, ctags) == EX_FATAL) {
+      *ierr = EX_FATAL;
+    }
+    free(ctags);
+  }
+}
+
+
+/* Routine to return floating point word size */
+int
+F2C(excpws,EXCPWS) ()
+{
+  return (ex_get_cpu_ws());
+}
+
+/* Routine to return large model setting */
+int
+F2C(exlgmd,EXLGMD) (int *idexo)
+{
+  return (ex_large_model(*idexo));
+}
+
+
+/* Generalized error handling function */
+void
+F2C(exerr,EXERR) (char *pname,
+            char *err_string,
+            int *errcode,
+            int pnamelen,
+            int err_stringlen)
+{
+
+  char           *proc_name, *error_string;
+  if (!(proc_name = malloc((pnamelen + 1) * sizeof(char)))) {
+    ex_err("exerr", "Error: failed to allocate space for process name buffer",
+           EX_MEMFAIL);
+    *errcode = EX_MEMFAIL;
+    return;
+  }
+  if (!(error_string = malloc((err_stringlen + 1) * sizeof(char)))) {
+    free(proc_name);
+    ex_err("exerr", "Error: failed to allocate space for error msg buffer",
+           EX_MEMFAIL);
+    *errcode = EX_MEMFAIL;
+    return;
+  }
+  ex_fstrncpy(proc_name, pname, pnamelen);
+  ex_fstrncpy(error_string, err_string, err_stringlen);
+  ex_err(proc_name, error_string, *errcode);
+  free(proc_name);
+  free(error_string);
+}
+
+/* Error message reporting options setting function */
+void
+F2C(exopts,EXOPTS) (int *option_val,
+             int *ierr)
+{
+  *ierr = 0;
+  ex_opts((ex_options) * option_val);
+  if (exerrval != 0) {
+    *ierr = EX_FATAL;
+  }
+}
+
+void
+F2C(exmxnm,EXMXNM) (int *idexo,
+             int *length,
+             int *ierr)
+{
+  *ierr = ex_set_max_name_length(*idexo, *length);
+}
+
+/*
+ * copy EXODUS file
+ */
+void
+F2C(excopy,EXCOPY) (int *idexo_in,
+             int *idexo_out,
+             int *ierr)
+{
+  *ierr = ex_copy(*idexo_in, *idexo_out);
+}
+
+/*
+ * get element map
+ */
+void
+
+F2C(exgem,EXGEM) (int *idexo,
+            entity_id *map_id,
+            void_int *elem_map,
+            int *ierr)
+{
+  *ierr = ex_get_num_map(*idexo, EX_ELEM_MAP, *map_id, elem_map);
+}
+
+/*
+ * get partial_element map
+ */
+void
+F2C(exgpem,EXGPEM) (int *idexo,
+             entity_id *map_id,
+             void_int *start,
+             void_int *count,
+             void_int *elem_map,
+             int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+  
+  *ierr = ex_get_partial_num_map(*idexo, EX_ELEM_MAP, *map_id, st, cnt, elem_map);
+}
+
+/*
+ * get element number map
+ */
+void
+F2C(exgenm,EXGENM) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_get_id_map(*idexo, EX_ELEM_MAP, elem_map);
+}
+
+/*
+ * get map parameters
+ */
+void
+F2C(exgmp,EXGMP) (int *idexo,
+            int *num_node_maps,
+            int *num_elem_maps,
+            int *ierr)
+{
+  *ierr = ex_get_map_param(*idexo, num_node_maps, num_elem_maps);
+}
+
+/*
+ * get node map
+ */
+void
+F2C(exgnm,EXGNM) (int *idexo,
+            entity_id *map_id,
+            void_int *node_map,
+            int *ierr)
+{
+  *ierr = ex_get_num_map(*idexo, EX_NODE_MAP, *map_id, node_map);
+}
+
+/*
+ * get node number map
+ */
+void
+F2C(exgnnm,EXGNNM) (int *idexo,
+             void_int *node_map,
+             int *ierr)
+{
+  *ierr = ex_get_id_map(*idexo, EX_NODE_MAP, node_map);
+}
+
+/*
+ * read results variables names
+ */
+void
+F2C(exgvnm,EXGVNM) (int *idexo,
+             char *var_type,
+             int *var_index,
+             char *var_name,
+             int *ierr,
+             int var_typelen,
+             int var_namelen)
+{
+  char           *sptr;         /* ptr to temp staging space for string */
+  int             slen;
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_MAX_READ_NAME_LENGTH); /* max string size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (var_namelen < slen) {
+    slen = var_namelen;
+  }
+  /* Allocate staging space for the variable name */
+  if (!(sptr = malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  /* do ExodusII C call to read results variables names */
+  if (ex_get_var_name(*idexo, var_type, *var_index, sptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    return;
+  }
+  /* Copy Fortran variable names to staging space */
+  /** printf("[exgvnm] var_name(%d): %s\n",*var_index,sptr)); **/
+  memset(var_name, 0, var_namelen);
+  ex_fcdcpy(var_name, slen, sptr);      /* copy string into Fortran buffer */
+
+  free(sptr);                   /* Free up string staging area */
+}
+
+/*
+ * put element map
+ */
+void
+F2C(expem,EXPEM) (int *idexo,
+            entity_id *map_id,
+            void_int *elem_map,
+            int *ierr)
+{
+  *ierr = ex_put_num_map(*idexo, EX_ELEM_MAP, *map_id, elem_map);
+}
+
+/*
+ * put partial element map
+ */
+void
+F2C(exppem,EXPPEM) (int *idexo,
+             entity_id *map_id,
+             void_int *start,
+             void_int *count,
+             void_int *elem_map,
+             int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idexo) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+  *ierr = ex_put_partial_num_map(*idexo, EX_ELEM_MAP, *map_id, st, cnt, elem_map);
+}
+
+/*
+ * put element number map
+ */
+void
+F2C(expenm,EXPENM) (int *idexo,
+             void_int *elem_map,
+             int *ierr)
+{
+  *ierr = ex_put_id_map(*idexo, EX_ELEM_MAP, elem_map);
+}
+
+/*
+ * put map parameters
+ */
+void
+F2C(expmp,EXPMP) (int *idexo,
+            int *num_node_maps,
+            int *num_elem_maps,
+            int *ierr)
+{
+  *ierr = ex_put_map_param(*idexo, *num_node_maps, *num_elem_maps);
+}
+
+/*
+ * put node map
+ */
+void
+F2C(expnm,EXPNM) (int *idexo,
+            entity_id *map_id,
+            void_int *node_map,
+            int *ierr)
+{
+  *ierr = ex_put_num_map(*idexo, EX_NODE_MAP, *map_id, node_map);
+}
+
+/*
+ * put node number map
+ */
+void
+F2C(expnnm,EXPNNM) (int *idexo,
+             void_int *node_map,
+             int *ierr)
+{
+  *ierr = ex_put_id_map(*idexo, EX_NODE_MAP, node_map);
+}
+
+/*
+ * write results variable name
+ */
+void
+F2C(expvnm,EXPVNM) (int *idexo,
+             char *var_type,
+             int *var_index,
+             char *var_name,
+             int *ierr,
+             int var_typelen,
+             int var_namelen)
+{
+  char           *sptr;         /* ptr to temp staging space for string */
+  int             slen;
+  *ierr = 0;                    /* default no errror */
+
+  slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);     /* max str size */
+  if (slen < 0) {
+    *ierr = EX_FATAL;
+    return;
+  }
+
+  if (var_namelen < slen) {
+    slen = var_namelen;
+  }
+  /* Allocate staging space for the variable name */
+  if (!(sptr = (char *) malloc((slen + 1) * sizeof(char)))) {
+    *ierr = EX_MEMFAIL;
+    return;
+  }
+  ex_fstrncpy(sptr, var_name, slen);    /* copy string into buffer */
+
+
+  /* do ExodusII C call to write results variable name */
+  if (ex_put_var_name(*idexo, var_type, *var_index, sptr) == EX_FATAL) {
+    *ierr = EX_FATAL;
+    free(sptr);                 /* free up allocated space */
+    return;
+  }
+  free(sptr);                   /* Free up string staging area */
+}
+
+/*
+ *  Get initial information from nemesis file
+ */
+void
+F2C(exgii,EXGII)(int	*idne,	
+	   int	*nproc,
+	   int	*nproc_in_f,
+	   char	*ftype,
+	   int  *ierr, 
+	   size_t ftypelen)
+{
+  size_t slen = 1;
+  char *file_type;
+
+  /* WARNING: ftypelen SHOULD be 1, but may not be depending on how
+              the Fortran programmer passed it. It is best at
+              this time to hard code it per NEPII spec. */
+  if (ftypelen != 1) {
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,"Warning: file type string length is %d in file id %d\n",
+            ftypelen, *idne);
+    ex_err("negii",errmsg,EX_MSG);
+#endif
+    slen = ftypelen;
+  }
+
+  file_type = (char *) malloc((slen+1)*sizeof(char));
+
+  if ((*ierr = ex_get_init_info(*idne, nproc, nproc_in_f, file_type)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to get initial information from file id %d",
+	    *idne);
+    ex_err("negii",errmsg,EX_MSG);
+  }
+
+  if (*ierr == 0)
+    ex_fcdcpy (ftype, slen, file_type);
+
+  free(file_type);
+}
+
+/*
+ *  Write initial information from nemesis file
+ */
+void
+F2C(expii,EXPII)(int	*idne,
+	   int	*nproc,
+	   int	*nproc_in_f,
+	   char	*ftype,
+	   int  *ierr,
+	   size_t ftypelen)
+{
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  size_t slen = 1;
+  char *file_type;
+
+  /* WARNING: ftypelen SHOULD be 1, but may not be depending on how
+              the Fortran programmer passed it. It is best at
+              this time to hard code it per NEPII spec. */
+  if (ftypelen != 1) {
+    slen = ftypelen;
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    sprintf(errmsg,"Warning: file type string length is %d in file id %d\n",
+            ftypelen, *idne);
+    ex_err("nepii",errmsg,EX_MSG);
+#endif
+  }
+
+  file_type = (char *) malloc((slen+1)*sizeof(char));
+
+  ex_fstrncpy (file_type, ftype, slen);
+
+  if ((*ierr = ex_put_init_info(*idne, *nproc, *nproc_in_f, file_type)) != 0)
+  {
+    sprintf(errmsg,
+	    "Error: failed to put initial information in file id %d",
+	    *idne);
+    ex_err("nepii",errmsg,EX_MSG);
+  }
+
+  free(file_type);
+}
+
+/*
+ * Read initial global information
+ */
+void
+F2C(exgig,EXGIG)(int	*idne,
+	   void_int	*nnodes_g,
+	   void_int	*nelems_g,
+	   void_int	*nelem_blks_g,
+	   void_int	*nnode_sets_g,
+	   void_int	*nside_sets_g,
+	   int	*ierr)
+{
+  if ((*ierr = ex_get_init_global(*idne, nnodes_g, nelems_g, nelem_blks_g,
+                                  nnode_sets_g, nside_sets_g)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read initial global information from file id %d",
+	    *idne);
+    ex_err("negig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write initial global information
+ */
+void
+F2C(expig,EXPIG)(int	*idne,
+	   void_int	*nnodes_g,
+	   void_int	*nelems_g,
+	   void_int	*nelem_blks_g,
+	   void_int	*nnode_sets_g,
+	   void_int	*nside_sets_g,
+	   int	*ierr)
+{
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    int64_t *n_nnodes_g = (int64_t*)nnodes_g;
+    int64_t *n_nelems_g = (int64_t*)nelems_g;
+    int64_t *n_nelem_blks_g = (int64_t*)nelem_blks_g;
+    int64_t *n_nnode_sets_g = (int64_t*)nnode_sets_g;
+    int64_t *n_nside_sets_g = (int64_t*)nside_sets_g;
+    *ierr =  ex_put_init_global(*idne, *n_nnodes_g, *n_nelems_g, *n_nelem_blks_g,
+				*n_nnode_sets_g, *n_nside_sets_g);
+  } else {
+    int *n_nnodes_g = (int*)nnodes_g;
+    int *n_nelems_g = (int*)nelems_g;
+    int *n_nelem_blks_g = (int*)nelem_blks_g;
+    int *n_nnode_sets_g = (int*)nnode_sets_g;
+    int *n_nside_sets_g = (int*)nside_sets_g;
+    *ierr =  ex_put_init_global(*idne, *n_nnodes_g, *n_nelems_g, *n_nelem_blks_g,
+				*n_nnode_sets_g, *n_nside_sets_g);
+  }
+
+  if (*ierr != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store initial global information in file id %d",
+	    *idne);
+    ex_err("nepig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read load balance parameters
+ */
+void
+F2C(exglbp,EXGLBP)(int	*idne,
+	    void_int	*nint_nodes,
+	    void_int	*nbor_nodes,
+	    void_int	*next_nodes,
+	    void_int	*nint_elems,
+	    void_int	*nbor_elems,
+	    void_int	*nnode_cmaps,
+	    void_int	*nelem_cmaps,
+	    int	*processor,
+	    int	*ierr)
+{
+  if ((*ierr = ex_get_loadbal_param(*idne, nint_nodes, nbor_nodes,
+                                    next_nodes, nint_elems, nbor_elems,
+                                    nnode_cmaps, nelem_cmaps, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read load balance parameters from file id %d",
+	    *idne);
+    ex_err("neglbp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write load balance parameters
+ */
+void
+F2C(explbp,EXPLBP)(int	*idne,
+	    void_int	*nint_nodes,
+	    void_int	*nbor_nodes,
+	    void_int	*next_nodes,
+	    void_int	*nint_elems,
+	    void_int	*nbor_elems,
+	    void_int	*nnode_cmaps,
+	    void_int	*nelem_cmaps,
+	    int	*processor,
+	    int	*ierr)	
+{
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    int64_t *n_nint_nodes = (int64_t*)nint_nodes;
+    int64_t *n_nbor_nodes = (int64_t*)nbor_nodes;
+    int64_t *n_next_nodes = (int64_t*)next_nodes;
+    int64_t *n_nint_elems = (int64_t*)nint_elems;
+    int64_t *n_nbor_elems = (int64_t*)nbor_elems;
+    int64_t *n_nnode_cmaps = (int64_t*)nnode_cmaps;
+    int64_t *n_nelem_cmaps = (int64_t*)nelem_cmaps;
+    *ierr = ex_put_loadbal_param(*idne, *n_nint_nodes, *n_nbor_nodes,
+				 *n_next_nodes, *n_nint_elems, *n_nbor_elems,
+				 *n_nnode_cmaps, *n_nelem_cmaps,
+				 *processor);
+  } else {
+    int *n_nint_nodes = (int*)nint_nodes;
+    int *n_nbor_nodes = (int*)nbor_nodes;
+    int *n_next_nodes = (int*)next_nodes;
+    int *n_nint_elems = (int*)nint_elems;
+    int *n_nbor_elems = (int*)nbor_elems;
+    int *n_nnode_cmaps = (int*)nnode_cmaps;
+    int *n_nelem_cmaps = (int*)nelem_cmaps;
+    *ierr = ex_put_loadbal_param(*idne, *n_nint_nodes, *n_nbor_nodes,
+				 *n_next_nodes, *n_nint_elems, *n_nbor_elems,
+				 *n_nnode_cmaps, *n_nelem_cmaps,
+				 *processor);
+  }
+  if (*ierr != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store load balance parameters in file id %d",
+	    *idne);
+    ex_err("neplbp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write concatenated load balance parameters
+ */
+void
+F2C(explbpc,EXPLBPC)(int *idne,
+	     void_int *nint_nodes,	
+	     void_int *nbor_nodes,	
+	     void_int *next_nodes,	
+	     void_int *nint_elems,	
+	     void_int *nbor_elems,	
+	     void_int *nnode_cmaps,	
+	     void_int *nelem_cmaps,	
+	     int *ierr)	
+{
+  if ((*ierr = ex_put_loadbal_param_cc(*idne, nint_nodes, nbor_nodes,
+                                       next_nodes, nint_elems, nbor_elems,
+                                       nnode_cmaps, nelem_cmaps)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store load balance parameters in file id %d",
+	    *idne);
+    ex_err("neplbpc",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global node set parameters
+ */
+void
+F2C(exgnspg,EXGNSPG)(int *idne,
+	     void_int *ns_ids_glob,
+	     void_int *ns_n_cnt_glob,
+	     void_int *ns_df_cnt_glob,
+	     int *ierr)
+{
+  if ((*ierr = ex_get_ns_param_global(*idne, ns_ids_glob, ns_n_cnt_glob, ns_df_cnt_glob)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global node set parameters from file id %d",
+	    *idne);
+    ex_err("negnspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global node set parameters
+ */
+void
+F2C(expnspg,EXPNSPG)(int *idne,
+	     void_int *global_ids,
+	     void_int *global_n_cnts,
+	     void_int *global_df_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_ns_param_global(*idne, global_ids, global_n_cnts, global_df_cnts)) != 0)
+  {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global node set parameters in file id %d",
+	    *idne);
+    ex_err("nepnspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global side set parameters
+ */
+void
+F2C(exgsspg,EXGSSPG)(int *idne,
+	     void_int *ss_ids_glob,
+	     void_int *ss_n_cnt_glob,
+	     void_int *ss_df_cnt_glob,
+	     int *ierr)
+{
+
+  if ((*ierr = ex_get_ss_param_global(*idne, ss_ids_glob, ss_n_cnt_glob, ss_df_cnt_glob)) != 0)
+  {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global side set parameters from file id %d",
+	    *idne);
+    ex_err("negsspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global side set parameters
+ */
+void
+F2C(expsspg,EXPSSPG)(int *idne,
+	     void_int *global_ids,
+	     void_int *global_el_cnts,
+	     void_int *global_df_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_ss_param_global(*idne, global_ids, global_el_cnts, global_df_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global side set parameters in file id %d",
+	    *idne);
+    ex_err("nepsspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global element block information
+ */
+void
+F2C(exgebig,EXGEBIG)(int *idne,
+	     void_int *el_blk_ids,
+	     void_int *el_blk_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_get_eb_info_global(*idne, el_blk_ids, el_blk_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global element block info from file id %d",
+	    *idne);
+    ex_err("negebig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global element block information
+ */
+void
+F2C(expebig,EXPEBIG)(int *idne,
+	     void_int *el_blk_ids,
+	     void_int *el_blk_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_eb_info_global(*idne, el_blk_ids, el_blk_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global element block info in file id %d",
+	    *idne);
+    ex_err("nepebig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read side set element list and side set side list
+ */
+void
+F2C(exgnss,EXGNSS)(int *idne,
+	    entity_id *ss_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ss_elem_list,
+	    void_int *ss_side_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_side_set(*idne, *ss_id, st, cnt, ss_elem_list, ss_side_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read side set element list from file id %d",
+	    *idne);
+    ex_err("negnss",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write side set element list and side set side list
+ */
+void
+F2C(expnss,EXPNSS)(int *idne,
+	    entity_id *ss_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ss_elem_list,
+	    void_int *ss_side_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_side_set(*idne, *ss_id, st, cnt, ss_elem_list, ss_side_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write side set element list to file id %d",
+	    *idne);
+    ex_err("nepnss",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read side set distribution factor
+ */
+void
+F2C(exgnssd,EXGNSSD)(int *idne,
+	     entity_id *ss_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ss_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_side_set_df(*idne, *ss_id, st, cnt, ss_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read side set dist factor from file id %d",
+	    *idne);
+    ex_err("negnssd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write side set distribution factor
+ */
+void
+F2C(expnssd,EXPNSSD)(int *idne,
+	     entity_id *ss_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ss_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_side_set_df(*idne, *ss_id, st, cnt, ss_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write side set dist factor to file id %d",
+	    *idne);
+    ex_err("nepnssd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read node set list for a single node set
+ */
+void
+F2C(exgnns,EXGNNS)(int *idne,
+	    entity_id *ns_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ns_node_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_node_set(*idne, *ns_id, st, cnt,ns_node_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node set node list from file id %d",
+	    *idne);
+    ex_err("negnns",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write node set list for a single node set
+ */
+void
+F2C(expnns,EXPNNS)(int *idne,
+	    entity_id *ns_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ns_node_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_node_set(*idne, *ns_id, st, cnt, ns_node_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node set node list to file id %d",
+	    *idne);
+    ex_err("nepnns",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read node set distribution factor
+ */
+void
+F2C(exgnnsd,EXGNNSD)(int *idne,
+	     entity_id *ns_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ns_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_node_set_df(*idne, *ns_id, st, cnt, ns_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node set dist factor from file id %d",
+	    *idne);
+    ex_err("negnnsd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write node set distribution factor
+ */
+void
+F2C(expnnsd,EXPNNSD)(int *idne,
+	     entity_id *ns_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ns_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_node_set_df(*idne, *ns_id, st, cnt, ns_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node set dist factor to file id %d",
+	    *idne);
+    ex_err("nepnnsd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read coordinates of the nodes
+ */
+void
+F2C(exgncor,EXGNCOR)(int *idne,
+	     void_int *start,
+	     void_int *count,
+	     real *x_coor,
+	     real *y_coor,
+	     real *z_coor,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_coord(*idne, st, cnt, x_coor, y_coor, z_coor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node coordinates from file id %d",
+	    *idne);
+    ex_err("negcor",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write coordinates of the nodes
+ */
+void
+F2C(expncor,EXPNCOR)(int *idne,
+	     void_int *start,
+	     void_int *count,
+	     real *x_coor,
+	     real *y_coor,
+	     real *z_coor,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_coord(*idne, st, cnt, x_coor, y_coor, z_coor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node coordinates to file id %d",
+	    *idne);
+    ex_err("nepcor",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read an element block's connectivity list
+ */
+void
+F2C(exgnec,EXGNEC)(int *idne,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *connect,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_elem_conn(*idne, *elem_blk_id, st, cnt, connect)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block connectivity from file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write an element block's connectivity list
+ */
+void
+F2C(expnec,EXPNEC)(int *idne,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *connect,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_elem_conn(*idne, *elem_blk_id, st, cnt, connect)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element block connectivity to file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read an element block's attributes
+ */
+void
+F2C(exgneat,EXGNEAT)(int *idne,
+	     entity_id *elem_blk_id,
+	     void_int *start,
+	     void_int *count,
+	     real *attrib,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_elem_attr(*idne, *elem_blk_id, st, cnt, attrib)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block attribute from file id %d",
+	    *idne);
+    ex_err("negneat",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write an element block's attributes
+ */
+void
+F2C(expneat,EXPNEAT)(int *idne,
+	     entity_id *elem_blk_id,
+	     void_int *start,
+	     void_int *count,
+	     real *attrib,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_elem_attr(*idne, *elem_blk_id, st, cnt, attrib)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element block attribute to file id %d",
+	    *idne);
+    ex_err("nepneat",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element type for a specific element block
+ */
+void
+F2C(exgelt,EXGELT)(int *idne,
+	    entity_id *elem_blk_id,
+	    char *elem_type,
+	    int *ierr,
+	    size_t elem_typelen)
+{
+  size_t slen = MAX_STR_LENGTH;
+  char *etype;
+
+  /* WARNING: ftypelen SHOULD be MAX_STR_LENGTH, but may not be depending
+              on how the Fortran programmer passed it. It is best at
+              this time to hard code it per NEMESIS spec. */
+  if (elem_typelen != MAX_STR_LENGTH) {
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,"Warning: element type string length is %d in file id %d\n",
+            elem_typelen, *idne);
+    ex_err("negelt",errmsg,EX_MSG);
+#endif
+    slen = elem_typelen;
+  }
+
+  etype = (char *) malloc((slen+1)*sizeof(char));
+
+  if ((*ierr = ex_get_elem_type(*idne, *elem_blk_id, etype)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block type from file id %d",
+	    *idne);
+    ex_err("negelt",errmsg,EX_MSG);
+  }
+
+  if (*ierr == 0)
+    ex_fcdcpy (elem_type, slen, etype);
+
+  free(etype);
+}
+
+/*
+ * Read a variable for an element block
+ */
+void
+F2C(exgnev,EXGNEV)(int *idne,
+	    int *time_step,
+	    int *elem_var_index,
+	    entity_id *elem_blk_id,
+	    void_int *num_elem_this_blk,
+	    void_int *start,
+	    void_int *count,
+	    real *elem_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_var(*idne, *time_step, EX_ELEM_BLOCK, *elem_var_index,
+			    *elem_blk_id, st, cnt, elem_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block variable from file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write a variable slab for an element block
+ */
+void
+F2C(expevs,EXPEVS)(int *idne,
+	    int *time_step,
+	    int *elem_var_index,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    real *elem_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_elem_var_slab(*idne, *time_step, *elem_var_index,
+                                    *elem_blk_id, st, cnt, elem_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write elem block variable slab to file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the values of a single nodal variable for a single time step
+ */
+void
+F2C(exgnnv,EXGNNV)(int *idne,
+	    int *time_step,
+	    int *nodal_var_index,
+	    void_int *start,
+	    void_int *count,
+	    real *nodal_vars,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_var(*idne, *time_step, EX_NODAL, *nodal_var_index,
+			    1, st, cnt, nodal_vars)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read nodal variable from file id %d",
+	    *idne);
+    ex_err("negnnv",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write nodal variable slab
+ */
+void
+F2C(expnvs,EXPNVS)(int *idne,
+	    int *time_step,
+	    int *nodal_var_index,
+	    void_int *start,
+	    void_int *count,
+	    real *nodal_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_nodal_var_slab(*idne, *time_step, *nodal_var_index,
+                                     st, cnt, nodal_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write nodal variable slab to file id %d",
+	    *idne);
+    ex_err("nepnvs",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element numbering map
+ */
+void
+F2C(exgnenm,EXGNENM)(int *idne,
+	     void_int *starte,
+	     void_int *num_ent,
+	     void_int *elem_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)starte;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)starte;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_get_n_elem_num_map(*idne, st, cnt, elem_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element numbering map from file id %d",
+	    *idne);
+    ex_err("negnenm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the element numbering map
+ */
+void
+F2C(expnenm,EXPNENM)(int *idne,
+	     void_int *starte,
+	     void_int *num_ent,
+	     void_int *elem_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)starte;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)starte;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_put_partial_id_map(*idne, EX_ELEM_MAP, st, cnt, elem_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element numbering map to file id %d",
+	    *idne);
+    ex_err("nepnenm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the node numbering map
+ */
+void
+F2C(exgnnnm,EXGNNNM)(int *idne,
+	     void_int *startn,
+	     void_int *num_ent,
+	     void_int *node_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)startn;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)startn;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_get_n_node_num_map(*idne, st, cnt, node_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node numbering map from file id %d",
+	    *idne);
+    ex_err("negnnnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the node numbering map
+ */
+void
+F2C(expnnnm,EXPNNNM)(int *idne,
+	     void_int *startn,
+	     void_int *num_ent,
+	     void_int *node_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)startn;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)startn;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_put_partial_id_map(*idne, EX_NODE_MAP, st, cnt, node_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node numbering map to file id %d",
+	    *idne);
+    ex_err("nepnnnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the node map for a processor
+ */
+void
+F2C(exgnmp,EXGNMP)(int *idne,
+	   void_int *node_mapi,
+	   void_int *node_mapb,
+	   void_int *node_mape,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_get_processor_node_maps(*idne, node_mapi, node_mapb, node_mape, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read processor node map from file id %d",
+	    *idne);
+    ex_err("negnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write a node map for a processor
+ */
+void
+F2C(expnmp,EXPNMP)(int *idne,
+	   void_int *node_mapi,
+	   void_int *node_mapb,
+	   void_int *node_mape,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_put_processor_node_maps(*idne, node_mapi, node_mapb, node_mape, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write processor node map to file id %d",
+	    *idne);
+    ex_err("nepnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element map for a processor
+ */
+void
+F2C(exgemp,EXGEMP)(int *idne,
+	   void_int *elem_mapi,
+	   void_int *elem_mapb,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_get_processor_elem_maps(*idne, elem_mapi, elem_mapb, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read processor element map from file id %d",
+	    *idne);
+    ex_err("negem",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the element map for a processor
+ */
+void
+F2C(expemp,EXPEMP)(int *idne,
+	   void_int *elem_mapi,
+	   void_int *elem_mapb,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_put_processor_elem_maps(*idne, elem_mapi, elem_mapb, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write processor element map to file id %d",
+	    *idne);
+    ex_err("nepem",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the communications map parameters for a single processor
+ */
+void
+F2C(exgcmp,EXGCMP)(int *idne,
+	    void_int *ncmap_ids,
+	    void_int *ncmap_node_cnts,
+	    void_int *ecmap_ids,
+	    void_int *ecmap_elem_cnts,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_cmap_params(*idne, ncmap_ids, ncmap_node_cnts,
+                                  ecmap_ids, ecmap_elem_cnts, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read comm map parameters from file id %d",
+	    *idne);
+    ex_err("negcmp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the communications map parameters for a single processor
+ */
+void
+F2C(expcmp,EXPCMP)(int *idne,
+	    void_int *nmap_ids,
+	    void_int *nmap_node_cnts,
+	    void_int *emap_ids,
+	    void_int *emap_elem_cnts,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_cmap_params(*idne, nmap_ids, nmap_node_cnts,
+                                  emap_ids, emap_elem_cnts, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write comm map parameters to file id %d",
+	    *idne);
+    ex_err("nepcmp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the communications map parameters for all processors
+ */
+void
+F2C(expcmpc,EXPCMPC)(int *idne,
+	     void_int *nmap_ids,
+	     void_int *nmap_node_cnts,
+	     void_int *nproc_ptrs,
+	     void_int *emap_ids,
+	     void_int *emap_elem_cnts,
+	     void_int *eproc_ptrs,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_cmap_params_cc(*idne, nmap_ids, nmap_node_cnts,
+                                     nproc_ptrs, emap_ids, emap_elem_cnts,
+                                     eproc_ptrs)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write comm map parameters to file id %d",
+	    *idne);
+    ex_err("nepcmpc",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the nodal communications map for a single processor
+ */
+void
+F2C(exgncm,EXGNCM)(int *idne,
+	    entity_id *map_id,
+	    void_int *node_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_node_cmap(*idne, *map_id, node_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read nodal communications map from file id %d",
+	    *idne);
+    ex_err("negncm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the nodal communications map for a single processor
+ */
+void
+F2C(expncm,EXPNCM)(int *idne,
+	    entity_id *map_id,
+	    void_int *node_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_node_cmap(*idne, *map_id, node_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write nodal communications map to file id %d",
+	    *idne);
+    ex_err("nepncm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the elemental communications map for a single processor
+ */
+void
+F2C(exgecm,EXGECM)(int *idne,
+	    entity_id *map_id,
+	    void_int *elem_ids,
+	    void_int *side_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_elem_cmap(*idne, *map_id, elem_ids, side_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read elemental comm map from file id %d",
+	    *idne);
+    ex_err("negecm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the elemental communications map for a single processor
+ */
+void
+F2C(expecm,EXPECM)(int *idne,
+	    entity_id *map_id,
+	    void_int *elem_ids,
+	    void_int *side_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_elem_cmap(*idne, *map_id, elem_ids, side_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write elemental comm map to file id %d",
+	    *idne);
+    ex_err("nepecm",errmsg,EX_MSG);
+  }
+}
diff --git a/exodus/forbind/src/exo_jack.src b/exodus/forbind/src/exo_jack.src
new file mode 100644
index 0000000..faf62a4
--- /dev/null
+++ b/exodus/forbind/src/exo_jack.src
@@ -0,0 +1,5251 @@
+/*
+ * Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/****************************************************************************
+*
+* exo_jack - exodusII fortran jacket
+*
+* author - Victor R. Yarberry, Sandia National Laboratories
+*
+* environment - UNIX
+*
+* entry conditions - 
+*   input parameters:
+*
+* exit conditions - 
+*
+* revision history - 
+*
+*
+*****************************************************************************/
+%*
+%*  Meta-source for various versions of ExodusII FORTRAN jacket library.
+%*
+%*  Patterned after the jackets.src netCDF library.
+%*
+%*  02/12/93 V.R. Yarberry
+%*  08/31/93 V.R. Yarberry - Modified for cbind Version 2.00
+%*
+%*  After minor preprocessing via a sed script, this file becomes source
+%*  to the m4 macro processor for a C library to be called from FORTRAN.
+%*  The main differences between this source and C are the way function
+%*  prototypes are declared.  All such declarations occur in lines beginning
+%*  with the "%" character.  A sed script converts these into calls to m4
+%*  macros for handling the various conventions for calling C functions from
+%*  FORTRAN.  Formal parameters corresponding to FORTRAN character strings
+%*  must be declared using the pseudo type "string".  Appending "len" to the
+%*  name of such variables is the convention used for variables representing
+%*  the FORTRAN length of string parameters.
+%*
+%*  For example, the following input
+%*  
+%*  % void
+%*  % ncadel (
+%*  %    int *cdfid,                    /* netCDF ID */
+%*  %    int *varid,                    /* variable ID */
+%*  %    string attname,                /* attribute name */
+%*  %    int *rcode                     /* returned error code */
+%*  %    )
+%*  % {
+%*  
+%*  will be converted to the following m4 macro calls:
+%*  
+%*  void`'M4__dnl
+%*  M4__PROTO(`ncadel',
+%*      `INTSTAR(cdfid)',
+%*      `INTSTAR(varid)',
+%*      `STRING(attname)',
+%*      `INTSTAR(rcode)'
+%*  )
+%*  {M4__LOCALS
+%*  
+%*  which may be converted to the following C, using sun.m4 and common.m4
+%*
+%*  void
+%*  ncadel_ (cdfid, varid, attname, rcode, attnamelen)
+%*      int *cdfid;
+%*      int *varid;
+%*      char *attname;
+%*      int attnamelen;
+%*      int *rcode;
+%*  {
+%*
+/*
+ * OVERVIEW
+ *
+ * This file contains jacket routines written in C for interfacing Fortran
+ * ExodusII function calls to the actual C binding for ExodusII.  This code
+ * is written explicitly for M4__SYSTEM.  In general, these functions handle
+ * character-string parameter conventions, convert between
+ * column-major-order arrays and row-major-order arrays, and map between
+ * array indices beginning at one and array indices beginning at zero.
+ *
+ */
+
+/* LINTLIBRARY */
+#include        <ctype.h>
+#include        <string.h>
+#include        <stdio.h>
+#include        <stdlib.h>
+#include        "netcdf.h"
+#include        "exodusII.h"
+#include        "exodusII_int.h"
+
+M4__STRING_DESCRIPTOR_INCLUDES
+
+M4__FORTRAN_DEFINES
+
+extern int ncopts;/* default is (NC_FATAL | NC_VERBOSE) */
+extern int exerrval; /* global integer that contains a Exodus-specific error code */
+
+/* blank fill C string to make FORTRAN string */
+void
+ex_fcdcpy (fstring, fslen, sstring)
+    char *fstring;              /* output string to be blank-filled */
+    int fslen;                  /* length of output string */
+    char *sstring;              /* input string, null-terminated */
+{
+    int i, len;
+
+    if (sstring != NULL) {
+       len = strlen(sstring);
+       if (len > fslen) len = fslen;
+
+       for (i = 0; i < len; i++)
+           *(fstring + i) = *(sstring + i);
+       for (i = len; i < fslen; i++)
+           *(fstring + i) = ' ';
+   } else {
+	for (i = 0; i < fslen; i++)
+           *(fstring + i) = ' ';
+   }
+}
+
+/* ex_lenstr - string length (w/o trailing blanks) */
+#ifdef __STDC__
+int ex_lenstr (char *string)
+#else
+int ex_lenstr (string)
+     char *string;
+#endif
+{
+  char *ptr;
+
+  ptr=string+strlen(string);    /* start at end of string including blanks */
+  while (*(--ptr) == ' ');      /* skip blanks */
+  return(ptr-string+1);         /* return trimmed length of string */
+}
+
+/* copy function used to copy strings and strip trailing blanks */
+void
+ex_fstrncpy (target, source, maxlen)
+    char *target;               /* space to be copied into */
+    char *source;               /* string to be copied */
+    int maxlen;                 /* maximum length of *source */
+{
+    int len=maxlen;
+
+    while (len-- && *source != '\0')
+        *target++ = *source++;
+
+    len=maxlen;
+    while (len-- && *(--target) == ' ');	/* strip blanks */
+    *(++target) = '\0';		/* insert new EOS marker */
+}
+
+/* copy function used to copy strings terminated with blanks */
+static void
+nstrncpy (target, source, maxlen)
+    char *target;               /* space to be copied into */
+    char *source;               /* string to be copied */
+    int maxlen;                 /* maximum length of *source */
+{
+    while (maxlen-- && *source != ' ')
+        *target++ = *source++;
+    *target = '\0';
+}
+
+
+/* copy 1D Fortran string arrays into C string arrays */
+void fstra2cstra(out_array,in_array,slen,arraylen)
+  char *out_array;      /* output character array */
+  char *in_array;       /* input character array */
+  int slen;             /* length of an individual string */
+  int arraylen;         /* array length (Fortran dimension) */
+{
+  int i;
+
+  while (arraylen--)
+  {
+    /** if (exoptval & EX_DEBUG) printf("[fstr2cstra] [%d]: ",arraylen); **/
+    for (i=0;i<slen;i++)
+    {
+      /** if (exoptval & EX_DEBUG) printf("%c",*in_array); **/
+      *out_array++=*in_array++;
+    }
+    *out_array++='\0'; /* add string terminator */
+    /** if (exoptval & EX_DEBUG) printf("\n"); **/
+  }
+}
+/* copy 1D C string arrays into Fortran string arrays */
+void cstra2fstra(out_array,in_array,slen,arraylen)
+  char *out_array;      /* output character array */
+  char *in_array;       /* input character array */
+  int slen;             /* length of an individual string */
+  int arraylen;         /* array length (Fortran dimension) */
+{
+  int i;
+
+  while (arraylen--)
+  {
+    for (i=0;i<slen;i++)
+      *out_array++=*in_array++;
+    in_array++; /* skip string terminator */
+  }
+}
+
+/* copy 2D Fortran string arrays into C string arrays */
+void fstra2cstra2d(out_array,in_array,slen,xarraylen,yarraylen)
+  char *out_array;      /* output character array */
+  char *in_array;       /* input character array */
+  int slen;             /* length of an individual string */
+  int xarraylen;        /* array length (Fortran 1st dimension) */
+  int yarraylen;        /* array length (Fortran 2nd dimension) */
+{
+  int i,j,k;
+
+/*  char *s;
+  s=out_array; */
+
+  for (k=0;k<yarraylen;k++)
+  {
+    for(j=0;j<xarraylen;j++)
+    {
+      for (i=0;i<slen;i++)
+        *out_array++=*in_array++;
+      *out_array++='\0'; /* insert C string terminator */
+    /* printf("(%d,%d): %s\n",k,j,s);
+      s=out_array; */
+    }
+  }
+}
+
+/* copy 2D C string arrays into Fortran string arrays */
+void cstra2fstra2d(out_array,in_array,slen,xarraylen,yarraylen)
+  char *out_array;      /* output character array */
+  char *in_array;       /* input character array */
+  int slen;             /* length of an individual string */
+  int xarraylen;        /* array length (Fortran 1st dimension) */
+  int yarraylen;        /* array length (Fortran 2nd dimension) */
+{
+  int i,j,k;
+
+/*  char *s;
+  s=out_array; */
+
+  for (k=0;k<xarraylen;k++)
+  {
+    for(j=0;j<yarraylen;j++)
+    {
+      for (i=0;i<slen;i++)
+        *out_array++=*in_array++;
+      in_array++; /* skip string terminator */
+    /* printf("(%d,%d): %s\n",k,j,s);
+      s=out_array; */
+    }
+  }
+}
+
+#ifdef FORTRAN_HAS_NO_SHORT
+/*
+ * Convert multi-dimensional array of shorts stored in ints to packed array of
+ * shorts, in malloc'ed space.  Returns pointer to shorts or NULL if malloc
+ * failed.
+ */
+static short *
+itos(ints, dims, ndims)
+     int *ints;         /* multi-dimensional array of ints */
+     int *dims;                 /* list of dimensions */
+     int ndims;                 /* number of dimensions in list */
+{
+    long iocount = dimprod (dims, ndims);       /* product of dimensions */
+    short *shorts = malloc (iocount * sizeof (short));
+    int *ip;
+    short *sp = shorts;
+
+    if (shorts != NULL)
+      for (ip = ints; iocount > 0; iocount--)
+        *sp++ = (short) *ip++;
+    return shorts;
+}
+#endif /* FORTRAN_HAS_NO_SHORT */
+
+/* ------------ M4__SYSTEM FORTRAN jackets for EXODUS II Functions ---------- */
+
+/*
+ * create an EXODUS II file
+ */
+% int
+% excre (
+%     string path,           /* file name for the new EXODUS II file */
+%     int *clobmode,         /* either EXNOCL or EXCLOB */
+%     int *cpu_word_size     /* CPU word size */
+%     int *io_word_size      /* IO word size */
+%     int *ierr              /* returned error code */
+%     )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *name;
+    int idexo;
+
+    if (!(name = malloc((pathlen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to allocate space for file name buffer");
+        ex_err("excre",errmsg,EX_MSG);
+      }
+      return(EX_FATAL);
+    }
+
+    (void) nstrncpy (name, path, pathlen);
+
+    if (exoptval & EX_DEBUG) 
+      printf("[excre] name: %s, mode: %d\n",name,*clobmode);
+    if ((idexo = 
+         ex_create (name, *clobmode, cpu_word_size, io_word_size)) != EX_FATAL)
+    {
+        free(name);
+        *ierr = 0;
+        return (idexo);
+    }
+    free(name);
+    *ierr = exerrval;
+    return (EX_FATAL);
+}
+
+/*
+ * open an EXODUS II file
+ */
+% int
+% exopen (
+%      string path,          /* file name of the EXODUS II file to be opened */
+%      int *mode,            /* either EXREAD or EXWRIT */
+%      int *cpu_word_size    /* CPU word size */
+%      int *io_word_size     /* returned IO word size */
+%      float *version,       /* returned EXODUS II version number */
+%      int *ierr             /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *name;
+    int idexo;
+
+    if (!(name = malloc((pathlen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to allocate space for file name buffer");
+        ex_err("exopen",errmsg,EX_MSG);
+      }
+      return(EX_FATAL);
+    }
+
+    (void) nstrncpy (name, path, pathlen);
+    if ((idexo = 
+       ex_open (name, *mode, cpu_word_size, io_word_size, version)) != EX_FATAL)
+    { 
+      free(name);
+      if (exoptval & EX_DEBUG) 
+        printf("[exopen] file: %d, version: %f\n",
+               idexo,*version);
+      *ierr = 0;
+      return (idexo);
+    }
+    free(name);
+    *ierr = EX_FATAL;
+    return (EX_FATAL);
+}
+
+/*
+ * close an EXODUS II file
+ */
+% void
+% exclos (
+%      int *idexo,           /* EXODUS file ID */
+%      int *ierr             /* returned error code */
+%      )
+% {
+
+    *ierr = 0;
+    if (ex_close(*idexo) == EX_FATAL)
+        *ierr = EX_FATAL;
+}
+
+/*
+ * update an EXODUS II file
+ */
+% void
+% exupda (
+%      int *idexo,           /* EXODUS file ID */
+%      int *ierr             /* returned error code */
+%      )
+% {
+
+    *ierr = 0;
+    if (ex_update (*idexo) == EX_FATAL)
+        *ierr = EX_FATAL;
+}
+
+/*
+ * write initialization parameters
+ */
+% void
+% expini (
+%      int *idexo,           /* EXODUS file ID */
+%      string title,         /* database title */
+%      int *num_dim,         /* dimensionality of the database */
+%      int *num_nodes,       /* number of nodal points */
+%      int *num_elem,        /* number of elements */
+%      int *num_elem_blk,    /* number of element blocks */
+%      int *num_node_sets,   /* number of node sets */
+%      int *num_side_sets,   /* number of side sets */
+%      int *ierr             /* returned error code */
+%      )
+% {
+
+    int slen;
+    char* name;
+
+    *ierr = 0;
+    slen = MAX_LINE_LENGTH;      /* max line size */
+    if (titlelen != MAX_LINE_LENGTH)
+    {
+      slen = titlelen;
+    }
+
+    name = malloc((slen + 1)*sizeof(char));
+
+    (void) ex_fstrncpy (name, title, slen);
+    if (ex_put_init (*idexo, name, *num_dim, *num_nodes, *num_elem,
+                     *num_elem_blk, *num_node_sets, *num_side_sets) == EX_FATAL)
+        *ierr = EX_FATAL;
+    free(name);
+}
+
+/*
+ * read initialization parameters
+ */
+% void
+% exgini (
+%      int *idexo,           /* EXODUS file ID */
+%      string title,         /* returned database title */
+%      int *num_dim,         /* returned dimensionality of the database */
+%      int *num_nodes,       /* returned number of nodal points */
+%      int *num_elem,        /* returned number of elements */
+%      int *num_elem_blk,    /* returned number of element blocks */
+%      int *num_node_sets,   /* returned number of node sets */
+%      int *num_side_sets,   /* returned number of side sets */
+%      int *ierr             /* returned error code */
+%      )
+% {
+
+    int slen;
+    char* name;
+
+    *ierr = 0;
+    slen = MAX_LINE_LENGTH;      /* max line size */
+    if (titlelen != MAX_LINE_LENGTH)
+    {
+      slen = titlelen;
+    }
+
+    name = malloc((slen + 1)*sizeof(char));
+    memset(name, 0, slen+1);
+
+    if (ex_get_init (*idexo, name, num_dim, num_nodes, num_elem, num_elem_blk,
+                     num_node_sets, num_side_sets) == EX_FATAL)
+        *ierr = EX_FATAL;
+    /* printf("title: %s\n",name); */
+    ex_fcdcpy (title, slen, name);
+    free(name);
+}
+
+/*
+ * write QA records
+ */
+% void
+% expqa (
+%     int *idexo,            /* EXODUS file ID */
+%     int *num_qa_records,   /* number of QA records */
+%     string qa_record,      /* string containing the QA records */
+%                            /* qa records are Fortran character*8 (4,*) */
+%     int *ierr              /* returned error code */
+%     )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **sptr;  /* internal string pointer array for malloc use */
+    int i,ii,iii,slen,alen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = MAX_STR_LENGTH;	/* max str size */
+    if (qa_recordlen != MAX_STR_LENGTH)
+    {
+      slen = qa_recordlen;
+    }
+    alen = 4;	/* qa records are 4 strings deep */
+
+    /* Allocate space for the name ptr array */
+    if (!(sptr=malloc(((*num_qa_records)*alen+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+      "Error: failed to allocate space for qa_records ptr array for file id %d",
+                *idexo);
+        ex_err("expqa",errmsg,EX_MSG);
+      }
+      return;
+    }
+    /* Allocate space for each of the strings, where size = slen,
+       place ptr into str ptr array,  and
+       Copy Fortran qa records to staging space */
+    iii = 0; /* offset counter */
+    for (i=0;i<*num_qa_records;i++)
+    {
+      for (ii=0;ii<alen;ii++)
+      {
+        *(sptr+iii)=malloc((slen+1)*sizeof(char));
+        if (*(sptr+iii) == 0)
+        {
+          free(sptr);	/* free up array ptr space */
+	  *ierr = EX_MEMFAIL;
+	  sprintf(errmsg,
+            "Error: failed to allocate space for qa record %d for file id %d",
+                  i,*idexo);
+          ex_err("expqa",errmsg,EX_MEMFAIL);
+          return;
+        }
+        /* copy fortran string into allocated space */
+        ex_fstrncpy(*(sptr+iii),qa_record+iii*qa_recordlen,slen);
+        iii++;	/* bump char array pointer */
+      }
+    }
+    /**printf("[expqa] last i: %d of %d\n",i,alen); **/
+    *(sptr+iii) = 0; /* set last pointer to null */
+
+    if (ex_put_qa(*idexo,*num_qa_records,(void *)sptr) == EX_FATAL)
+      *ierr=EX_FATAL;
+
+    /* Free up the space we used */
+    iii=0;
+    for (i=0;i<*num_qa_records;i++)
+    {
+      for (ii=0;ii<alen;ii++)
+      {
+        free(*(sptr+iii)); /* First free up string space */
+        iii++;
+      }
+    }
+    free(sptr);        /* Then free up array ptr space */
+}
+
+/*
+ * read QA records
+ */
+% void
+% exgqa (
+%     int *idexo,            /* EXODUS file ID */
+%     string qa_record,      /* returned string containing the QA records */
+%     int *ierr              /* returned error code */
+%     )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    int num_qa_records;
+    char **sptr;  /* internal string pointer array for malloc use */
+    int i,ii,iii,slen,alen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = MAX_STR_LENGTH;      /* max str size */
+    if (qa_recordlen != MAX_STR_LENGTH)
+    {
+      slen = qa_recordlen;
+    }
+    alen = 4;   /* qa records are 4 strings deep */
+
+    /* do ExodusII C call to find out how many qa records are avail */
+    num_qa_records = ex_inquire_int(*idexo,EX_INQ_QA);
+
+    /** if (exoptval & EX_DEBUG)
+	   print("[exgqa] # of QA records: %d\n",num_qa_records); **/
+    /* Allocate space for the QA string ptr array */
+    if (!(sptr=malloc((num_qa_records*alen+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+      "Error: failed to allocate space for qa records ptr array for file id %d",
+                *idexo);
+        ex_err("exgqa",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Step 1: Allocate space for each of the strings, where size = slen,
+       		place string ptr into str ptr array.
+       Step 2: Call routine to get qa records
+       Step 3: Copy C qa records to passed Fortran array space */
+
+    iii = 0; /* offset counter */
+    for (i=0;i<num_qa_records;i++) /* pointer allocation loop */
+    {
+      for (ii=0;ii<alen;ii++)
+      {
+        *(sptr+iii)=malloc((slen+1)*sizeof(char));
+        if (*(sptr+iii) == 0)
+        {
+          *ierr = EX_MEMFAIL;
+          if (exoptval & EX_DEBUG)
+          {
+            sprintf(errmsg,
+              "Error: failed to allocate space for qa record %d for file id %d",
+                    i,*idexo);
+            ex_err("exgqa",errmsg,EX_MEMFAIL);
+          }
+          return;
+        }
+        iii++; /* bump char array pointer */
+      }
+    }
+    *(sptr+iii) = 0; /* null out last pointer */
+
+    /* do ExodusII C call to get qa records */
+    if (ex_get_qa(*idexo,(void *)sptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get qa records from file id %d",
+                *idexo);
+        ex_err("exgqa",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    iii = 0; /* offset counter */
+    for (i=0;i<num_qa_records;i++) /* string copy loop */
+    {
+      for (ii=0;ii<alen;ii++)
+      {
+        /* copy fortran string into allocated space */
+        ex_fcdcpy(qa_record+iii*qa_recordlen,slen,*(sptr+iii));
+        iii++;  /* bump char array pointer */
+      }
+    }
+
+    /* Free up the space we used */
+    iii=0;
+    for (i=0;i<num_qa_records;i++)
+    {
+      for (ii=0;ii<alen;ii++)
+      {
+        free(*(sptr+iii)); /* First free up string space */
+        iii++;
+      }
+    }
+    free(sptr);        /* Then free up array ptr space */
+}
+
+/*
+ * write information records
+ */
+% void
+% expinf (
+%      int *idexo,            /* EXODUS file ID */
+%      int *num_info,         /* number of information records */
+%      string info,           /* array containing the information records */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **aptr;  /* internal string array pointer for malloc use */
+    char *sptr;   /* internal string pointer for malloc use */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+    slen = MAX_LINE_LENGTH;	/* max str size */
+    if (infolen != MAX_LINE_LENGTH)
+    {
+      slen = infolen;
+    }
+
+
+    /* Allocate space for the string ptr array */
+    if (!(aptr=malloc(((*num_info)+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+     "Error: failed to allocate space for info record ptr array for file id %d",
+                *idexo);
+        ex_err("expinf",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the info records */
+    if (!(sptr=malloc(*num_info*(slen+1)*sizeof(char))))
+    { 
+      free(aptr);        /* Free up string ptr array */	
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for info record buffer for file id %d",
+                *idexo);
+        ex_err("expinf",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    /* Copy Fortran info records to staging space */
+    for (i=0;i<*num_info;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);		/* put address into ptr array */
+      ex_fstrncpy(*(aptr+i),info+i*infolen,slen);	/* copy string into buffer */
+    }
+    *(aptr+i) = 0; /* null out last ptr */
+    if (ex_put_info(*idexo,*num_info,aptr) == EX_FATAL)
+    {
+      *ierr=EX_FATAL;
+      free(sptr);	/* Free up string staging area */
+      free(aptr);      /* Free up string ptr array */	
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store info record in file id %d",
+                *idexo);
+        ex_err("expinf",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+}
+
+/*
+ * read information records
+ */
+% void
+% exginf (
+%      int *idexo,            /* EXODUS file ID */
+%      string info,           /* returned array containing the information */
+%                             /* records */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **aptr;  /* internal string array pointer for malloc use */
+    char *sptr;   /* internal string pointer for malloc use */
+    int i,slen,num_info;
+
+    *ierr=0;     /* default no errror */
+
+    /* do exodusII C call to find out how many info records are avail */
+    num_info = ex_inquire_int(*idexo,EX_INQ_INFO);
+
+    slen = MAX_LINE_LENGTH;	/* max str size */
+    if (infolen != MAX_LINE_LENGTH)
+    {
+      slen = infolen;
+    }
+
+    /* Step 1: Allocate space for string ptr array
+       Step 2: Allocate space for info record strings, and 
+               put pointers into str ptr array
+       Step 3: Do ExodusII call to get records
+       Step 4: Copy strings into passed Fortran buffer space */
+
+    /* Allocate space for the string ptr array */
+    if (!(aptr=malloc((num_info+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+            "Error: failed to allocate space for info ptr array for file id %d",
+                *idexo);
+        ex_err("exginf",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate block of space for info strings */
+    if (!(sptr=malloc(num_info*(slen+1)*sizeof(char))))
+    { 
+      free(aptr);	/* Free up string ptr array */	
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+              "Error: failed to allocate space for info records for file id %d",
+                *idexo);
+        ex_err("exginf",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    for (i=0;i<num_info;i++) /* Put pointers to the info records in ptr array */
+      *(aptr+i) = sptr+i*(slen+1);	/* put ptr in string ptr array */
+    *(aptr+i) = 0;	/* null out last pointer */
+
+    /* Do exodusII call to get info records */
+    if (ex_get_info(*idexo,aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get info records from file id %d",
+                *idexo);
+        ex_err("exginf",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    for (i=0;i<num_info;i++) /* Copy Fortran info records to staging space */
+    {
+      ex_fcdcpy(info+i*infolen,slen,*(aptr+i));	/* copy string into buffer */
+      /** printf("[exginf] rec: %d , %s\n",i,*(aptr+i)); **/
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+
+}
+
+/*
+ * write nodal coordinates
+ */
+% void
+% expcor (
+%      int *idexo,            /* EXODUS file ID */
+%      real *x_coor,         /* x coordinates of the nodes */
+%      real *y_coor,         /* y coordinates of the nodes */
+%      real *z_coor,         /* z coordinates of the nodes */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_coord (*idexo, x_coor, y_coor, z_coor) == EX_FATAL)
+    {
+        *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store coordinates in file id %d",
+                *idexo);
+        ex_err("expcor",errmsg,EX_MSG);
+      }
+
+    }
+}
+ 
+/*
+ * read nodal coordinates
+ */
+% void
+% exgcor (
+%      int *idexo,            /* EXODUS file ID */
+%      real *x_coor,         /* returned x coordinates of the nodes */
+%      real *y_coor,         /* returned y coordinates of the nodes */
+%      real *z_coor,         /* returned z coordinates of the nodes */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_coord (*idexo, x_coor, y_coor, z_coor) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get coordinates from file id %d",
+                *idexo);
+        ex_err("exgcor",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write coordinate names
+ */
+% void
+% expcon (
+%      int *idexo,            /* EXODUS file ID */
+%      string coord_names,    /* array containing names for the nodal */
+%                             /* coordinates */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    char **aptr;  /* internal array of string pointers for malloc use */
+    char *sptr;   /* internal string pointer for malloc use */
+    int i,ndim,slen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (coord_nameslen < slen)
+    {
+      slen = coord_nameslen;
+    }
+    /* do ExodusII C call to find out how many dimensions  */
+    ndim = ex_inquire_int(*idexo,EX_INQ_DIM);
+
+    /* Allocate space for the name ptr array */
+    if (!(aptr=malloc((ndim+1)*sizeof(char *))))
+    { 
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+ "Error: failed to allocate space for coordinate name ptr array for file id %d",
+                *idexo);
+        ex_err("expcon",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    /* Allocate a block of space for the strings, where size = slen,
+       place ptrs into str ptr array,  and
+       Copy Fortran coordinate names to staging space */
+
+    if(!(sptr=malloc(ndim*(slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for coordinate name buffer for file id %d",
+                *idexo);
+        ex_err("expcon",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    for (i=0;i<ndim;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);
+      /* copy fortran string into allocated space */
+      ex_fstrncpy(*(aptr+i),coord_names+i*coord_nameslen,slen);
+    }
+    *(aptr+i) = 0; /* set last pointer to null */
+
+    if (ex_put_coord_names(*idexo,aptr) == EX_FATAL)
+    {
+      *ierr=EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store coordinate names in file id %d",
+                *idexo);
+        ex_err("expcon",errmsg,EX_MSG);
+      }
+    }
+    /* Free up the space we used */
+    free(sptr);	/* First free up string space */
+    free(aptr);	/* Then free up array ptr space */
+}
+/*
+ * read coordinate names
+ */
+% void
+% exgcon (
+%      int *idexo,            /* EXODUS file ID */
+%      string coord_names,    /* returned array containing names for the */
+%                             /* nodal coordinates */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **aptr;  /* internal string array pointer for malloc use */
+    char *sptr;   /* internal string pointer for malloc use */
+    int ndim;
+    int i,slen;
+
+    *ierr = 0; /* default no error */
+
+    /** if (exoptval & EX_DEBUG)
+      printf("[exgcon] Fortran target loc: %ld\n",coord_names); **/
+    slen = ex_max_name_length; /* max string size */
+    if (coord_nameslen < slen)
+    {
+      slen = coord_nameslen;
+    }
+
+    /* do ExodusII C call to find out how many dimensions */
+    ndim = ex_inquire_int(*idexo,EX_INQ_DIM);
+
+    /* allocate memory to stage the coordinate name ptrs into */
+    if (!(aptr = malloc((ndim+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+ "Error: failed to allocate space for coordinate name ptr array for file id %d",
+                *idexo);
+        ex_err("exgcon",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    /** if (exoptval & EX_DEBUG)
+      printf("[exgcon] str ptr array: %ld\n",aptr); **/
+
+    /* allocate a block of memory to stage the coordinate names into */
+    if (!(sptr=malloc(ndim*(slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      free(aptr);		/* free up array ptr space */
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for coordinate name buffer for file id %d",
+                *idexo);
+        ex_err("exgcon",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    /** if (exoptval & EX_DEBUG)
+      printf("[exgcon] str ptr buffer base: %ld\n",sptr); **/
+
+    for (i=0;i<ndim;i++) /* put pointers to staging space into ptr array */
+    {
+      *(aptr+i)=sptr+i*(slen+1);
+      /** if (exoptval & EX_DEBUG) printf("[exgcon] i: %d, ptr: %ld, buf:%ld\n",
+					i,aptr+i,*(aptr+i)); **/
+    }
+
+    /* do ExodusII C call to get coord name records */
+    if (ex_get_coord_names(*idexo,aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);		/* free up string space */
+      free(aptr);		/* free up array ptr space */
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get coordinate names from file id %d",
+                *idexo);
+        ex_err("exgcon",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    /* copy C strings to Fortran arrays */
+    memset(coord_names, 0, ndim*coord_nameslen);
+    for (i=0;i<ndim;i++)
+    {
+      if (exoptval & EX_DEBUG)
+        printf("[exgcon] name(%d): %s\n",i,*(aptr+i));
+      ex_fcdcpy(coord_names+i*coord_nameslen,slen,*(aptr+i)); /* copy and blank fill */
+    }
+
+    free(sptr);        /* Free up string buffer space */
+    free(aptr);        /* Finally, free up array ptr space */
+    return;
+}
+
+/*
+ * write element order map
+ */
+% void
+% expmap (
+%      int *idexo,            /* EXODUS file ID */
+%      int *elem_map,         /* element order map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_map (*idexo, elem_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element order map in file id %d",
+                *idexo);
+        ex_err("expmap",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read element order map
+ */
+% void
+% exgmap (
+%      int *idexo,            /* EXODUS file ID */
+%      int *elem_map,         /* returned element order map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_map (*idexo, elem_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element order map from file id %d",
+                *idexo);
+        ex_err("exgmap",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write concatenated element block parameters
+ */
+% void
+% expclb (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block IDs */
+%      string elem_type,       /* type of elements in each element block */
+%      int *num_elem_this_blk, /* number of elements in each element block */
+%      int *num_nodes_per_elem,/* number of nodes per element in each element */
+%                              /* block */
+%      int *num_attr,          /* number of attributes in each element block */
+%      int *create_maps,       /* TRUE/FALSE should library define maps? */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    int num_elem_blk;
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i, slen;
+
+    *ierr = 0; /* default no error */
+
+    num_elem_blk = ex_inquire_int(*idexo,EX_INQ_ELEM_BLK);
+
+    slen = MAX_STR_LENGTH;     /* max str size */
+    if (elem_typelen != MAX_STR_LENGTH)
+    {
+      slen = elem_typelen;
+    }
+
+
+    /* allocate memory for pointer array */
+    if (!(aptr=malloc((num_elem_blk+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for element block type names ptr array for file id %d",
+                *idexo);
+        ex_err("expclb",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory to stage the element type name into */
+    if (!(sptr=malloc(num_elem_blk*(slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for element type name buffer for file id %d",
+                *idexo);
+        ex_err("expclb",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Copy element type names from Fortran array to staging area */
+    for (i=0;i<num_elem_blk;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);		/* put address into ptr array */
+      ex_fstrncpy(*(aptr+i),elem_type+i*elem_typelen,slen);/* copy string into buffer */
+    }
+    *(aptr+i) = 0; /* null out last ptr */
+
+    if (ex_put_concat_elem_block (*idexo, elem_blk_id, aptr, num_elem_this_blk,
+				  num_nodes_per_elem, num_attr, *create_maps) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element block parameters in file id %d",
+                *idexo);
+        ex_err("expclb",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);
+    free(aptr);
+}
+
+/*
+ * write element block parameters
+ */
+% void
+% expelb (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      string elem_type,       /* type of elements in the element block */
+%      int *num_elem_this_blk, /* number of elements in the element block */
+%      int *num_nodes_per_elem,/* number of nodes per element in the element */
+%                              /* block */
+%      int *num_attr,          /* number of attributes in the element block */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr;  /* internal string pointer for malloc use */
+    int slen;
+
+    *ierr = 0; /* default no error */
+
+    slen = MAX_STR_LENGTH;     /* max str size */
+    if (elem_typelen != MAX_STR_LENGTH)
+    {
+      slen = elem_typelen;
+    }
+
+
+    /** if (exoptval & EX_DEBUG) print(
+  "[expelb] file ID: %d, Elem blk ID: %d, #Elem: %d, #Nodes: %d, #Attrib: %d\n",
+    *idexo,*elem_blk_id,*num_elem_this_blk,*num_nodes_per_elem,*num_attr); **/
+
+    /* allocate memory to stage the element type name into */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for element type name buffer for file id %d",
+                *idexo);
+        ex_err("expelb",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Copy element type names from Fortran array to staging area */
+    ex_fstrncpy(sptr,elem_type,slen);
+
+    if (ex_put_elem_block (*idexo, *elem_blk_id, sptr, *num_elem_this_blk,
+                           *num_nodes_per_elem, *num_attr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element block parameters in file id %d",
+                *idexo);
+        ex_err("expelb",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);
+}
+
+/*
+ * read element block parameters
+ */
+% void
+% exgelb (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      string elem_type,       /* type of elements in the element block */
+%      int *num_elem_this_blk, /* returned number of elements in the element */
+%                              /* block */
+%      int *num_nodes_per_elem,/* returned number of nodes per element in the */
+%                              /* element block */
+%      int *num_attr,          /* returned number of attributes in the */
+%                              /* element block */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr; /* internal string pointer for malloc use */
+    int slen;
+
+    *ierr = 0;
+
+    slen = MAX_STR_LENGTH;     /* max str size */
+    if (elem_typelen != MAX_STR_LENGTH)
+    {
+      slen = elem_typelen;
+    }
+
+    /* allocate memory to stage the element type names into */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for element type name buffer for file id %d",
+                *idexo);
+        ex_err("exgelc",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    if (ex_get_elem_block (*idexo, *elem_blk_id, sptr, num_elem_this_blk,
+                            num_nodes_per_elem,num_attr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to read element block parameters in file id %d",
+                *idexo);
+        ex_err("exgelb",errmsg,EX_MSG);
+      }
+      return;
+    }
+    /* Copy element type name from staging area to Fortran array */
+    memset(elem_type, 0, elem_typelen);
+    ex_fcdcpy (elem_type, slen, sptr);
+/*    cstra2fstra(sptr,elem_type,elem_typelen,num_elem_this_blk); */
+    free(sptr);
+
+}
+
+/*
+ * read element blocks IDs
+ */
+% void
+% exgebi (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_ids,      /* returned array of element blocks IDs */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_elem_blk_ids (*idexo, elem_blk_ids) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element block ids from file id %d",
+                *idexo);
+        ex_err("exgebi",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write element block connectivity
+ */
+% void
+% expelc (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      int *connect,           /* connectivity array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    *ierr = 0;
+
+    /* do ExodusII C call to write the element block connectivity */
+    if (ex_put_elem_conn(*idexo,*elem_blk_id,connect) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element block connectivitys in file id %d",
+                *idexo);
+        ex_err("expelc",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read element block connectivity
+ */
+% void
+% exgelc (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      int * connect,          /* returned connectivity array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    *ierr = 0;
+
+    /* do ExodusII C call to read the element block connectivity */
+    if (ex_get_elem_conn(*idexo,*elem_blk_id,connect) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element block connectivity from file id %d",
+                *idexo);
+        ex_err("exgelc",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * write entity count-per-polyhedra information for nsided block
+ */
+% void
+% expecpp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      int *elem_blk_id,       /* element block ID */
+%      int *counts,            /* entity count-per-polyhedra array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_put_entity_count_per_polyhedra(*idexo,(ex_entity_type)*obj_type,*elem_blk_id, counts) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store entity_count-per-polyhedra information in file id %d",
+                *idexo);
+        ex_err("expecpp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read entity count-per-polyhedra information for nsided block
+ */
+% void
+% exgecpp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      int *elem_blk_id,       /* element block ID */
+%      int *counts,            /* entity count-per-polyhedra array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_get_entity_count_per_polyhedra(*idexo,(ex_entity_type)*obj_type,*elem_blk_id,counts) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get entity_count-per-polyhedra information from file id %d",
+                *idexo);
+        ex_err("exgecpp",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * write element block attributes
+ */
+% void
+% expeat (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      real *attrib,           /* list of attributes for the element block */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+/* WARNING - this routine must be fixed for multiple attributed blocks !!! */
+    *ierr = 0;
+    /** if (exoptval & EX_DEBUG) 
+	printf("[expeat] file ID: %d, elem_blk_id: %d, attrib: %f\n",
+          	*idexo,*elem_blk_id,*attrib); **/
+    if (ex_put_elem_attr(*idexo,*elem_blk_id,attrib) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element block attributes in file id %d",
+                *idexo);
+        ex_err("expeat",errmsg,EX_MSG);
+      }
+    }
+}
+
+
+/*
+ * read element block attributes
+ */
+% void
+% exgeat (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      real *attrib,          /* returned list of attributes for the element */
+%                              /* block */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+/* WARNING - this routine must be fixed for multiple attributed blocks !!! */
+
+    *ierr = 0;
+    if (ex_get_elem_attr(*idexo,*elem_blk_id,attrib) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element block attributes from file id %d",
+                *idexo);
+        ex_err("exgeat",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read element block attribute names
+ */
+% void
+% exgean (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      int *num_attr,          /* number of attributes */
+%      string names,           /* string containing attribute names */
+%                              /* block */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+    char errmsg[MAX_ERR_LENGTH];
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = ex_max_name_length;	/* max str size */
+    if (nameslen < slen)
+    {
+      slen = nameslen;
+    }
+
+    /* allocate memory to for pointer array */
+    if (!(aptr=malloc((*num_attr+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+                "Error: failed to allocate space for element attribute names ptr array for file id %d",
+                *idexo);
+        ex_err("exgean",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the variable names */
+    if (!(sptr=malloc(*num_attr*(slen+1)*sizeof(char))))
+    { 
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for object names for file id %d",
+                *idexo);
+        ex_err("exgean",errmsg,EX_MEMFAIL);
+      }
+      free(aptr);        /* Free up string ptr array */	
+      return;
+    }
+    for (i=0;i<*num_attr;i++)
+      *(aptr+i) = sptr+i*(slen+1);              /* put address into ptr array */
+    *(aptr+i) = 0; /* null out last ptr */
+
+    *ierr = 0;
+    if (ex_get_elem_attr_names(*idexo,*elem_blk_id, aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);	/* free up allocated space */  
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element block attribute names from file id %d",
+                *idexo);
+        ex_err("exgean",errmsg,EX_MSG);
+      }
+    }
+    /* Copy Fortran names from staging space */
+    memset(names, 0, *num_attr*nameslen);
+    for (i=0;i<*num_attr;i++)
+    {
+	ex_fcdcpy(names+i*nameslen,slen,*(aptr+i));/* copy str into Fortran buffer */
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+}
+
+/*
+ * write element block attribute names
+ */
+% void
+% expean (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_blk_id,       /* element block ID */
+%      int *num_attr,          /* number of attributes */
+%      string names,           /* string containing attribute names */
+%                              /* block */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+    char errmsg[MAX_ERR_LENGTH];
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (nameslen < slen)
+    {
+      slen = nameslen;
+    }
+
+    /* allocate memory to for pointer array */
+    if (!(aptr=malloc((*num_attr+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+                "Error: failed to allocate space for element attribute names ptr array for file id %d",
+                *idexo);
+        ex_err("expean",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the variable names */
+    if (!(sptr=malloc(*num_attr*(slen+1)*sizeof(char))))
+    { 
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for object names for file id %d",
+                *idexo);
+        ex_err("expean",errmsg,EX_MEMFAIL);
+      }
+      free(aptr);        /* Free up string ptr array */	
+      return;
+    }
+
+    /* Copy Fortran names to staging space */
+    for (i=0;i<*num_attr;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);		/* put address into ptr array */
+      ex_fstrncpy(*(aptr+i),names+i*nameslen,slen);/* copy string into buffer */
+    }
+    *(aptr+i) = 0; /* null out last ptr */
+
+    *ierr = 0;
+    if (ex_put_elem_attr_names(*idexo,*elem_blk_id, aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element block attribute names from file id %d",
+                *idexo);
+        ex_err("expean",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);	/* Free up string staging area */
+    free(aptr); /* Free up string ptr array */	
+}
+
+/*
+ * write object names
+ */
+% void
+% expnams (
+%      int *idexo,             /* EXODUS file ID */
+%      int *type,             /* type of objects which are described */
+%      int *num_obj,           /* number of objects of specified type */
+%      string names,           /* string containing object names */
+%      int *ierr               /* returned error code */
+%      )
+% {
+  
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (nameslen < slen)
+    {
+      slen = nameslen;
+    }
+
+    /* allocate memory for pointer array */
+    if (!(aptr=malloc((*num_obj+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for variable names ptr array for file id %d",
+                *idexo);
+        ex_err("expnams",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the variable names */
+    if (!(sptr=malloc(*num_obj*(slen+1)*sizeof(char))))
+    { 
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+     "Error: failed to allocate space for variable names buffer for file id %d",
+                *idexo);
+        ex_err("expnams",errmsg,EX_MEMFAIL);
+      }
+      free(aptr);        /* Free up string ptr array */	
+      *ierr = EX_MEMFAIL;
+      return;
+    }
+    /* Copy Fortran names to staging space */
+    for (i=0;i<*num_obj;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);		/* put address into ptr array */
+      ex_fstrncpy(*(aptr+i),names+i*nameslen,slen);/* copy string into buffer */
+    }
+    *(aptr+i) = 0; /* null out last ptr */
+    /* do ExodusII C call to write results variables names */
+    if (ex_put_names(*idexo,(ex_entity_type)*type,aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store object names in file id %d",
+                *idexo);
+        ex_err("expnams",errmsg,EX_MSG);
+      }
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+}
+/*
+ * read object names
+ */
+% void
+% exgnams (
+%      int *idexo,         /* EXODUS file ID */
+%      int *type,          /* type of object which is described */
+%      int *num_obj,       /* number of 'type' names to be read */
+%      string names,       /* returned string containing num_obj names */
+%      int *ierr           /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = ex_max_name_length;	/* max str size */
+    if (nameslen < slen)
+    {
+      slen = nameslen;
+    }
+
+    /* allocate memory to for pointer array */
+    if (!(aptr=malloc((*num_obj+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+                "Error: failed to allocate space for results variable names ptr array for file id %d",
+                *idexo);
+        ex_err("exgvan",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the variable names */
+    if (!(sptr=malloc(*num_obj*(slen+1)*sizeof(char))))
+    { 
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for object names for file id %d",
+                *idexo);
+        ex_err("exgnams",errmsg,EX_MEMFAIL);
+      }
+      free(aptr);        /* Free up string ptr array */	
+      return;
+    }
+    for (i=0;i<*num_obj;i++)
+      *(aptr+i) = sptr+i*(slen+1);              /* put address into ptr array */
+    *(aptr+i) = 0; /* null out last ptr */
+
+    /* do ExodusII C call to read results variables names */
+    if (ex_get_names(*idexo,(ex_entity_type)*type,aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);	/* free up allocated space */  
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get results variable names from file id %d",
+                *idexo);
+        ex_err("exgnams",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    /* Copy Fortran names from staging space */
+    memset(names, 0, *num_obj*nameslen);
+    for (i=0;i<*num_obj;i++)
+    {
+	ex_fcdcpy(names+i*nameslen,slen,*(aptr+i));/* copy str into Fortran buffer */
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+}
+
+/*
+ * write property array names
+ */
+% void
+% exppn (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      int *num_props,         /* number of properties */
+%      string prop_names       /* character array of property names */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    char **aptr;  /* internal string array pointer for malloc use */
+    char *sptr;  /* internal string pointer for malloc use */
+    int i, slen;
+
+    *ierr = 0;
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (prop_nameslen < slen)
+    {
+      slen = prop_nameslen;
+    }
+
+    /* Allocate space for the name ptr array */
+    if (!(aptr=malloc((*num_props+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+ "Error: failed to allocate space for property name ptr array for file id %d",
+                *idexo);
+        ex_err("exppn",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate a block of space for the strings, where size = slen,
+       place ptrs into str ptr array,  and
+       Copy Fortran coordinate names to staging space */
+
+    if(!(sptr=malloc((*num_props)*(slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+      "Error: failed to allocate space for property name buffer for file id %d",
+                *idexo);
+        ex_err("exppn",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    for (i=0;i<*num_props;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);
+    /* copy fortran string into allocated space */
+      ex_fstrncpy(*(aptr+i),prop_names+i*prop_nameslen,slen);
+    }
+    *(aptr+i) = 0; /* set last pointer to null */
+
+
+    if (ex_put_prop_names(*idexo,(ex_entity_type)*obj_type, *num_props, aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store property names in file id %d",
+                *idexo);
+        ex_err("exppn",errmsg,EX_MSG);
+      }
+    }
+    /* Free up the space we used */
+    free(sptr);        /* First free up string space */
+    free(aptr);        /* Then free up array ptr space */
+}
+
+
+/*
+ * read property array names
+ */
+% void
+% exgpn (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      string prop_names       /* character array of property names */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    char **aptr;  /* internal string array pointer for malloc use */
+    char *sptr;  /* internal string pointer for malloc use */
+    int i, slen;
+    ex_inquiry inq_code;
+    int num_props;
+
+    *ierr = 0;
+
+    slen = ex_max_name_length;     /* max str size */
+    if (prop_nameslen < slen)
+    {
+      slen = prop_nameslen;
+    }
+
+    switch ((ex_entity_type)*obj_type)
+    {
+      case EX_ELEM_BLOCK:
+        inq_code = EX_INQ_EB_PROP;
+        break;
+      case EX_NODE_SET:
+        inq_code = EX_INQ_NS_PROP;
+        break;
+      case EX_SIDE_SET:
+        inq_code = EX_INQ_SS_PROP;
+        break;
+      case EX_ELEM_MAP:
+        inq_code = EX_INQ_EM_PROP;
+        break;
+      case EX_NODE_MAP:
+        inq_code = EX_INQ_NM_PROP;
+        break;
+      default:
+        exerrval = EX_BADPARAM;
+        *ierr = EX_BADPARAM;
+        sprintf(errmsg, "Error: object type %d not supported; file id %d",
+                *obj_type, *idexo);
+        ex_err("exgpn",errmsg,exerrval);
+        return;
+     }
+
+    
+    /* do ExodusII C call to find out how many properties */
+    num_props = ex_inquire_int(*idexo,inq_code);
+
+    /* Allocate space for the name ptr array */
+    if (!(aptr=malloc((num_props+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+ "Error: failed to allocate space for property name ptr array for file id %d",
+                *idexo);
+        ex_err("exgpn",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate a block of space for the strings, where size = slen,
+       place ptrs into str ptr array,  and
+       Copy Fortran coordinate names to staging space */
+
+    if(!(sptr=malloc(num_props*(slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+      "Error: failed to allocate space for property name buffer for file id %d",
+                *idexo);
+        ex_err("exgpn",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    memset(sptr, 0, num_props*(slen+1));
+
+    for (i=0;i<num_props;i++)
+      *(aptr+i) = sptr+i*(slen+1);/* put ptrs to staging space into ptr array */
+    *(aptr+i) = 0; /* set last pointer to null */
+
+    /* do ExodusII C call to get property name records */
+    if (ex_get_prop_names(*idexo,(ex_entity_type)*obj_type, aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);              /* free up string space */
+      free(aptr);              /* free up array ptr space */
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get property names in file id %d",
+                *idexo);
+        ex_err("exgpn",errmsg,EX_MSG);
+      }
+      return;
+    }
+    /* copy C strings to Fortran arrays */
+    memset(prop_names, 0, num_props*prop_nameslen);
+    for (i=0;i<num_props;i++)
+    {
+      if (exoptval & EX_DEBUG)
+        printf("[exgpn] name(%d): %s\n",i,*(aptr+i));
+      ex_fcdcpy(prop_names+i*prop_nameslen,slen,*(aptr+i)); /* copy and blank fill */
+    }
+
+    /* Free up the space we used */
+    free(sptr);        /* First free up string space */
+    free(aptr);        /* Then free up array ptr space */
+}
+
+/*
+ * write object property
+ */
+% void
+% expp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      int *obj_id,            /* object id code */
+%      string prop_name,       /* property name */
+%      int *value,             /* property value */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    char *sptr;  /* internal string pointer for malloc use */
+    int slen;
+
+    *ierr = 0;
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (prop_namelen < slen)
+    {
+      slen = prop_namelen;
+    }
+
+    /* allocate memory to stage the property name into */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for property name buffer for file id %d",
+                *idexo);
+        ex_err("expp",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    /* Copy property name from Fortran string to staging area */
+    /* nstrncpy(sptr,prop_name,slen); */
+    ex_fstrncpy(sptr,prop_name,slen);
+
+    if (ex_put_prop (*idexo, (ex_entity_type)*obj_type, *obj_id, sptr, *value) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store property names in file id %d",
+                *idexo);
+        ex_err("expp",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);
+}
+
+/*
+ * read object property
+ */
+% void
+% exgp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      int *obj_id,            /* object id code */
+%      string prop_name,       /* property name */
+%      int *value,             /* returned property value */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr;  /* internal string pointer for malloc use */
+    int slen;
+
+    *ierr = 0;
+
+    slen = ex_max_name_length;     /* max str size */
+    if (prop_namelen < slen)
+    {
+      slen = prop_namelen;
+    }
+
+    /* allocate memory to stage the property name into */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for property name buffer for file id %d",
+                *idexo);
+        ex_err("exgp",errmsg,EX_MEMFAIL);
+      }
+    }
+
+    /* Copy property name from Fortran string to staging area */
+    ex_fstrncpy(sptr,prop_name,slen);
+
+    /* use exodusII C routine to get the property value */
+    if (ex_get_prop (*idexo, (ex_entity_type)*obj_type, *obj_id, sptr, value) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get %s property value in file id %d",
+                sptr, *idexo);
+        ex_err("exgp",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);
+}
+
+/*
+ * read object property array
+ */
+% void
+% exgpa (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      string prop_name,       /* property name */
+%      int *values,            /* returned property values array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr;  /* internal string pointer for malloc use */
+    int slen;
+
+    *ierr = 0;
+
+    slen = ex_max_name_length;     /* max str size */
+    if (prop_namelen < slen)
+    {
+      slen = prop_namelen;
+    }
+
+    /* allocate memory to stage the property name into */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for property name buffer for file id %d",
+                *idexo);
+        ex_err("exgpa",errmsg,EX_MEMFAIL);
+      }
+    }
+    memset(sptr, 0, slen+1);
+
+    /* Copy property name from Fortran string to staging area */
+    ex_fstrncpy(sptr,prop_name,slen);
+
+
+    /* use exodusII C routine to get the values array */
+    if (ex_get_prop_array (*idexo, (ex_entity_type)*obj_type, sptr, values) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get %s property values in file id %d",
+                sptr, *idexo);
+        ex_err("exgpa",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);
+}
+
+/*
+ * write object property array
+ */
+% void
+% exppa (
+%      int *idexo,             /* EXODUS file ID */
+%      int *obj_type,          /* object type code */
+%      string prop_name,       /* property name */
+%      int *values,            /* property values array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr;  /* internal string pointer for malloc use */
+    int slen;
+
+    *ierr = 0;
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (prop_namelen < slen)
+    {
+      slen = prop_namelen;
+    }
+
+    /* allocate memory to stage the property name into */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for property name buffer for file id %d",
+                *idexo);
+        ex_err("exppa",errmsg,EX_MEMFAIL);
+      }
+    }
+
+    /* Copy property name from Fortran string to staging area */
+    ex_fstrncpy(sptr,prop_name,slen);
+
+
+    /* Use exodusII C routine to store the property values */
+    if (ex_put_prop_array (*idexo, (ex_entity_type)*obj_type, sptr, values) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store %s property values in file id %d",
+                sptr, *idexo);
+        ex_err("exppa",errmsg,EX_MSG);
+      }
+    }
+    free(sptr);
+}
+
+/*
+ * write node set parameters
+ */
+% void
+% expnp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_id,       /* node set ID */
+%      int *num_nodes_in_set,  /* number of nodes in the node set */
+%      int *num_dist_in_set,   /* number of dist factors in the node set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_node_set_param(*idexo,*node_set_id,
+                              *num_nodes_in_set, *num_dist_in_set) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store node set parameters in file id %d",
+                *idexo);
+        ex_err("expnp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read node set parameters
+ */
+% void
+% exgnp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_id,       /* node set ID */
+%      int *num_nodes_in_set,  /* returned number of nodes in the node set */
+%      int *num_dist_in_set,   /* number of dist factors in the node set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_node_set_param(*idexo,*node_set_id,
+                              num_nodes_in_set, num_dist_in_set) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node set parameters from file id %d",
+                *idexo);
+        ex_err("exgnp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write node set
+ */
+% void
+% expns (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_id,       /* node set ID */
+%      int *node_set_node_list,/* node list for the node set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_node_set(*idexo,*node_set_id,node_set_node_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store node set in file id %d",
+                *idexo);
+        ex_err("expns",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write node set dist factors
+ */
+% void
+% expnsd (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_id,       /* node set ID */
+%      real *node_set_dist_fact, /* distribution factors for the node set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if(ex_put_node_set_dist_fact(*idexo,*node_set_id, node_set_dist_fact) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store node set dist factors in file id %d",
+                *idexo);
+        ex_err("expnsd",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read node set
+ */
+% void
+% exgns (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_id,       /* node set ID */
+%      int *node_set_node_list,/* returned node list for the node set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_node_set(*idexo,*node_set_id,node_set_node_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node set from file id %d",
+                *idexo);
+        ex_err("exgns",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read node set dist factors
+ */
+% void
+% exgnsd (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_id,       /* node set ID */
+%      real *node_set_dist_fact, /* returned distribution factors for the */
+%                                 /* node set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if(ex_get_node_set_dist_fact(*idexo,*node_set_id, node_set_dist_fact) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node set dist factors from file id %d",
+                *idexo);
+        ex_err("exgnsd",errmsg,EX_MSG);
+      }
+    }
+}
+
+
+/*
+ * read node sets IDs
+ */
+% void
+% exgnsi (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_ids,      /* returned node set IDs */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_node_set_ids(*idexo,node_set_ids) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node set ids from file id %d",
+                *idexo);
+        ex_err("exgnsi",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write concatenated node sets
+ */
+% void
+% expcns (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_ids,      /* node set ID for each node set */
+%      int *num_nodes_per_set, /* number of nodes for each node node set */
+%      int *num_dist_per_set,  /* number of dist fact for each node node set */
+%      int *node_sets_node_index,/* indices into the node_set_node_list */
+%                              /* which are the locations of the first node */
+%                              /* for each node set  - 1 based */
+%      int *node_sets_dist_index,/* indices into the node_set_dist_fact which */
+%                              /* are the locations of the first dist factor */
+%                              /* for each node set  - 1 based */
+%      int *node_sets_node_list, /* concatenated list of nodes for all the */
+%                                /* node sets */
+%      real *node_sets_dist_fact, /* concatenated list of distribution factors */
+%                                /* for all node sets */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    int num_node_sets, i, *node_index_ptr, *dist_index_ptr;
+
+    *ierr = 0;
+
+    num_node_sets = ex_inquire_int(*idexo,EX_INQ_NODE_SETS);
+
+    /* allocate memory for C node index array */
+    if (!(node_index_ptr=malloc(num_node_sets*sizeof(int))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for node index array for file id %d",
+                *idexo);
+        ex_err("expcns",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory for C dist factor index array */
+    if (!(dist_index_ptr=malloc(num_node_sets*sizeof(int))))
+    {
+      free(node_index_ptr);
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for dist index array for file id %d",
+                *idexo);
+        ex_err("expcns",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    for (i=0;i<num_node_sets;i++) /* change from 1-based to 0 index */
+    {
+      node_index_ptr[i] = node_sets_node_index[i] - 1;
+      dist_index_ptr[i] = node_sets_dist_index[i] - 1;
+    }
+
+      
+
+    if (ex_put_concat_node_sets(*idexo,node_set_ids,num_nodes_per_set,
+                                 num_dist_per_set,node_index_ptr,
+                                 dist_index_ptr, node_sets_node_list,
+                                 node_sets_dist_fact) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(node_index_ptr);
+      free(dist_index_ptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store concatenated node sets in file id %d",
+                *idexo);
+        ex_err("expcns",errmsg,EX_MSG);
+      }
+      return;
+    }
+    free(node_index_ptr);
+    free(dist_index_ptr);
+}
+
+/*
+ * read concatenated node sets
+ */
+% void
+% exgcns (
+%      int *idexo,             /* EXODUS file ID */
+%      int *node_set_ids,      /* node set ID for each node set */
+%      int *num_nodes_per_set, /* number of nodes for each node node set */
+%      int *num_dist_per_set,  /* number of dist fact for each node node set */
+%      int *node_sets_node_index,/* indices into the node_set_node_list */
+%                              /* which are the locations of the first node */
+%                              /* for each node set  - 1 based */
+%      int *node_sets_dist_index,/* indices into the node_set_dist_fact which */
+%                              /* are the locations of the first dist factor */
+%                              /* for each node set  - 1 based */
+%      int *node_sets_node_list, /* concatenated list of nodes for all the */
+%                                /* node sets */
+%      real *node_sets_dist_fact, /* concatenated list of distribution factors */
+%                                /* for all node sets */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    int num_node_sets, i, *node_index_ptr, *dist_index_ptr;
+
+    *ierr = 0;
+
+    num_node_sets = ex_inquire_int(*idexo,EX_INQ_NODE_SETS);
+
+    /* allocate memory for C node  index array */
+    if (!(node_index_ptr=malloc(num_node_sets*sizeof(int))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for node index array for file id %d",
+                *idexo);
+        ex_err("exgcns",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory for C dist factor index array */
+    if (!(dist_index_ptr=malloc(num_node_sets*sizeof(int))))
+    {
+      free(node_index_ptr);
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for dist index array for file id %d",
+                *idexo);
+        ex_err("exgcns",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    if (ex_get_concat_node_sets(*idexo,node_set_ids,num_nodes_per_set,
+				num_dist_per_set,node_index_ptr,
+				dist_index_ptr,node_sets_node_list,
+				node_sets_dist_fact) == EX_FATAL)
+    {
+      free(node_index_ptr);
+      free(dist_index_ptr);
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get nodes sets from file id %d",
+                *idexo);
+        ex_err("exgcns",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    for (i=0;i<num_node_sets;i++) /* change from 0-based to 1 index */
+    {
+      node_sets_node_index[i]  = node_index_ptr[i] + 1;
+      node_sets_dist_index[i]  = dist_index_ptr[i] + 1;
+    }
+    
+    free(node_index_ptr);
+    free(dist_index_ptr);
+      
+}
+
+/*
+ * write side set parameters
+ */
+% void
+% expsp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      int *num_sides_in_set,  /* number of sides in the side set */
+%      int *num_df_in_set,     /* number of dist factors in the side set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_side_set_param(*idexo,*side_set_id,*num_sides_in_set,
+                                 *num_df_in_set) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store side set parameters in file id %d",
+                *idexo);
+        ex_err("expsp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read side set parameters
+ */
+% void
+% exgsp (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      int *num_sides_in_set,  /* returned num of sides in the side set */
+%      int *num_df_in_set,     /* returned num of dist factors in the side set*/
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_side_set_param(*idexo,*side_set_id,num_sides_in_set,
+                                 num_df_in_set) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get side set parameters from file id %d",
+                *idexo);
+        ex_err("exgsp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * get side set node list length
+ */
+% void
+% exgsnl (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      int *num_nodes_in_set,  /* returned num of sides in the side set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_side_set_node_list_len(*idexo,*side_set_id,
+				      num_nodes_in_set) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get side set node list length from file id %d",
+                *idexo);
+        ex_err("exgsnl",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write side set
+ */
+% void
+% expss (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      int *side_set_elem_list,/* element list for the side set */
+%      int *side_set_side_list,/* side list for the side set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_side_set(*idexo,*side_set_id,side_set_elem_list,
+                         side_set_side_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store side set in file id %d",
+                *idexo);
+        ex_err("expss",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read side set
+ */
+% void
+% exgss (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      int *side_set_elem_list,/* returned element list for the side set */
+%      int *side_set_side_list,/* returned side list for the side set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_side_set(*idexo,*side_set_id,side_set_elem_list,
+                         side_set_side_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get side set from file id %d",
+                *idexo);
+        ex_err("exgss",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write side set distribution factors
+ */
+% void
+% expssd (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      real *side_set_dist_fact, /* distribution factors */
+%			       /* for the side set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_side_set_dist_fact(*idexo,*side_set_id,
+                                   side_set_dist_fact) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+           "Error: failed to store side set distribution factors in file id %d",
+                *idexo);
+        ex_err("expssd",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read side set distribution factors
+ */
+% void
+% exgssd (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_id,       /* side set ID */
+%      real *side_set_dist_fact, /* returned distribution factors */
+%			       /* for the side set */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_side_set_dist_fact(*idexo,*side_set_id,
+				   side_set_dist_fact) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+           "Error: failed to get side set distribution factors from file id %d",
+                *idexo);
+        ex_err("exgssd",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read side sets IDs
+ */
+% void
+% exgssi (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_ids,      /* returned side set IDs */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_side_set_ids(*idexo,side_set_ids) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get side set ids from file id %d",
+                *idexo);
+        ex_err("exgssi",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write concatenated side sets
+ */
+% void
+% expcss (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_ids,      /* side set ID for each side set */
+%      int *num_elem_per_set,  /* number of elements for each side set */
+%      int *num_dist_per_set,  /* number of dist factors  for each side set */
+%      int *side_sets_elem_index,/* indices into the side_set_elem_list which */
+%                                /* are the locations of the first element for*/
+%                                /* each side set  - 1 based */
+%      int *side_sets_dist_index,/* indices into the side_set_dist_fact which */
+%                                /* are the locations of the first node for */
+%                                /* each side set  - 1 based */
+%      int *side_sets_elem_list, /* concatenated list of elements for all the */
+%                                /* side sets */
+%      int *side_sets_side_list, /* concatenated list of sides for all the */
+%                                /* side sets */
+%      real *side_sets_dist_fact, /* concatenated list of distribution */
+%                                /* factors for all side sets */
+%      int *ierr               /* returned error code */
+%      )
+% {
+  int num_side_sets, i, *elem_index_ptr, *dist_index_ptr;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+
+    if (exoptval & EX_DEBUG) printf("[expcss]\n");
+
+    num_side_sets = ex_inquire_int(*idexo,EX_INQ_SIDE_SETS);
+
+    /* allocate memory for C element index array */
+    if (!(elem_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+       "Error: failed to allocate space for element index array for file id %d",
+                *idexo);
+        ex_err("expcss",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory for C dist factor index array */
+    if (!(dist_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      free(elem_index_ptr);
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for dist index array for file id %d",
+                *idexo);
+        ex_err("expcss",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    for (i=0;i<num_side_sets;i++) /* change from 1-based to 0 index */
+    {
+      elem_index_ptr[i] = side_sets_elem_index[i] - 1;
+      dist_index_ptr[i] = side_sets_dist_index[i] - 1;
+    }
+
+    if (ex_put_concat_side_sets(*idexo,side_set_ids,num_elem_per_set,
+                         num_dist_per_set,elem_index_ptr,
+                         dist_index_ptr,side_sets_elem_list,
+                         side_sets_side_list,side_sets_dist_fact) == EX_FATAL)
+    {
+      free(elem_index_ptr);
+      free(dist_index_ptr);
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store concatenated side sets in file id %d",
+                *idexo);
+        ex_err("expcss",errmsg,EX_MSG);
+      }
+      return;
+    }
+    free(elem_index_ptr);
+    free(dist_index_ptr);
+}
+
+/*
+ * read concatenated side sets
+ */
+% void
+% exgcss (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_ids,      /* returned side set IDs for each side set */
+%      int *num_elem_per_set,  /* returned number of elements for each side */
+%                              /* set */
+%      int *num_dist_per_set,  /* returned number of nodes for each side set */
+%      int *side_sets_elem_index,/* returned indices into the */
+%                                /* side_set_elem_list which are the locations*/
+%                                /* of the first element for each side set */
+%      int *side_sets_dist_index,/* returned indices into the */
+%                                /* side_set_node_list which are the locations*/
+%                                /* of the first node for each side set */
+%      int *side_sets_elem_list, /* returned concatenated list of elements for*/
+%                                /* all the side sets */
+%      int *side_sets_side_list, /* returned concatenated list of nodes for */
+%                                /* all the side sets */
+%      real *side_sets_dist_fact, /* returned concatenated list of */
+%                                /* distribution factors for all side sets */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    int i, num_side_sets, *elem_index_ptr, *dist_index_ptr;
+
+    *ierr = 0;
+
+    num_side_sets = ex_inquire_int(*idexo,EX_INQ_SIDE_SETS);
+
+    /* allocate memory for C elem index array */
+    if (!(elem_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+       "Error: failed to allocate space for element index array for file id %d",
+                *idexo);
+        ex_err("exgcss",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory for C dist factor index array */
+    if (!(dist_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      free(elem_index_ptr);
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for dist index array for file id %d",
+                *idexo);
+        ex_err("exgcss",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+/*    printf("[exgcss] calling ex_get_side_set ...\n");
+    printf("[exgcss] loc side_set_ids: %ld\n",side_set_ids);
+    printf("[exgcss] loc num_elem_per_set: %ld\n",num_elem_per_set);
+    printf("[exgcss] loc num_nodes_per_set: %ld\n",num_nodes_per_set);
+    printf("[exgcss] loc side_sets_node_index: %ld\n",side_sets_node_index);
+    printf("[exgcss] loc side_sets_elem_index: %ld\n",side_sets_elem_index);
+    printf("[exgcss] loc side_sets_node_list: %ld\n",side_sets_node_list);
+    printf("[exgcss] loc side_sets_elem_list: %ld\n",side_sets_elem_list);
+    printf("[exgcss] loc side_sets_dist_fact: %ld\n",side_sets_dist_fact); */
+
+    if (ex_get_concat_side_sets(*idexo,side_set_ids,num_elem_per_set,
+                         num_dist_per_set,elem_index_ptr,
+                         dist_index_ptr,side_sets_elem_list,
+                         side_sets_side_list,side_sets_dist_fact) == EX_FATAL)
+    {
+      free (elem_index_ptr);
+      free (dist_index_ptr);
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get concatenated side sets from file id %d",
+                *idexo);
+        ex_err("exgcss",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    for (i=0;i<num_side_sets;i++) /* change from 0-based to 1 index */
+    {
+      side_sets_elem_index[i] = elem_index_ptr[i] + 1;
+      side_sets_dist_index[i] = dist_index_ptr[i] + 1;
+/* First walk element index array */
+  /*  printf("[exgcss] # of elem per side set[%d]: %d\n",i,num_elem_per_set[i]);
+      printf("[exgcss] elem index[%d]: %d\n",i,side_sets_elem_index[i]); */
+/* Then walk node index array */
+  /*  printf("[exgcss] # of nodes per side set: %d\n",num_nodes_per_set[i]);
+      printf("[exgcss] node index[%d]: %d\n",i,side_sets_node_index[i]); */
+    }
+    free (elem_index_ptr);
+    free (dist_index_ptr);
+}
+
+/*
+ * read concatenated side sets (no dist factors)
+ */
+% void
+% exgcssf (
+%      int *idexo,             /* EXODUS file ID */
+%      int *side_set_ids,      /* returned side set IDs for each side set */
+%      int *num_elem_per_set,  /* returned number of elements for each side */
+%                              /* set */
+%      int *num_dist_per_set,  /* returned number of nodes for each side set */
+%      int *side_sets_elem_index,/* returned indices into the */
+%                                /* side_set_elem_list which are the locations*/
+%                                /* of the first element for each side set */
+%      int *side_sets_dist_index,/* returned indices into the */
+%                                /* side_set_node_list which are the locations*/
+%                                /* of the first node for each side set */
+%      int *side_sets_elem_list, /* returned concatenated list of elements for*/
+%                                /* all the side sets */
+%      int *side_sets_side_list, /* returned concatenated list of nodes for */
+%                                /* all the side sets */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    int i, num_side_sets, *elem_index_ptr, *dist_index_ptr;
+
+    *ierr = 0;
+
+    num_side_sets = ex_inquire_int(*idexo,EX_INQ_SIDE_SETS);
+
+    /* allocate memory for C elem index array */
+    if (!(elem_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+       "Error: failed to allocate space for element index array for file id %d",
+                *idexo);
+        ex_err("exgcss",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory for C dist factor index array */
+    if (!(dist_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      free(elem_index_ptr);
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for dist index array for file id %d",
+                *idexo);
+        ex_err("exgcss",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    if (ex_get_concat_side_sets(*idexo,side_set_ids,num_elem_per_set,
+                         num_dist_per_set,elem_index_ptr,
+                         dist_index_ptr,side_sets_elem_list,
+                         side_sets_side_list,0) == EX_FATAL)
+    {
+      free (elem_index_ptr);
+      free (dist_index_ptr);
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get concatenated side sets from file id %d",
+                *idexo);
+        ex_err("exgcss",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    for (i=0;i<num_side_sets;i++) /* change from 0-based to 1 index */
+    {
+      side_sets_elem_index[i] = elem_index_ptr[i] + 1;
+      side_sets_dist_index[i] = dist_index_ptr[i] + 1;
+    }
+    free (elem_index_ptr);
+    free (dist_index_ptr);
+}
+
+/*
+ * write results variables parameters
+ */
+% void
+% expvp (
+%      int *idexo,             /* EXODUS file ID */
+%      string var_type,        /* (single) character indicating the type of */
+%                              /* variable which is described */
+%      int *num_vars,          /* number of var_type variables */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_var_param(*idexo,var_type,*num_vars) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+            "Error: failed to store results variables parameters in file id %d",
+                *idexo);
+        ex_err("expvp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read results variables parameters
+ */
+% void
+% exgvp (
+%      int *idexo,             /* EXODUS file ID */
+%      string var_type,        /* (single) character indicating the type of */
+%                              /* variable which is described */
+%      int *num_vars,          /* returned number of var_type variables */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_var_param(*idexo,var_type,num_vars) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+            "Error: failed to get results variables parameters from file id %d",
+                *idexo);
+        ex_err("exgvp",errmsg,EX_MSG);
+      }
+    }
+    /** if (exoptval & EX_DEBUG) 
+        printf("[exgvp] # of vars for type %c: %d\n",
+                         *var_type,*num_vars); **/
+}
+
+/*
+ * write results variables names
+ */
+% void
+% expvan (
+%      int *idexo,             /* EXODUS file ID */
+%      string var_type,        /* (single) character indicating the type of */
+%                              /* variables which is described */
+%      int *num_vars,          /* number of var_type variables to be written */
+%      string var_names,       /* string containing num_vars variable names */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (var_nameslen < slen)
+    {
+      slen = var_nameslen;
+    }
+
+    /* allocate memory for pointer array */
+    if (!(aptr=malloc((*num_vars+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to allocate space for variable names ptr array for file id %d",
+                *idexo);
+        ex_err("expvan",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the variable names */
+    if (!(sptr=malloc(*num_vars*(slen+1)*sizeof(char))))
+    { 
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+     "Error: failed to allocate space for variable names buffer for file id %d",
+                *idexo);
+        ex_err("expvan",errmsg,EX_MEMFAIL);
+      }
+      free(aptr);        /* Free up string ptr array */	
+      *ierr = EX_MEMFAIL;
+      return;
+    }
+    /* Copy Fortran variable names to staging space */
+    for (i=0;i<*num_vars;i++)
+    {
+      *(aptr+i) = sptr+i*(slen+1);		/* put address into ptr array */
+      ex_fstrncpy(*(aptr+i),var_names+i*var_nameslen,slen);/* copy string into buffer */
+    }
+    *(aptr+i) = 0; /* null out last ptr */
+    /* do ExodusII C call to write results variables names */
+    if (ex_put_var_names(*idexo,var_type,*num_vars,aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store results variables names in file id %d",
+                *idexo);
+        ex_err("expvan",errmsg,EX_MSG);
+      }
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+}
+/*
+ * read results variables names
+ */
+% void
+% exgvan (
+%      int *idexo,             /* EXODUS file ID */
+%      string var_type,        /* (single) character indicating the type of */
+%                              /* variable which is described */
+%      int *num_vars,          /* number of var_type variables to be read */
+%      string var_names,       /* returned string containing num_vars variable*/
+%                              /* names */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char **aptr;/* ptr to temp staging space for string array ptrs */
+    char *sptr; /* ptr to temp staging space for strings */
+    int i,slen;
+
+    *ierr=0;     /* default no errror */
+
+    /**if (exoptval & EX_DEBUG) 
+	printf("[exgvan] # of variable names: %d\n",*num_vars); **/
+
+    slen = ex_max_name_length;	/* max str size */
+    if (var_nameslen < slen)
+    {
+      slen = var_nameslen;
+    }
+
+    /* allocate memory to for pointer array */
+    if (!(aptr=malloc((*num_vars+1)*sizeof(char *))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+                "Error: failed to allocate space for results variable names ptr array for file id %d",
+                *idexo);
+        ex_err("exgvan",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Allocate staging space for the variable names */
+    if (!(sptr=malloc(*num_vars*(slen+1)*sizeof(char))))
+    { 
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for results variable names for file id %d",
+                *idexo);
+        ex_err("exgvan",errmsg,EX_MEMFAIL);
+      }
+      free(aptr);        /* Free up string ptr array */	
+      return;
+    }
+    for (i=0;i<*num_vars;i++)
+      *(aptr+i) = sptr+i*(slen+1);              /* put address into ptr array */
+    *(aptr+i) = 0; /* null out last ptr */
+
+    /* do ExodusII C call to read results variables names */
+    if (ex_get_var_names(*idexo,var_type,*num_vars,aptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);	/* free up allocated space */  
+      free(aptr);
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get results variable names from file id %d",
+                *idexo);
+        ex_err("exgvan",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    /* Copy Fortran variable names to staging space */
+    memset(var_names, 0, *num_vars*var_nameslen);
+    for (i=0;i<*num_vars;i++)
+    {
+      /** printf("[exgvan] var_name(%d): %s\n",i,*(aptr+i)); **/
+      ex_fcdcpy(var_names+i*var_nameslen,slen,*(aptr+i));/* copy str into Fortran buffer */
+    }
+
+    free(sptr);	/* Free up string staging area */
+    free(aptr);        /* Free up string ptr array */	
+}
+
+/*
+ * write element variable truth table
+ */
+% void
+% expvtt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *num_elem_blk,      /* number of element blocks */
+%      int *num_elem_var,      /* number of element variables */
+%      int *elem_var_tab,      /* element variable truth table 2D array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    /** printf("[expvtt] # elem blks: %d, # elem vars: %d\n",
+                       *num_elem_blk,*num_elem_var); **/
+    *ierr = 0;
+
+    if (ex_put_elem_var_tab(
+          *idexo,*num_elem_blk,*num_elem_var,elem_var_tab) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+            "Error: failed to store element variable truth table in file id %d",
+                *idexo);
+        ex_err("expvtt",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * write nodeset variable truth table
+ */
+% void
+% expnstt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *num_entity,        /* number of entity  blocks */
+%      int *num_var,           /* number of variables */
+%      int *var_tab,           /* entity variable truth table 2D array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_put_nset_var_tab(
+          *idexo,*num_entity,*num_var,var_tab) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+            "Error: failed to store nodeset variable truth table in file id %d",
+                *idexo);
+        ex_err("expnstt",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * write sideset variable truth table
+ */
+% void
+% expsstt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *num_entity,        /* number of entity  blocks */
+%      int *num_var,           /* number of variables */
+%      int *var_tab,           /* entity variable truth table 2D array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_put_sset_var_tab(
+          *idexo,*num_entity,*num_var,var_tab) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+            "Error: failed to store sideset variable truth table in file id %d",
+                *idexo);
+        ex_err("expsstt",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * read element variable truth table
+ */
+% void
+% exgvtt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *num_elem_blk,      /* number of element blocks */
+%      int *num_elem_var,      /* number of element variables */
+%      int *elem_var_tab,      /* returned element variable truth table array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+
+    if (ex_get_elem_var_tab(
+          *idexo,*num_elem_blk,*num_elem_var,elem_var_tab) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to failed to get element variable truth table from file id %d",
+                *idexo);
+        ex_err("exgvtt",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * read nodeset variable truth table
+ */
+% void
+% exgnstt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *num_entity,        /* number of entity blocks */
+%      int *num_var,           /* number of variables */
+%      int *var_tab,           /* returned variable truth table array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+
+    if (ex_get_nset_var_tab(
+          *idexo,*num_entity,*num_var,var_tab) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to failed to get nodeset variable truth table from file id %d",
+                *idexo);
+        ex_err("exgnstt",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * read sideset variable truth table
+ */
+% void
+% exgsstt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *num_entity,        /* number of entity blocks */
+%      int *num_var,           /* number of variables */
+%      int *var_tab,           /* returned variable truth table array */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+
+    if (ex_get_sset_var_tab(
+          *idexo,*num_entity,*num_var,var_tab) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+  "Error: failed to failed to get sideset variable truth table from file id %d",
+                *idexo);
+        ex_err("exgsstt",errmsg,EX_MSG);
+      }
+      return;
+    }
+}
+
+/*
+ * write global variable values at time step
+ */
+% void
+% expgv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *num_glob_vars,     /* number of global variables */
+%      real *glob_var_vals,   /* array of global variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+    if (ex_put_glob_vars(*idexo,*time_step,*num_glob_vars,glob_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store global variables in file id %d",
+                *idexo);
+        ex_err("expvg",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read global variable values at a time step
+ */
+% void
+% exggv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *num_glob_vars,     /* number of global variables */
+%      real *glob_var_vals,   /* returned array of global variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+    if (ex_get_glob_vars(*idexo,*time_step,*num_glob_vars,glob_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get global variables from file id %d",
+                *idexo);
+        ex_err("exggv",errmsg,EX_MSG);
+      }
+
+    }
+}
+
+/*
+ * read global variable values through time
+ */
+% void
+% exggvt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *glob_var_index,    /* index of desired global variable */
+%      int *beg_time_step,     /* first time step for which value is desired */
+%      int *end_time_step,     /* last time step for which value is desired */
+%      real *glob_var_vals,   /* returned array of global variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_glob_var_time(*idexo,
+                             *glob_var_index,
+                             *beg_time_step,
+                             *end_time_step,
+                             glob_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+              "Error: failed to get global variables thru time from file id %d",
+                *idexo);
+        ex_err("exggvt",errmsg,EX_MSG);
+      }
+
+    }
+}
+
+/*
+ * write nodal variable values at a time step
+ */
+% void
+% expnv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *nodal_var_index,   /* index of nodal variable */
+%      int *num_nodes,         /* number of nodal points */
+%      real *nodal_var_vals,  /* array of nodal variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_nodal_var(*idexo,
+                         *time_step,
+                         *nodal_var_index,
+                         *num_nodes,
+                         nodal_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store nodal variables in file id %d",
+                *idexo);
+        ex_err("expnv",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read nodal variable values at a time step
+ */
+% void
+% exgnv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *nodal_var_index,   /* index of nodal variable */
+%      int *num_nodes,         /* number of nodal points */
+%      real *nodal_var_vals,  /* returned array of nodal variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_nodal_var(*idexo,
+                         *time_step,
+                         *nodal_var_index,
+                         *num_nodes,
+                         nodal_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+         "Error: failed to get nodal variables at time step %d from file id %d",
+                *time_step,*idexo);
+        ex_err("exgnv",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read nodal variable values through time
+ */
+% void
+% exgnvt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *nodal_var_index,   /* index of nodal variable */
+%      int *node_number,       /* number of desired node */
+%      int *beg_time_step,     /* first time step for which value is desired */
+%      int *end_time_step,     /* last time step for which value is desired */
+%      real *nodal_var_vals,  /* returned array of nodal variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_nodal_var_time(*idexo,
+                             *nodal_var_index,
+                             *node_number,
+                             *beg_time_step,
+                             *end_time_step,
+                             nodal_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get nodal variables thru time from file id %d",
+                *idexo);
+        ex_err("exgnvt",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write element variable values at a time step
+ */
+% void
+% expev (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *elem_var_index,    /* index of element variable */
+%      int *elem_blk_id,       /* element block ID */
+%      int *num_elem_this_blk, /* number of elements in this element block */
+%      real *elem_var_vals,   /* array of element variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_elem_var(*idexo,
+                        *time_step,
+                        *elem_var_index,
+                        *elem_blk_id,
+                        *num_elem_this_blk,
+                        elem_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element variables in file id %d",
+                *idexo);
+        ex_err("expev",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read element variable values at a time step
+ */
+% void
+% exgev (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *elem_var_index,    /* index of element variable */
+%      int *elem_blk_id,       /* element block ID */
+%      int *num_elem_this_blk, /* number of elements in this element block */
+%      real *elem_var_vals,   /* returned array of element variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_elem_var(*idexo,
+                        *time_step,
+                        *elem_var_index,
+                        *elem_blk_id,
+                        *num_elem_this_blk,
+                        elem_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element variables from file id %d",
+                *idexo);
+        ex_err("exgev",errmsg,EX_MSG);
+      }
+
+      if (exoptval & EX_DEBUG)
+        ex_err("exgev"," error reading element variables",EX_MSG);
+    }
+}
+
+/*
+ * read element variable values through time
+ */
+% void
+% exgevt (
+%      int *idexo,             /* EXODUS file ID */
+%      int *elem_var_index,    /* index of element variable */
+%      int *elem_number,       /* number of desired element */
+%      int *beg_time_step,     /* first time step for which value is desired */
+%      int *end_time_step,     /* last time step for which value is desired */
+%      real *elem_var_vals,   /* returned element variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_elem_var_time(*idexo,
+                             *elem_var_index,
+                             *elem_number,
+                             *beg_time_step,
+                             *end_time_step,
+                             elem_var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+             "Error: failed to get element variables thru time from file id %d",
+                *idexo);
+        ex_err("exgevt",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write nodeset variable values at a time step
+ */
+% void
+% expnsv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *var_index,         /* index of variable */
+%      int *entity_id,         /* entity ID */
+%      int *num_entity,        /* number of entities in this entity block */
+%      real *var_vals,         /* array of variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_nset_var(*idexo,
+                        *time_step,
+                        *var_index,
+                        *entity_id,
+                        *num_entity,
+                        var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store nodeset variables in file id %d",
+                *idexo);
+        ex_err("expnsv",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read nodeset variable values at a time step
+ */
+% void
+% exgnsv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *var_index,         /* index of variable */
+%      int *entity_id,         /* entity ID */
+%      int *num_entity,        /* number of entities in this entity block */
+%      real *var_vals,         /* returned array of variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_nset_var(*idexo,
+                        *time_step,
+                        *var_index,
+                        *entity_id,
+                        *num_entity,
+                        var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get nodeset variables from file id %d",
+                *idexo);
+        ex_err("exgnsv",errmsg,EX_MSG);
+      }
+
+      if (exoptval & EX_DEBUG)
+        ex_err("exgnsv"," error reading nodeset variables",EX_MSG);
+    }
+}
+
+/*
+ * write sideset variable values at a time step
+ */
+% void
+% expssv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *var_index,         /* index of variable */
+%      int *entity_id,         /* entity ID */
+%      int *num_entity,        /* number of entities in this entity block */
+%      real *var_vals,         /* array of variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_sset_var(*idexo,
+                        *time_step,
+                        *var_index,
+                        *entity_id,
+                        *num_entity,
+                        var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store sideset variables in file id %d",
+                *idexo);
+        ex_err("expssv",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read sideset variable values at a time step
+ */
+% void
+% exgssv (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* time step number */
+%      int *var_index,         /* index of variable */
+%      int *entity_id,         /* entity ID */
+%      int *num_entity,        /* number of entities in this entity block */
+%      real *var_vals,         /* returned array of variable values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_sset_var(*idexo,
+                        *time_step,
+                        *var_index,
+                        *entity_id,
+                        *num_entity,
+                        var_vals) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get sideset variables from file id %d",
+                *idexo);
+        ex_err("exgssv",errmsg,EX_MSG);
+      }
+
+      if (exoptval & EX_DEBUG)
+        ex_err("exgssv"," error reading sideset variables",EX_MSG);
+    }
+}
+
+/*
+ * write time value for a time step
+ */
+% void
+% exptim (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* the time step number */
+%      real *time_value,      /* simulation time value */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_time(*idexo,*time_step,time_value) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store time step value in file id %d",
+                *idexo);
+        ex_err("exptim",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read time value for a time step
+ */
+% void
+% exgtim (
+%      int *idexo,             /* EXODUS file ID */
+%      int *time_step,         /* the time step number */
+%      real *time_value,      /* returned simulation time value */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_time(*idexo,*time_step,time_value) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get time step value from file id %d",
+                *idexo);
+        ex_err("exgtim",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read all time values
+ */
+% void
+% exgatm (
+%      int *idexo,             /* EXODUS file ID */
+%      real *time_values,     /* returned simulation time values */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_get_all_times(*idexo,time_values) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get time step values from file id %d",
+                *idexo);
+        ex_err("exgatm",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * inquire EXODUS parameters
+ */
+% void
+% exinq (
+%      int *idexo,             /* EXODUS file ID */
+%      int *req_info,          /* flag designating what information is */
+%                              /* requested */
+%      int *ret_int,           /* returned integer, if integer value requested*/
+%      float *ret_float,       /* returned real, if real value requested */
+%      string ret_char,        /* returned string, if string value requested */
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+
+    *ierr = 0;
+    if (ex_inquire(*idexo,(ex_inquiry)*req_info,ret_int,ret_float,ret_char) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get requested parameter from file id %d",
+                *idexo);
+        ex_err("exinq",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * convert side set node lists to side set side lists
+ */
+% void
+% excn2s(
+%      int *idexo,                /* EXODUS file ID */
+%      int *num_elem_per_set,     /* number of element per set
+%      int *num_nodes_per_set,    /* number of nodes per set
+%      int *side_sets_elem_index, /* index array of elements into elem list
+%      int *side_sets_node_index, /* index array of nodes
+%      int *side_sets_elem_list,  /* array of elements
+%      int *side_sets_node_list,  /* array of nodes
+%      int *side_sets_side_list,  /* array of sides/faces
+%      int *ierr                  /* returned error code */
+%      )
+% {
+
+    int i, num_side_sets, *node_index_ptr, *elem_index_ptr;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    num_side_sets = ex_inquire_int(*idexo,EX_INQ_SIDE_SETS);
+
+    /* allocate memory for C element index array */
+    if (!(elem_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+       "Error: failed to allocate space for element index array for file id %d",
+                *idexo);
+        ex_err("excn2s",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* allocate memory for C node factor index array */
+    if (!(node_index_ptr=malloc(num_side_sets*sizeof(int))))
+    {
+      free(elem_index_ptr);
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+        "Error: failed to allocate space for node index array for file id %d",
+                *idexo);
+        ex_err("excn2s",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+    /* change from 1-based to 0 index */
+    for (i=0;i<num_side_sets;i++)
+    {
+      elem_index_ptr[i] = side_sets_elem_index[i] - 1;
+      node_index_ptr[i] = side_sets_node_index[i] - 1;
+    }
+
+    if (ex_cvt_nodes_to_sides(*idexo,
+			      num_elem_per_set,
+			      num_nodes_per_set,
+			      elem_index_ptr,
+			      node_index_ptr,
+			      side_sets_elem_list,
+			      side_sets_node_list,
+			      side_sets_side_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to convert nodes to sides in file id %d",
+                *idexo);
+        ex_err("excn2s",errmsg,EX_MSG);
+      }
+    }
+    free(elem_index_ptr);
+    free(node_index_ptr);
+}
+
+/*
+ * read side set node list
+ */
+% void
+% exgssn(
+%      int *idexo,                /* EXODUS file ID */
+%      int *side_set_id,          /* side set ID */
+%      int *side_set_node_cnt_list,/* array of node counts */
+%      int *side_set_node_list,   /* array of nodes */
+%      int *ierr                  /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_get_side_set_node_list(*idexo,*side_set_id, side_set_node_cnt_list,
+                                  side_set_node_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get nodes for side set %d in file id %d",
+                *side_set_id, *idexo);
+        ex_err("exgssn",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read side set node count
+ */
+% void
+% exgssc(
+%      int *idexo,                /* EXODUS file ID */
+%      int *side_set_id,          /* side set ID */
+%      int *side_set_node_cnt_list,/* array of node counts */
+%      int *ierr                  /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_get_side_set_node_count(*idexo,*side_set_id, side_set_node_cnt_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node counts for side set %d in file id %d",
+                *side_set_id, *idexo);
+        ex_err("exgssc",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read concatenated side set node count
+ */
+% void
+% exgcssc(
+%      int *idexo,                /* EXODUS file ID */
+%      int *side_set_node_cnt_list,/* array of node counts */
+%      int *ierr                  /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+    *ierr = 0;
+
+    if (ex_get_concat_side_set_node_count(*idexo, side_set_node_cnt_list) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node counts for side sets in file id %d", *idexo);
+        ex_err("exgcssc",errmsg,EX_MSG);
+      }
+    }
+}
+
+/* ex_get_coordinate_frames -- read coordinate frames */
+% void
+% exgfrm (
+%    int  *idexo,
+%    int  *nframeo,
+%    int  *cfids,
+%    real *coord,
+%    int  *tags,
+%    int  *ierr
+%    )
+% {
+  int i;
+  char *ctags = NULL;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  /* Determine number of coordinate frames stored in file */
+  int nframe = ex_inquire_int(*idexo, EX_INQ_COORD_FRAMES);
+
+  if (nframe != *nframeo) {
+     *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG) {
+	sprintf(errmsg,
+		"Error: nframe argument (%d) does not match number found on file (%d) from file id %d",
+		*nframeo, nframe, *idexo);
+	ex_err("exgfrm",errmsg,EX_MSG);
+      }
+    return;
+  }
+
+  /* Create array of characters to store tags... */
+  if (nframe > 0) {
+    if (!(ctags = calloc(nframe, sizeof(char)))) {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG) {
+	sprintf(errmsg,
+		"Error: failed to allocate space for node index array for file id %d",
+		*idexo);
+	ex_err("exgfrm",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    *ierr = 0;
+    
+    if (ex_get_coordinate_frames (*idexo, &nframe, cfids, coord, ctags) == EX_FATAL) {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG) {
+	sprintf(errmsg,
+		"Error: failed to get coordinate frames from file id %d",
+		*idexo);
+	ex_err("exgfrm",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    /* Convert character tags back to integer tags for fortran */
+    for (i = 0; i < nframe; i++) {
+      if (ctags[i] == 'R' || ctags[i] == 'r')
+	tags[i] = EX_CF_RECTANGULAR;
+      else if (ctags[i] == 'C' || ctags[i] == 'c')
+	tags[i] = EX_CF_CYLINDRICAL;
+      else if (ctags[i] == 'S' || ctags[i] == 's')
+	tags[i] = EX_CF_SPHERICAL;
+    }
+    free(ctags);
+  }
+}
+
+/* ex_put_coordinate_frames -- define/write coordinate frames */
+% void
+% expfrm (
+%    int  *idexo,
+%    int  *nframe,
+%    int  *cfids,
+%    real *coord,
+%    int  *tags,
+%    int  *ierr
+%    )
+% {
+  int i;
+  char *ctags = NULL;
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  /* Create array of characters to store tags... */
+  if (*nframe > 0) {
+    if (!(ctags = calloc(*nframe, sizeof(char)))) {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG) {
+	sprintf(errmsg,
+		"Error: failed to allocate space for node index array for file id %d",
+		*idexo);
+	ex_err("exgfrm",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* Convert fortran integer tags to C API character tags */
+    for (i = 0; i < *nframe; i++) {
+      if (tags[i] == EX_CF_RECTANGULAR)
+	ctags[i] = 'R';
+      else if (tags[i] == EX_CF_CYLINDRICAL)
+        ctags[i] = 'C';
+      else if (tags[i] == EX_CF_SPHERICAL)
+        ctags[i] = 'S';
+    }
+
+    *ierr = 0;
+
+    if (ex_put_coordinate_frames (*idexo, *nframe, cfids, coord, ctags) == EX_FATAL) {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG) {
+	sprintf(errmsg,
+		"Error: failed to define/write coordinate frames in file id %d",
+		*idexo);
+	ex_err("expfrm",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    free(ctags);
+  }
+}
+
+
+/* Routine to return floating point word size */
+% int 
+% excpws ()
+% {
+  return (ex_get_cpu_ws());
+}
+
+/* Routine to return large model setting */
+% int 
+% exlgmd (
+%      int *idexo
+%      )
+% {
+  return (ex_large_model(*idexo));
+}
+
+
+/* Generalized error handling function */
+% void
+% exerr (
+%      string pname,            /* procedure name */
+%      string err_string,	/* error message string */
+%      int *errcode             /* error code */
+%      )
+% {
+
+    char *proc_name, *error_string;
+    if (!(proc_name = malloc((pnamelen+1)*sizeof(char))))
+    {
+      ex_err("exerr","Error: failed to allocate space for process name buffer",
+              EX_MEMFAIL);
+      return;
+    }
+    if (!(error_string = malloc((err_stringlen+1)*sizeof(char))))
+    {
+      free(proc_name);
+      ex_err("exerr","Error: failed to allocate space for error msg buffer",
+              EX_MEMFAIL);
+      return;
+    }
+    ex_fstrncpy(proc_name,pname,pnamelen);
+    ex_fstrncpy(error_string,err_string,err_stringlen);
+    ex_err(proc_name,error_string,*errcode);
+    free(proc_name);
+    free(error_string);
+}
+
+/* Error message reporting options setting function */
+% void
+% exopts (
+%      int *option_val		/* option value */
+%      int *ierr                /* error return code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  *ierr = 0;
+  ex_opts((ex_options)*option_val);
+  if (exerrval != 0)
+  {
+    *ierr = EX_FATAL;
+    if (exoptval & EX_DEBUG)
+    {
+      sprintf(errmsg,
+             "Error: failed to set error reporting option to %d",
+              *option_val);
+      ex_err("exopts",errmsg,EX_MSG);
+    }
+  }
+}
+
+% void
+% exmxnm (
+%      int *idexo,       /* EXODUS file ID */
+%      int *length,	/* max length of names */
+%      int *ierr        /* error return code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  *ierr = ex_set_max_name_length(*idexo, *length);
+  if (*ierr != 0)
+  {
+    *ierr = EX_FATAL;
+    if (exoptval & EX_DEBUG)
+    {
+      sprintf(errmsg,
+             "Error: failed to set maximum name length to %d",
+              *length);
+      ex_err("exmxnm",errmsg,EX_MSG);
+    }
+  }
+}
+
+/*
+ * copy EXODUS file
+ */
+% void
+% excopy (
+%      int *idexo_in,            /* input EXODUS file ID */
+%      int *idexo_out,           /* output EXODUS file ID */
+%      int *ierr                 /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_copy (*idexo_in, *idexo_out) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to copy EXODUS file id %d to file id %d",
+                *idexo_in, *idexo_out);
+        ex_err("excopy",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * get element map
+ */
+% void
+% exgem (
+%      int *idexo,            /* EXODUS file ID */
+%      int *map_id,           /* element map ID */
+%      int *elem_map,         /* returned element map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    *ierr = ex_get_elem_map (*idexo, *map_id, elem_map);
+    if (*ierr < 0)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element map from file id %d",
+                *idexo);
+        ex_err("exgem",errmsg,EX_MSG);
+      }
+    }
+}
+/*
+ * get partial_element map
+ */
+% void
+% exgpem (
+%      int *idexo,            /* EXODUS file ID */
+%      int *map_id,           /* element map ID */
+%      int *start,            /* starting entity */
+%      int *count,            /* number to read */
+%      int *elem_map,         /* returned element map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    *ierr = ex_get_partial_elem_map (*idexo, *map_id, *start, *count, elem_map);
+    if (*ierr < 0)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get partial element map from file id %d",
+                *idexo);
+        ex_err("exgem",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * get element number map
+ */
+% void
+% exgenm (
+%      int *idexo,            /* EXODUS file ID */
+%      int *elem_map,         /* returned element order map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    *ierr = ex_get_elem_num_map (*idexo, elem_map);
+    if (*ierr < 0)
+/*    if (ex_get_elem_num_map (*idexo, elem_map) == -1) */
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get element number map from file id %d",
+                *idexo);
+        ex_err("exgenm",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * get map parameters
+ */
+% void
+% exgmp (
+%      int *idexo,            /* EXODUS file ID */
+%      int *num_node_maps,    /* returned number of node maps */
+%      int *num_elem_maps,    /* returned number of element maps */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    *ierr = ex_get_map_param (*idexo, num_node_maps, num_elem_maps);
+    if (*ierr < 0)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get map parameters from file id %d",
+                *idexo);
+        ex_err("exgmp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * get node map
+ */
+% void
+% exgnm (
+%      int *idexo,            /* EXODUS file ID */
+%      int *map_id,           /* node map ID */
+%      int *node_map,         /* returned node map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    *ierr = ex_get_node_map (*idexo, *map_id, node_map);
+    if (*ierr < 0)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node map from file id %d",
+                *idexo);
+        ex_err("exgem",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * get node number map
+ */
+% void
+% exgnnm (
+%      int *idexo,            /* EXODUS file ID */
+%      int *node_map,         /* returned node order map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    *ierr = ex_get_node_num_map (*idexo, node_map);
+    if (*ierr < 0) 
+/*    if (ex_get_node_num_map (*idexo, node_map) == -1) */
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get node number map from file id %d",
+                *idexo);
+        ex_err("exgnnm",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * read results variables names
+ */
+% void
+% exgvnm (
+%      int *idexo,             /* EXODUS file ID */
+%      string var_type,        /* (single) character indicating the type of */
+%                              /* variable which is described */
+%      int *var_index          /* variable index to be read */
+%      string var_name,        /* returned string containing variable name */ 
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr; /* ptr to temp staging space for string */
+    int slen;
+    *ierr=0;     /* default no errror */
+
+    slen = ex_max_name_length;      /* max str size */
+    if (var_namelen < slen)
+    {
+      slen = var_namelen;
+    }
+
+    /* Allocate staging space for the variable name */
+    if (!(sptr=malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for results variable name for file id %d",
+                *idexo);
+        ex_err("exgvnm",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    /* do ExodusII C call to read results variables names */
+    if (ex_get_var_name(*idexo,var_type,*var_index,sptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);       /* free up allocated space */
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get results variable name from file id %d",
+                *idexo);
+        ex_err("exgvnm",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    /* Copy Fortran variable names to staging space */
+    /** printf("[exgvnm] var_name(%d): %s\n",*var_index,sptr)); **/
+    memset(var_name, 0, var_namelen);
+    ex_fcdcpy(var_name,slen,sptr);/* copy string into Fortran buffer */
+
+    free(sptr); /* Free up string staging area */
+}
+
+/*
+ * put element map
+ */
+% void
+% expem (
+%      int *idexo,            /* EXODUS file ID */
+%      int *map_id,           /* element map ID */
+%      int *elem_map,         /* element map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_elem_map (*idexo, *map_id, elem_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element map in file id %d",
+                *idexo);
+        ex_err("expem",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * put partial element map
+ */
+% void
+% exppem (
+%      int *idexo,            /* EXODUS file ID */
+%      int *map_id,           /* element map ID */
+%      int *start,            /* starting entity */
+%      int *count,            /* number to write */
+%      int *elem_map,         /* element map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_partial_elem_map (*idexo, *map_id, *start, *count, elem_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element map in file id %d",
+                *idexo);
+        ex_err("expem",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * put element number map
+ */
+% void
+% expenm (
+%      int *idexo,            /* EXODUS file ID */
+%      int *elem_map,         /* element order map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_elem_num_map (*idexo, elem_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store element number map in file id %d",
+                *idexo);
+        ex_err("expenm",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * put map parameters
+ */
+% void
+% expmp (
+%      int *idexo,            /* EXODUS file ID */
+%      int *num_node_maps,    /* number of node maps */
+%      int *num_elem_maps,    /* number of element maps */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_map_param (*idexo, *num_node_maps, *num_elem_maps) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to put map parameters in file id %d",
+                *idexo);
+        ex_err("expmp",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * put node map
+ */
+% void
+% expnm (
+%      int *idexo,            /* EXODUS file ID */
+%      int *map_id,           /* node map ID */
+%      int *node_map,         /* node map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_node_map (*idexo, *map_id, node_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store node map in file id %d",
+                *idexo);
+        ex_err("expnm",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * put node number map
+ */
+% void
+% expnnm (
+%      int *idexo,            /* EXODUS file ID */
+%      int *node_map,         /* node order map */
+%      int *ierr              /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    *ierr = 0;
+    if (ex_put_node_num_map (*idexo, node_map) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to store node number map in file id %d",
+                *idexo);
+        ex_err("expnnm",errmsg,EX_MSG);
+      }
+    }
+}
+
+/*
+ * write results variable name
+ */
+% void
+% expvnm (
+%      int *idexo,             /* EXODUS file ID */
+%      string var_type,        /* (single) character indicating the type of */
+%                              /* variable which is described */
+%      int *var_index          /* variable index to be read */
+%      string var_name,        /* string containing variable name */ 
+%      int *ierr               /* returned error code */
+%      )
+% {
+
+  char errmsg[MAX_ERR_LENGTH];
+
+
+    char *sptr; /* ptr to temp staging space for string */
+    int slen;
+    *ierr=0;     /* default no errror */
+
+    slen = ex_inquire_int(*idexo, EX_INQ_DB_MAX_ALLOWED_NAME_LENGTH);	/* max str size */
+    if (var_namelen < slen)
+    {
+      slen = var_namelen;
+    }
+
+    /* Allocate staging space for the variable name */
+    if (!(sptr=(char *)malloc((slen+1)*sizeof(char))))
+    {
+      *ierr = EX_MEMFAIL;
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+    "Error: failed to allocate space for results variable name for file id %d",
+                *idexo);
+        ex_err("expvnm",errmsg,EX_MEMFAIL);
+      }
+      return;
+    }
+
+    ex_fstrncpy(sptr,var_name,slen);/* copy string into buffer */
+
+
+    /* do ExodusII C call to write results variable name */
+    if (ex_put_var_name(*idexo,var_type,*var_index,sptr) == EX_FATAL)
+    {
+      *ierr = EX_FATAL;
+      free(sptr);       /* free up allocated space */
+      if (exoptval & EX_DEBUG)
+      {
+        sprintf(errmsg,
+               "Error: failed to get write variable name to file id %d",
+                *idexo);
+        ex_err("expvnm",errmsg,EX_MSG);
+      }
+      return;
+    }
+
+    free(sptr); /* Free up string staging area */
+}
diff --git a/exodus/forbind/test/CMakeLists.txt b/exodus/forbind/test/CMakeLists.txt
new file mode 100644
index 0000000..5d66147
--- /dev/null
+++ b/exodus/forbind/test/CMakeLists.txt
@@ -0,0 +1,40 @@
+ADD_DEFINITIONS(-DUSING_CMAKE)
+
+SET( forbind_OLDTESTS
+  testwt
+  testwtd
+  testrd
+  testrd1
+  testrdd
+  testwt1
+  testwt2
+  testwtm
+  testcp
+  testcpnl
+  testcpln
+  testwt_nsid
+  testrd_nsid
+  test_nem
+)
+
+  CONFIGURE_FILE(
+    ${CMAKE_CURRENT_SOURCE_DIR}/testall.in
+    ${CMAKE_CURRENT_BINARY_DIR}/testall
+    @ONLY
+  )
+
+  # NOTE: The "LINKER_LANGUAGE CXX" is used to workaround an issue with
+  #       the trilinos cmake adding the pamgen and pamgen_extras libraries as
+  #       a dependency.  These are C++ libraries and result in unresolved depedencies
+  #       when built with shareable libraries on some platforms....
+
+FOREACH ( testName ${forbind_OLDTESTS} )
+  ADD_EXECUTABLE( f_${testName} ${testName}.f )
+  TARGET_LINK_LIBRARIES( f_${testName} exoIIv2for )
+  SET_TARGET_PROPERTIES(f_${testName} PROPERTIES LINKER_LANGUAGE Fortran)
+ENDFOREACH ( testName )
+
+ADD_CUSTOM_TARGET( f_check
+  COMMAND /bin/csh ${CMAKE_CURRENT_BINARY_DIR}/testall
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
diff --git a/exodus/forbind/test/Imakefile b/exodus/forbind/test/Imakefile
new file mode 100644
index 0000000..0a83aba
--- /dev/null
+++ b/exodus/forbind/test/Imakefile
@@ -0,0 +1,78 @@
+### Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+### DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+### retains certain rights in this software.
+### 
+### Redistribution and use in source and binary forms, with or without
+### modification, are permitted provided that the following conditions are
+### met:
+### 
+###     * Redistributions of source code must retain the above copyright
+###       notice, this list of conditions and the following disclaimer.
+### 
+###     * Redistributions in binary form must reproduce the above
+###       copyright notice, this list of conditions and the following
+###       disclaimer in the documentation and/or other materials provided
+###       with the distribution.  
+### 
+###     * Neither the name of Sandia Corporation nor the names of its
+###       contributors may be used to endorse or promote products derived
+###       from this software without specific prior written permission.
+### 
+### THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+### "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+### LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+### A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+### OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+### SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+### LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+### DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+### THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+### (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+### OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+### 
+
+### Imakefile --- 
+
+ALTINC = -I../include
+
+#if defined CatamountArchitecture
+EXOIITEST = -L../.. -lexoIIv2for32 -lexodus
+LOCALEXO = ../../libexoIIv2for32.a ../../libexodus.a
+#else
+EXOIITEST = -L../.. -lexoIIv2for -lexodus
+LOCALEXO = ../../libexoIIv2for.a ../../libexodus.a
+#endif
+
+LIBS = $(LOCALEXO) -L$(USRLIBDIR) $(NETCDF)
+
+PROGS = testwt testwtd testrd testrd1 testrdd testwt1 testwt2 testwtm testcp testcpnl testcpln testwt_nsid testrd_nsid test_nem
+
+all:: check
+
+NormalFortranTarget(testwt,    testwt.o,    $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testwtd,   testwtd.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testrd,    testrd.o,    $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testrd1,   testrd1.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testrdd,   testrdd.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testwt1,   testwt1.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testwt2,   testwt2.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testwtm,   testwtm.o,   $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testcp,    testcp.o,    $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testcpnl,  testcpnl.o,  $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testcpln,  testcpln.o,  $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testwt_nsid, testwt_nsid.o,  $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(testrd_nsid, testrd_nsid.o,  $(LOCALEXO), /**/, $(LIBS))
+NormalFortranTarget(test_nem,  test_nem.o,  $(LOCALEXO), /**/, $(LIBS))
+
+testall: testall.in1 $(CONFIGDIR)/$(MACROFILE)
+	rm -f testall
+	$(ETCDIR)/MsubCmd +R"@<" -R">@" testall.in1 >testall
+
+test:  check
+check: $(PROGS) testall
+	csh -f ./testall
+
+ExtraStuffToClean(*.res)
+ExtraStuffToClean(*.exo)
+ExtraStuffToClean(test.output)
+ExtraStuffToClean(testall)
diff --git a/exodus/forbind/test/Makefile.standalone b/exodus/forbind/test/Makefile.standalone
new file mode 100644
index 0000000..4be820a
--- /dev/null
+++ b/exodus/forbind/test/Makefile.standalone
@@ -0,0 +1,111 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+
+EXOIITEST = -L../.. -lexoIIv2for -lexodus
+LOCALEXO = ../../libexoIIv2for.a ../../libexodus.a
+LIBS = $(LOCALEXO) $(NETCDF_LIB)
+
+PROGS = testwt testwtd testrd testrd1 testrdd testwt1 testwt2 testwtm testcp testcpnl testcpln testwt_nsid testrd_nsid test_nem
+
+all:: check
+
+testwt::     testwt.o     $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)     testwt.o   $(LIBS) $(LDFLAGS) 
+
+testwtd::    testwtd.o    $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)    testwtd.o   $(LIBS) $(LDFLAGS) 
+
+testrd::     testrd.o     $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)     testrd.o   $(LIBS) $(LDFLAGS) 
+
+testrd1::    testrd1.o    $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)    testrd1.o   $(LIBS) $(LDFLAGS) 
+
+testrdd::    testrdd.o    $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)    testrdd.o   $(LIBS) $(LDFLAGS) 
+
+testwt1::    testwt1.o    $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)    testwt1.o   $(LIBS) $(LDFLAGS) 
+
+testwt2::    testwt2.o    $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)    testwt2.o   $(LIBS) $(LDFLAGS) 
+
+testwtm::    testwtm.o    $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)    testwtm.o   $(LIBS) $(LDFLAGS) 
+
+testcp::     testcp.o     $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)     testcp.o   $(LIBS) $(LDFLAGS) 
+
+testcpnl::   testcpnl.o   $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)   testcpnl.o   $(LIBS) $(LDFLAGS) 
+
+testcpln::   testcpln.o   $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)   testcpln.o   $(LIBS) $(LDFLAGS) 
+
+testwt_nsid::  testwt_nsid.o   $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)  testwt_nsid.o   $(LIBS) $(LDFLAGS) 
+
+testrd_nsid::  testrd_nsid.o   $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)  testrd_nsid.o   $(LIBS) $(LDFLAGS) 
+
+test_nem::   test_nem.o   $(LOCALEXO)
+	$(FC) -o $@ $(FFLAGS)   test_nem.o   $(LIBS) $(LDFLAGS) 
+
+test:  check
+check: $(PROGS)
+	csh ./testall.standalone ${NCDUMP}
+
+clean::
+	rm -f *.res $(PROGS)
+
+clean::
+	rm -f *.exo
+
+clean::
+	rm -f test.output
+
+clean::
+	rm -f  *.CKP *.ln *.BAK *.bak *.o *.M *.mod core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut   "#"*
+
+.SUFFIXES: .F .f .c
+.c.o:
+	$(CC) -c $(CFLAGS) $*.c
+.f.o:
+	$(FC) -c $(FFLAGS) $*.f
+.F.o:
+	$(FC) -c $(DEFINES) $(FFLAGS) $*.F
+
+# ----------------------------------------------------------------------
+# dependencies generated by makedepend or sfmakedepend
+
diff --git a/exodus/forbind/test/exodus_unit_tests.gold b/exodus/forbind/test/exodus_unit_tests.gold
new file mode 100644
index 0000000..07bf07a
--- /dev/null
+++ b/exodus/forbind/test/exodus_unit_tests.gold
@@ -0,0 +1,20 @@
+************************************************************************
+************************************************************************
+testwt ...
+testrd ...
+testrd ... [Expect ex_create NOCLOBBER error from this test]
+testcp_ss ...
+testcpln ...
+testcpnl ...
+testwt1 ...
+testwt1 ... [Expect WEDGE6 warning from this test]
+testrd1 ...
+testrd1 ... [Expect failure locating elem var 1 for elem block 12]
+testwtd ...
+testrdd ...
+testwt2 ...
+testwt_nsid ...
+testrd_nsid ...
+test_nem ...
+************************************************************************
+************************************************************************
diff --git a/exodus/forbind/test/test-nsided.dmp b/exodus/forbind/test/test-nsided.dmp
new file mode 100644
index 0000000..2702e8d
--- /dev/null
+++ b/exodus/forbind/test/test-nsided.dmp
@@ -0,0 +1,97 @@
+netcdf test-nsided {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 33 ;
+	num_elem = 7 ;
+	num_el_blk = 1 ;
+	num_el_in_blk1 = 7 ;
+	num_nod_per_el1 = 37 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_cframes = 3 ;
+	num_cframes_9 = 27 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	int connect1(num_nod_per_el1) ;
+		connect1:elem_type = "nsided" ;
+	int ebepecnt1(num_el_in_blk1) ;
+		ebepecnt1:entity_type1 = "NODE" ;
+		ebepecnt1:entity_type2 = "ELEM" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	float frame_coordinates(num_cframes_9) ;
+	int frame_ids(num_cframes) ;
+	char frame_tags(num_cframes) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1 ;
+
+ eb_prop1 = 10 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0, 2.7, 6, 5.7, 3.7, 0, 10, 10 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2, 1.7, 1.7, 1.7, 0, 0, 0, 10 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0, 2.7, 3.3, 1.7, 2.3, 0, 0, 10 ;
+
+ eb_names =
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5, 6, 7 ;
+
+ connect1 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 
+    19, 20, 21, 22, 23, 24, 25, 26, 17, 18, 19, 20, 27, 28, 30, 29, 31, 32, 33 ;
+
+ ebepecnt1 = 4, 4, 8, 4, 6, 8, 3 ;
+
+ qa_records =
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ frame_coordinates = 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1, 1.2, 
+    1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 
+    2.8, 2.9 ;
+
+ frame_ids = 1, 11, 111 ;
+
+ frame_tags = "RCS" ;
+}
diff --git a/exodus/forbind/test/test.dmp b/exodus/forbind/test/test.dmp
new file mode 100644
index 0000000..53ae9e3
--- /dev/null
+++ b/exodus/forbind/test/test.dmp
@@ -0,0 +1,556 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "testwt",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/forbind/test/test1.dmp b/exodus/forbind/test/test1.dmp
new file mode 100644
index 0000000..5cbd207
--- /dev/null
+++ b/exodus/forbind/test/test1.dmp
@@ -0,0 +1,714 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 28 ;
+	num_elem = 8 ;
+	num_el_blk = 7 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_node_maps = 1 ;
+	num_elem_maps = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 3 ;
+	num_el_in_blk2 = 2 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 3 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 3 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 3 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 1 ;
+	num_att_in_blk5 = 3 ;
+	num_el_in_blk6 = 1 ;
+	num_nod_per_el6 = 1 ;
+	num_att_in_blk6 = 3 ;
+	num_el_in_blk7 = 1 ;
+	num_nod_per_el7 = 6 ;
+	num_att_in_blk7 = 3 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 2 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int nm_prop1(num_node_maps) ;
+		nm_prop1:name = "ID" ;
+	char nmap_names(num_node_maps, len_name) ;
+	int node_map1(num_nodes) ;
+	int em_prop1(num_elem_maps) ;
+		em_prop1:name = "ID" ;
+	char emap_names(num_elem_maps, len_name) ;
+	int elem_map1(num_elem) ;
+	int elem_map2(num_elem) ;
+	int em_prop2(num_elem_maps) ;
+		em_prop2:_FillValue = 0 ;
+		em_prop2:name = "ORDER" ;
+	int em_prop3(num_elem_maps) ;
+		em_prop3:_FillValue = 0 ;
+		em_prop3:name = "NUMBER" ;
+	int nm_prop2(num_node_maps) ;
+		nm_prop2:_FillValue = 0 ;
+		nm_prop2:name = "NUMBER" ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "circle" ;
+	float attrib6(num_el_in_blk6, num_att_in_blk6) ;
+	char attrib_name6(num_att_in_blk6, len_name) ;
+	int connect6(num_el_in_blk6, num_nod_per_el6) ;
+		connect6:elem_type = "sphere" ;
+	float attrib7(num_el_in_blk7, num_att_in_blk7) ;
+	char attrib_name7(num_att_in_blk7, len_name) ;
+	int connect7(num_el_in_blk7, num_nod_per_el7) ;
+		connect7:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var1eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var1eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var2eb7(time_step, num_el_in_blk7) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb6(time_step, num_el_in_blk6) ;
+	float vals_elem_var3eb7(time_step, num_el_in_blk7) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is testwt1" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14, 15, 16 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 
+    100, 50, 3, 6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 
+    100, 50, 0, 0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    0, 20, 6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ nm_prop1 = 333 ;
+
+ nmap_names =
+  "" ;
+
+ node_map1 = 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 
+    54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84 ;
+
+ em_prop1 = 111, 222 ;
+
+ emap_names =
+  "",
+  "" ;
+
+ elem_map1 = 1, 2, 3, 4, 5, 6, 7, 8 ;
+
+ elem_map2 = 2, 4, 6, 8, 10, 12, 14, 16 ;
+
+ em_prop2 = 1, _ ;
+
+ em_prop3 = _, 1 ;
+
+ nm_prop2 = 1 ;
+
+ attrib1 =
+  1, 2, 3 ;
+
+ attrib_name1 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  1.11, 2.11, 3.11,
+  1.12, 2.12, 3.12 ;
+
+ attrib_name2 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect2 =
+  1, 2, 3, 4,
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  1.2, 2.2, 3.2 ;
+
+ attrib_name3 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  1.3, 2.3, 3.3 ;
+
+ attrib_name4 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  1.4, 2.4, 3.4 ;
+
+ attrib_name5 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect5 =
+  21 ;
+
+ attrib6 =
+  1.5, 2.5, 3.5 ;
+
+ attrib_name6 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect6 =
+  22 ;
+
+ attrib7 =
+  1.6, 2.6, 3.6 ;
+
+ attrib_name7 =
+  "attribute_1",
+  "attribute_2",
+  "attribute_3" ;
+
+ connect7 =
+  23, 24, 25, 26, 27, 28 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50, 60, 70 ;
+
+ eb_prop3 = _, _, _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 3, 3 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 3 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 4, 4, 4, 4, 4, 4, 4 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 5, 5, 5, 5 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 6, 7 ;
+
+ side_ss5 = 1, 1 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "testwt1",
+  "03/16/94",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26, 1.27, 1.28,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 
+    1.52, 1.54, 1.56,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78, 1.81, 1.84,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04, 
+    2.08, 2.12,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 
+    2.35, 2.4,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 
+    2.56, 2.62, 2.68,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82, 2.89, 2.96,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08, 
+    3.16, 3.24,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34, 3.43, 3.52,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26, 2.27, 2.28,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 
+    2.52, 2.54, 2.56,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78, 2.81, 2.84,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04, 
+    3.08, 3.12,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3, 
+    3.35, 3.4,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 
+    3.56, 3.62, 3.68,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82, 3.89, 3.96,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08, 
+    4.16, 4.24,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34, 4.43, 4.52,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var1eb2 =
+  5.01, 5.02,
+  5.02, 5.04,
+  5.03, 5.06,
+  5.04, 5.08,
+  5.05, 5.1,
+  5.06, 5.12,
+  5.07, 5.14,
+  5.08, 5.16,
+  5.09, 5.18,
+  5.1, 5.2 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb6 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb7 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01, 6.02,
+  6.02, 6.04,
+  6.03, 6.06,
+  6.04, 6.08,
+  6.05, 6.1,
+  6.06, 6.12,
+  6.07, 6.14,
+  6.08, 6.16,
+  6.09, 6.18,
+  6.1, 6.2 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var2eb6 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var2eb7 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01, 7.02,
+  7.02, 7.04,
+  7.03, 7.06,
+  7.04, 7.08,
+  7.05, 7.1,
+  7.06, 7.12,
+  7.07, 7.14,
+  7.08, 7.16,
+  7.09, 7.18,
+  7.1, 7.2 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ vals_elem_var3eb6 =
+  11.01,
+  11.02,
+  11.03,
+  11.04,
+  11.05,
+  11.06,
+  11.07,
+  11.08,
+  11.09,
+  11.1 ;
+
+ vals_elem_var3eb7 =
+  12.01,
+  12.02,
+  12.03,
+  12.04,
+  12.05,
+  12.06,
+  12.07,
+  12.08,
+  12.09,
+  12.1 ;
+}
diff --git a/exodus/forbind/test/test2-1.dmp b/exodus/forbind/test/test2-1.dmp
new file mode 100644
index 0000000..20e2ce4
--- /dev/null
+++ b/exodus/forbind/test/test2-1.dmp
@@ -0,0 +1,556 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is test 2" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "testwt2",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/forbind/test/test2-2.dmp b/exodus/forbind/test/test2-2.dmp
new file mode 100644
index 0000000..027e17a
--- /dev/null
+++ b/exodus/forbind/test/test2-2.dmp
@@ -0,0 +1,556 @@
+netcdf test2 {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	float vals_glo_var(time_step, num_glo_var) ;
+	float vals_nod_var1(time_step, num_nodes) ;
+	float vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	float vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	float vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	float vals_elem_var1eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var2eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var3eb3(time_step, num_el_in_blk3) ;
+	float vals_elem_var1eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var2eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var3eb4(time_step, num_el_in_blk4) ;
+	float vals_elem_var1eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var2eb5(time_step, num_el_in_blk5) ;
+	float vals_elem_var3eb5(time_step, num_el_in_blk5) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is test 2" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 100, 200, 300, 400, 500 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+
+ qa_records =
+  "testwt2",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1, 1.11, 1.12, 
+    1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2, 1.21, 1.22, 1.23, 1.24, 
+    1.25, 1.26,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16, 1.18, 1.2, 1.22, 1.24, 1.26, 
+    1.28, 1.3, 1.32, 1.34, 1.36, 1.38, 1.4, 1.42, 1.44, 1.46, 1.48, 1.5, 1.52,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24, 1.27, 1.3, 1.33, 1.36, 
+    1.39, 1.42, 1.45, 1.48, 1.51, 1.54, 1.57, 1.6, 1.63, 1.66, 1.69, 1.72, 
+    1.75, 1.78,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32, 1.36, 1.4, 1.44, 1.48, 1.52, 
+    1.56, 1.6, 1.64, 1.68, 1.72, 1.76, 1.8, 1.84, 1.88, 1.92, 1.96, 2, 2.04,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.6, 1.65, 
+    1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48, 1.54, 1.6, 1.66, 1.72, 1.78, 
+    1.84, 1.9, 1.96, 2.02, 2.08, 2.14, 2.2, 2.26, 2.32, 2.38, 2.44, 2.5, 2.56,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56, 1.63, 1.7, 1.77, 1.84, 
+    1.91, 1.98, 2.05, 2.12, 2.19, 2.26, 2.33, 2.4, 2.47, 2.54, 2.61, 2.68, 
+    2.75, 2.82,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64, 1.72, 1.8, 1.88, 1.96, 2.04, 
+    2.12, 2.2, 2.28, 2.36, 2.44, 2.52, 2.6, 2.68, 2.76, 2.84, 2.92, 3, 3.08,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72, 1.81, 1.9, 1.99, 2.08, 
+    2.17, 2.26, 2.35, 2.44, 2.53, 2.62, 2.71, 2.8, 2.89, 2.98, 3.07, 3.16, 
+    3.25, 3.34,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 
+    2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1, 2.11, 2.12, 
+    2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19, 2.2, 2.21, 2.22, 2.23, 2.24, 
+    2.25, 2.26,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16, 2.18, 2.2, 2.22, 2.24, 2.26, 
+    2.28, 2.3, 2.32, 2.34, 2.36, 2.38, 2.4, 2.42, 2.44, 2.46, 2.48, 2.5, 2.52,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24, 2.27, 2.3, 2.33, 2.36, 
+    2.39, 2.42, 2.45, 2.48, 2.51, 2.54, 2.57, 2.6, 2.63, 2.66, 2.69, 2.72, 
+    2.75, 2.78,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32, 2.36, 2.4, 2.44, 2.48, 2.52, 
+    2.56, 2.6, 2.64, 2.68, 2.72, 2.76, 2.8, 2.84, 2.88, 2.92, 2.96, 3, 3.04,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 
+    2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3, 3.05, 3.1, 3.15, 3.2, 3.25, 3.3,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48, 2.54, 2.6, 2.66, 2.72, 2.78, 
+    2.84, 2.9, 2.96, 3.02, 3.08, 3.14, 3.2, 3.26, 3.32, 3.38, 3.44, 3.5, 3.56,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56, 2.63, 2.7, 2.77, 2.84, 
+    2.91, 2.98, 3.05, 3.12, 3.19, 3.26, 3.33, 3.4, 3.47, 3.54, 3.61, 3.68, 
+    3.75, 3.82,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64, 2.72, 2.8, 2.88, 2.96, 3.04, 
+    3.12, 3.2, 3.28, 3.36, 3.44, 3.52, 3.6, 3.68, 3.76, 3.84, 3.92, 4, 4.08,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72, 2.81, 2.9, 2.99, 3.08, 
+    3.17, 3.26, 3.35, 3.44, 3.53, 3.62, 3.71, 3.8, 3.89, 3.98, 4.07, 4.16, 
+    4.25, 4.34,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 
+    3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var1eb3 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var2eb3 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var3eb3 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var1eb4 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ vals_elem_var2eb4 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var3eb4 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var1eb5 =
+  8.01,
+  8.02,
+  8.03,
+  8.04,
+  8.05,
+  8.06,
+  8.07,
+  8.08,
+  8.09,
+  8.1 ;
+
+ vals_elem_var2eb5 =
+  9.01,
+  9.02,
+  9.03,
+  9.04,
+  9.05,
+  9.06,
+  9.07,
+  9.08,
+  9.09,
+  9.1 ;
+
+ vals_elem_var3eb5 =
+  10.01,
+  10.02,
+  10.03,
+  10.04,
+  10.05,
+  10.06,
+  10.07,
+  10.08,
+  10.09,
+  10.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/forbind/test/test_nem.dmp b/exodus/forbind/test/test_nem.dmp
new file mode 100644
index 0000000..4659a11
--- /dev/null
+++ b/exodus/forbind/test/test_nem.dmp
@@ -0,0 +1,54 @@
+ ******************Output Tests*****************
+ creating ExodusII file...
+ ...successful
+ testing init info output...
+ ...successful
+ testing global init info output...
+ ...successful
+ testing global element block ID output...
+ ...successful
+ testing global node-set params output...
+ ...successful
+ testing global side-set params output...
+ ...successful
+ testing concatenated load balance info output...
+ ...successful
+ testing node map output...
+ ...successful
+ testing element map output...
+ ...successful
+ testing concatenated communication map params output...
+ ...successful
+ testing nodal communication map output...
+ ...successful
+ testing elemental communication map output...
+ ...successful
+ closing ExodusII file...
+ ...successful
+ ******************Input Tests******************
+ reopening ExodusII file...
+ ...successful
+ testing init info input...
+ ...successful
+ testing global init info input...
+ ...successful
+ testing global element block IDs input...
+ ...successful
+ testing global node-set params input...
+ ...successful
+ testing global side-set params input...
+ ...successful
+ testing load-balance params input...
+ ...successful
+ testing node map input...
+ ...successful
+ testing element map input...
+ ...successful
+ testing nodal communication map input...
+ ...successful
+ testing elemental communication map input...
+ ...successful
+ closing ExodusII file...
+ ...successful
+ Tests Passed:           25
+ Tests Failed:            0
diff --git a/exodus/forbind/test/test_nem.f b/exodus/forbind/test/test_nem.f
new file mode 100644
index 0000000..acec14d
--- /dev/null
+++ b/exodus/forbind/test/test_nem.f
@@ -0,0 +1,928 @@
+C Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+C retains certain rights in this software.
+C 
+C Redistribution and use in source and binary forms, with or without
+C modification, are permitted provided that the following conditions are
+C met:
+C 
+C     * Redistributions of source code must retain the above copyright
+C       notice, this list of conditions and the following disclaimer.
+C 
+C     * Redistributions in binary form must reproduce the above
+C       copyright notice, this list of conditions and the following
+C       disclaimer in the documentation and/or other materials provided
+C       with the distribution.  
+C 
+C     * Neither the name of Sandia Corporation nor the names of its
+C       contributors may be used to endorse or promote products derived
+C       from this software without specific prior written permission.
+C 
+C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C 
+C=================================================================
+C
+C This is just a simple test program to test the fortran interface
+C for the NEMESIS I library.
+C
+C This file was created by translating ne_test.c into fortran.
+C
+C=================================================================
+
+C=================================================================
+      PROGRAM NETEST
+C=================================================================
+      INCLUDE 'exodusII.inc'
+      INCLUDE 'test_nem.inc'
+
+C local variables
+      INTEGER NEID, IO_WS, CPU_WS, T_PASS, T_FAIL, DBG_FLAG, IERR
+      CHARACTER FNAME*256, YO*6
+      REAL VERSION
+
+      YO = 'NETEST'
+      IO_WS = 0
+      CPU_WS = 0
+      T_PASS = 0
+      T_FAIL = 0
+      DBG_FLAG = 0
+
+C now let's get going...
+
+C I don't care about input arguments, so the file name will be ne_test.nemI
+      FNAME = 'test_nem.exo'
+C and set the debug flag to 0
+      DBG_FLAG = 0
+
+      PRINT*, '******************Output Tests*****************'
+C create the exodus II file
+      PRINT*, 'creating ExodusII file...'
+      NEID = EXCRE(FNAME, EXCLOB, CPU_WS, IO_WS, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to create test file', FNAME, '!'
+        GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of initial information
+      PRINT*, 'testing init info output...'
+      CALL EXPII(NEID, NPROC, NPROCF, 'S', IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of initial global information
+      PRINT*, 'testing global init info output...'
+      CALL EXPIG(NEID, NNG, NEG, NEBG, NNSG, NSSG, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the global element block IDs
+      PRINT*, 'testing global element block ID output...'
+      CALL EXTPEBI(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the global node-set info
+      PRINT*, 'testing global node-set params output...'
+      CALL EXTPNSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the global side-set info
+      PRINT*, 'testing global side-set params output...'
+      CALL EXTPSSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the concatenated load-balance parameters
+      PRINT*, 'testing concatenated load balance info output...'
+      CALL EXTPLBPC(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the node map
+      PRINT*, 'testing node map output...'
+      CALL EXTPNM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the element map
+      PRINT*, 'testing element map output...'
+      CALL EXTPEM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the concatenated communication map params
+      PRINT*, 'testing concatenated communication map params output...'
+      CALL EXTPCMPC(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+      
+C Test nodal communication map output
+      PRINT*, 'testing nodal communication map output...'
+      CALL EXTPNCM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test elemental communication map output
+      PRINT*, 'testing elemental communication map output...'
+      CALL EXTPECM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Close the ExodusII/Nemesis test file
+      PRINT*, 'closing ExodusII file...'
+      CALL EXCLOS(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to close test file', FNAME, '!'
+          GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C=================================================================
+C                       INPUT TEST SECTION
+C=================================================================
+
+      PRINT*, '******************Input Tests******************'
+
+C Re-open the ExodusII/NemesisI file 
+      PRINT*, 'reopening ExodusII file...'
+      NEID =  EXOPEN(FNAME, EXREAD, CPU_WS, IO_WS, VERSION, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to open test file', FNAME, '!'
+          GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of of the initial information
+      PRINT*, 'testing init info input...'
+      CALL EXTGII(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of initial global information
+      PRINT*, 'testing global init info input...'
+      CALL EXTGIG(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of global element block IDs
+      PRINT*, 'testing global element block IDs input...'
+      CALL EXTGEBI(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of global node-set params
+      PRINT*, 'testing global node-set params input...'
+      CALL EXTGNSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of global side-set params
+      PRINT*, 'testing global side-set params input...'
+      CALL EXTGSSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of load-balance params
+      PRINT*, 'testing load-balance params input...'
+      CALL EXTGLBP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of the node map
+      PRINT*, 'testing node map input...'
+      CALL EXTGNM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of the element map
+      PRINT*, 'testing element map input...'
+      CALL EXTGEM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of nodal communication maps
+      PRINT*, 'testing nodal communication map input...'
+      CALL EXTGNCM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of elemental communication maps
+      PRINT*, 'testing elemental communication map input...'
+      CALL EXTGECM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Close the ExodusII/Nemesis test file
+      PRINT*, 'closing ExodusII file...'
+      CALL EXCLOS(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to close test file', FNAME, '!'
+          GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+      PRINT*, 'Tests Passed: ', T_PASS
+      PRINT*, 'Tests Failed: ', T_FAIL
+
+  100 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTPEBI(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER I, EBLK_IDS(NEBG)
+      INTEGER EBLK_CNTS(NEBG)
+
+      DO 110 I=1,NEBG
+        EBLK_IDS(I) = I
+        EBLK_CNTS(I) = 10
+  110 CONTINUE
+
+      CALL EXPEBIG(NEID, EBLK_IDS, EBLK_CNTS, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE EXTPNSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER I, GLBL_IDS(NNSG), GLBL_NC(NNSG), GLBL_DFC(NNSG)
+
+      DO 120 I = 1,NNSG
+        GLBL_IDS(I) = 2 * I
+        GLBL_NC(I) = 3 * I
+        GLBL_DFC(I) = 1
+  120 CONTINUE
+
+      CALL EXPNSPG(NEID, GLBL_IDS, GLBL_NC, GLBL_DFC, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE EXTPSSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER I, GLBL_IDS(NSSG), GLBL_ELC(NSSG), GLBL_DFC(NSSG)
+
+      DO 130 I = 1,NSSG
+        GLBL_IDS(I) = 3 * I
+        GLBL_ELC(I) = 2 * I
+        GLBL_DFC(I) = 1
+  130 CONTINUE
+
+      CALL EXPSSPG(NEID, GLBL_IDS, GLBL_ELC, GLBL_DFC, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE EXTPLBPC(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, NUM_IN(NPROCF), NUM_BN(NPROCF), NUM_EN(NPROCF),
+     1 NUM_IE(NPROCF), NUM_BE(NPROCF), NUM_NCM(NPROCF), NUM_ECM(NPROCF)
+
+      DO 140 IPROC = 1,NPROCF
+        NUM_IN(IPROC) = NINTN
+        NUM_BN(IPROC) = NBORN
+        NUM_EN(IPROC) = NEXTN
+
+        NUM_IE(IPROC) = NINTE
+        NUM_BE(IPROC) = NBORE
+
+        NUM_NCM(IPROC) = NNCMAP
+        NUM_ECM(IPROC) = NECMAP
+  140 CONTINUE
+
+      CALL EXPLBPC(NEID, NUM_IN, NUM_BN, NUM_EN, NUM_IE, NUM_BE,
+     1 NUM_NCM, NUM_ECM, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE EXTPNM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, J, NMAPI(NINTN), NMAPB(NBORN), NMAPE(NEXTN)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 J = 1,NINTN
+          NMAPI(J) = I
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORN
+          NMAPB(J) = I
+          I = I + 1
+  160   CONTINUE
+        DO 170 J = 1,NEXTN
+          NMAPE(J) = I
+          I = I + 1
+  170   CONTINUE
+
+        I = 0
+
+        CALL EXPNMP(NEID, NMAPI, NMAPB, NMAPE, IPROC, IERR)
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTPEM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, J, EMAPI(NINTE), EMAPB(NBORE)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 J = 1,NINTE
+          EMAPI(J) = I
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORE
+          EMAPB(J) = I
+          I = I + 1
+  160   CONTINUE
+
+        I = 0
+
+        CALL EXPEMP(NEID, EMAPI, EMAPB, IPROC, IERR)
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTPCMPC(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, NCNTR, ECNTR, NMAPIDS(NNCXNPF),
+     1 NMAPCNT(NNCXNPF), NMAPPROC(NPROCF+1), EMAPIDS(NECXNPF),
+     1 EMAPCNT(NECXNPF), EMAPPROC(NPROCF+1)
+
+      NMAPPROC(1) = 0
+      EMAPPROC(1) = 0
+      NCNTR = 1
+      ECNTR = 1
+      DO 200 IPROC = 1,NPROCF
+        DO 150 I = 1,NNCMAP
+          NMAPIDS(NCNTR) = I
+          NMAPCNT(NCNTR) = NCNTCM
+          NCNTR = NCNTR + 1
+  150   CONTINUE
+        DO 160 I = 1,NECMAP
+          EMAPIDS(ECNTR) = 2*I
+          EMAPCNT(ECNTR) = ECNTCM
+          ECNTR = ECNTR + 1
+  160   CONTINUE
+
+      NMAPPROC(IPROC+1) = NMAPPROC(IPROC) + NNCMAP
+      EMAPPROC(IPROC+1) = EMAPPROC(IPROC) + NECMAP
+
+  200 CONTINUE
+
+      CALL EXPCMPC(NEID, NMAPIDS, NMAPCNT, NMAPPROC, EMAPIDS, EMAPCNT, 
+     1 EMAPPROC, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE EXTPNCM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, NMAPIDS(NNCMAP), NIDS(NCNTCM), PIDS(NCNTCM)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 I = 1,NNCMAP
+          NMAPIDS(I) = I
+  150   CONTINUE
+        DO 160 I = 1,NCNTCM
+          NIDS(I) = 2*I
+          PIDS(I) = 3*I
+  160   CONTINUE
+
+        DO 170 I=1,NNCMAP
+          CALL EXPNCM(NEID, NMAPIDS(I), NIDS, PIDS, IPROC, IERR)
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTPECM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, EMAPIDS(NECMAP), EIDS(ECNTCM), PIDS(ECNTCM),
+     1 SIDS(ECNTCM)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 I = 1,NECMAP
+          EMAPIDS(I) = 2*I
+  150   CONTINUE
+        DO 160 I = 1,ECNTCM
+          EIDS(I) = 2*I
+          SIDS(I) = 3*I
+          PIDS(I) = 4*I
+  160   CONTINUE
+
+        DO 170 I=1,NECMAP
+          CALL EXPECM(NEID, EMAPIDS(I), EIDS, SIDS, PIDS, IPROC, IERR)
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGII(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER NP, NPF
+      CHARACTER FTYPE*2
+
+      CALL EXGII(NEID, NP, NPF, FTYPE, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      IF (NP.NE.NPROC) IERR = -1
+      IF (NPF.NE.NPROCF) IERR = -1
+      IF (NP.NE.NPROC) IERR = -1
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGIG(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER NUMNG, NUMEG, NUMEBG, NUMNSG, NUMSSG
+
+      CALL EXGIG(NEID, NUMNG, NUMEG, NUMEBG, NUMNSG, NUMSSG, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      IF (NUMNG.NE.NNG) IERR = -1
+      IF (NUMEG.NE.NEG) IERR = -1
+      IF (NUMEBG.NE.NEBG) IERR = -1
+      IF (NUMNSG.NE.NNSG) IERR = -1
+      IF (NUMSSG.NE.NSSG) IERR = -1
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGEBI(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER I, EBLK_IDS(NEBG)
+      INTEGER EBLK_CNTS(NEBG)
+
+      CALL EXGEBIG(NEID, EBLK_IDS, EBLK_CNTS, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      DO 150 I=1,NEBG
+        IF (EBLK_IDS(I).NE.I) IERR = -1
+        IF (EBLK_CNTS(I) .NE. 10) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGNSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER I, GLBL_IDS(NNSG), GLBL_NC(NNSG), GLBL_DFC(NNSG)
+
+      CALL EXGNSPG(NEID, GLBL_IDS, GLBL_NC, GLBL_DFC, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      DO 150 I=1,NNSG
+        IF (GLBL_IDS(I).NE.(2*I)) IERR = -1
+        IF (GLBL_NC(I).NE.(3*I)) IERR = -1
+        IF (GLBL_DFC(I).NE.1) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGSSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER I, GLBL_IDS(NSSG), GLBL_EC(NSSG), GLBL_DFC(NSSG)
+
+      CALL EXGSSPG(NEID, GLBL_IDS, GLBL_EC, GLBL_DFC, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      DO 150 I=1,NNSG
+        IF (GLBL_IDS(I).NE.(3*I)) IERR = -1
+        IF (GLBL_EC(I).NE.(2*I)) IERR = -1
+        IF (GLBL_DFC(I).NE.1) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGLBP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, NUM_IN, NUM_BN, NUM_EN, NUM_IE, NUM_BE,
+     *  NUM_NCM, NUM_ECM
+
+      DO 150 IPROC = 0,(NPROCF-1)
+        CALL EXGLBP(NEID, NUM_IN, NUM_BN, NUM_EN, NUM_IE, NUM_BE,
+     1   NUM_NCM, NUM_ECM, IPROC, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+        IF(NUM_IN.NE.NINTN) IERR = -1
+        IF(NUM_BN.NE.NBORN) IERR = -1
+        IF(NUM_EN.NE.NEXTN) IERR = -1
+        IF(NUM_IE.NE.NINTE) IERR = -1
+        IF(NUM_BE.NE.NBORE) IERR = -1
+        IF(NUM_NCM.NE.NNCMAP) IERR = -1
+        IF(NUM_ECM.NE.NECMAP) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGNM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, J, NMAPI(NINTN), NMAPB(NBORN), NMAPE(NEXTN)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+
+        CALL EXGNMP(NEID, NMAPI, NMAPB, NMAPE, IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 150 J = 1,NINTN
+          IF (NMAPI(J).NE.I) ERR = -1
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORN
+          IF (NMAPB(J).NE.I) ERR = -1
+          I = I + 1
+  160   CONTINUE
+        DO 170 J = 1,NEXTN
+          IF (NMAPE(J).NE.I) ERR = -1
+          I = I + 1
+  170   CONTINUE
+
+        I = 0
+
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGEM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, J, EMAPI(NINTE), EMAPB(NBORE)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+        CALL EXGEMP(NEID, EMAPI, EMAPB, IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 150 J = 1,NINTE
+          IF (EMAPI(J).NE.I) ERR = -1
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORE
+          IF (EMAPB(J).NE.I) ERR = -1
+          I = I + 1
+  160   CONTINUE
+
+        I = 0
+
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGNCM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, J, NMAPIDS(NNCMAP), NMAPCNT(NNCMAP),
+     1 NIDS(NCNTCM), PIDS(NCNTCM), EMAPIDS(NECMAP), EMAPCNT(NECMAP)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        CALL EXGCMP(NEID, NMAPIDS, NMAPCNT, EMAPIDS, EMAPCNT,
+     1   IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 170 I = 1,NNCMAP
+          CALL EXGNCM(NEID, NMAPIDS(I), NIDS, PIDS, IPROC, IERR)
+
+          IF (IERR.NE.0) GOTO 210
+
+          IF (NMAPIDS(I).NE.I) IERR = -1
+          DO 160 J = 1,NCNTCM
+            IF (NIDS(J).NE.2*J) IERR = -1
+            IF (PIDS(J).NE.3*J) IERR = -1
+  160     CONTINUE
+
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE EXTGECM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'test_nem.inc'
+
+      INTEGER IPROC, I, EMAPIDS(NECMAP), EMAPCNT(NECMAP), EIDS(ECNTCM),
+     1 PIDS(ECNTCM), SIDS(ECNTCM), NMAPIDS(NNCMAP), NMAPCNT(NNCMAP)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        CALL EXGCMP(NEID, NMAPIDS, NMAPCNT, EMAPIDS, EMAPCNT,
+     1   IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 170 I = 1,NECMAP
+          CALL EXGECM(NEID, EMAPIDS(I), EIDS, SIDS, PIDS, IPROC, IERR)
+
+          IF (IERR.NE.0) GOTO 210
+
+          IF (EMAPIDS(I).NE.(2*I)) IERR = -1
+          DO 160 J = 1,ECNTCM
+            IF (EIDS(J).NE.2*J) IERR = -1
+            IF (SIDS(J).NE.3*J) IERR = -1
+            IF (PIDS(J).NE.4*J) IERR = -1
+  160     CONTINUE
+
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
diff --git a/exodus/forbind/test/test_nem.inc b/exodus/forbind/test/test_nem.inc
new file mode 100644
index 0000000..f8fd0d3
--- /dev/null
+++ b/exodus/forbind/test/test_nem.inc
@@ -0,0 +1,66 @@
+C Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+C retains certain rights in this software.
+C 
+C Redistribution and use in source and binary forms, with or without
+C modification, are permitted provided that the following conditions are
+C met:
+C 
+C     * Redistributions of source code must retain the above copyright
+C       notice, this list of conditions and the following disclaimer.
+C 
+C     * Redistributions in binary form must reproduce the above
+C       copyright notice, this list of conditions and the following
+C       disclaimer in the documentation and/or other materials provided
+C       with the distribution.  
+C 
+C     * Neither the name of Sandia Corporation nor the names of its
+C       contributors may be used to endorse or promote products derived
+C       from this software without specific prior written permission.
+C 
+C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C 
+C==================================================
+C Parameters for the NE_TEST fortran interface test
+C program
+C==================================================
+
+C Constants for init_global functions
+      PARAMETER (NNG = 100)
+      PARAMETER (NEG = 50)
+      PARAMETER (NEBG = 5)
+      PARAMETER (NNSG = 2)
+      PARAMETER (NSSG = 3)
+
+C Constants for load-balance functions
+      PARAMETER (NPROC = 10)
+      PARAMETER (NPROCF = NPROC)
+      PARAMETER (NINTN = 200)
+      PARAMETER (NBORN = 10)
+      PARAMETER (NEXTN = 5)
+      PARAMETER (NINTE = 100)
+      PARAMETER (NBORE = 20)
+      INTEGER NNCMAP, NECMAP
+      PARAMETER (NNCMAP = 4)
+      PARAMETER (NECMAP = 2)
+
+C Constants for communication map
+      PARAMETER (NCNTCM = 20)
+      INTEGER ECNTCM
+      PARAMETER (ECNTCM = 17)
+
+C Some multiplied values
+C   NNCMAP * NPROCF
+      PARAMETER (NNCXNPF = 40)
+C   NECMAP * NPROCF
+      PARAMETER (NECXNPF = 20)
diff --git a/exodus/forbind/test/testall.in b/exodus/forbind/test/testall.in
new file mode 100644
index 0000000..1e625da
--- /dev/null
+++ b/exodus/forbind/test/testall.in
@@ -0,0 +1,129 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SUFFIX = ""
+set BINDIR = @CMAKE_CURRENT_BINARY_DIR@
+set SRCDIR = @CMAKE_CURRENT_SOURCE_DIR@
+set NCDUMP = @NETCDF_NCDUMP@
+
+# testwt - single precision write test
+echo "************************************************************************"
+echo "************************************************************************"
+echo "testwt ..."
+echo "begin testwt" > test.output
+${PREFIX} ${BINDIR}/f_testwt${SUFFIX} >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - ${SRCDIR}/test.dmp | tee testwt.res
+
+# testrd - single precision read test
+echo "testrd ..."
+echo "testrd ... [Expect ex_create NOCLOBBER error from this test]"
+${PREFIX} ${BINDIR}/f_testrd${SUFFIX} | grep -v version | diff - ${SRCDIR}/testrd.dmp | tee testrd.res
+
+# testcp_ss - single-to-single precision copy test
+echo "testcp_ss ..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${BINDIR}/f_testcp${SUFFIX} >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | diff - ${SRCDIR}/testcp_ss.dmp | tee testcp_ss.res
+
+# testcpln - single-to-single, large to normal copy test
+echo "testcpln ..."
+echo "begin testcpln" >> test.output
+${PREFIX} ${BINDIR}/f_testcpln${SUFFIX} >> test.output
+echo "end testcpln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | diff - ${SRCDIR}/testcpln.dmp | tee testcpln.res
+
+# testcpnl - single-to-single, normal to large copy test
+echo "testcpnl ..."
+echo "begin testcpnl" >> test.output
+${PREFIX} ${BINDIR}/f_testcpnl${SUFFIX} >> test.output
+echo "end testcpnl" >> test.output
+${NCDUMP} -d5,5 testcpnl.exo | grep -v version | diff - ${SRCDIR}/testcpnl.dmp | tee testcpnl.res
+
+# testwt1 - single precision write test with multiple side sets
+echo "testwt1 ..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${BINDIR}/f_testwt1${SUFFIX} >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - ${SRCDIR}/test1.dmp | tee testwt1.res
+
+# testrd1 - single precision read test with multiple side sets
+echo "testrd1 ..."
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+${PREFIX} ${BINDIR}/f_testrd1${SUFFIX} | grep -v version | diff - ${SRCDIR}/testrd1.dmp | tee testrd1.res
+
+# testwtd - double precision write test
+echo "testwtd ..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${BINDIR}/f_testwtd${SUFFIX} >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - ${SRCDIR}/testd.dmp | tee testwtd.res
+
+# testrdd - double precision read test
+echo "testrdd ..."
+${PREFIX} ${BINDIR}/f_testrdd${SUFFIX} | grep -v version | diff - ${SRCDIR}/testrdd.dmp | tee testrdd.res
+
+# testwt2 - single precision write 2 files (simultaneously open) test
+echo "testwt2 ..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${BINDIR}/f_testwt2${SUFFIX} >> test.output |&grep -v "property name string" 
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - ${SRCDIR}/test2-1.dmp | tee testwt2-1.res
+${NCDUMP} -d5,5 test2.exo | grep -v version | diff - ${SRCDIR}/test2-2.dmp | tee testwt2-2.res
+
+echo "testwt_nsid ..."
+echo "begin testwt_nsid" > test.output
+${PREFIX} ${BINDIR}/f_testwt_nsid${SUFFIX} >> test.output
+echo "end testwt_nsid" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version | diff - ${SRCDIR}/test-nsided.dmp | tee testwt_nsid.res
+
+# testrd_nsid - single precision read test
+echo "testrd_nsid ..."
+${PREFIX} ${BINDIR}/f_testrd_nsid${SUFFIX} | grep -v version | diff - ${SRCDIR}/testrd_nsid.dmp | tee testrd_nsid.res
+
+# test_nem - nemesis routines
+echo "test_nem ..."
+${PREFIX} ${BINDIR}/f_test_nem${SUFFIX} | diff -w - ${SRCDIR}/test_nem.dmp | tee test_nem.res
+
+echo "************************************************************************"
+echo "************************************************************************"
+
diff --git a/exodus/forbind/test/testall.in1 b/exodus/forbind/test/testall.in1
new file mode 100644
index 0000000..fb9f57b
--- /dev/null
+++ b/exodus/forbind/test/testall.in1
@@ -0,0 +1,127 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SRCDIR = .
+set NCDUMP = @<BINDIR>@/ncdump
+
+# testwt - single precision write test
+echo "************************************************************************"
+echo "************************************************************************"
+echo "testwt ..."
+echo "begin testwt" > test.output
+${PREFIX} ${SRCDIR}/testwt >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - test.dmp | tee testwt.res
+
+# testrd - single precision read test
+echo "testrd ..."
+echo "testrd ... [Expect ex_create NOCLOBBER error from this test]"
+${PREFIX} ${SRCDIR}/testrd | grep -v version | diff - testrd.dmp | tee testrd.res
+
+# testcp_ss - single-to-single precision copy test
+echo "testcp_ss ..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | diff - testcp_ss.dmp | tee testcp_ss.res
+
+# testcpln - single-to-single, large to normal copy test
+echo "testcpln ..."
+echo "begin testcpln" >> test.output
+${PREFIX} ${SRCDIR}/testcpln >> test.output
+echo "end testcpln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | diff - testcpln.dmp | tee testcpln.res
+
+# testcpnl - single-to-single, normal to large copy test
+echo "testcpnl ..."
+echo "begin testcpnl" >> test.output
+${PREFIX} ${SRCDIR}/testcpnl >> test.output
+echo "end testcpnl" >> test.output
+${NCDUMP} -d5,5 testcpnl.exo | grep -v version | diff - testcpnl.dmp | tee testcpnl.res
+
+# testwt1 - single precision write test with multiple side sets
+echo "testwt1 ..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${SRCDIR}/testwt1 >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - test1.dmp | tee testwt1.res
+
+# testrd1 - single precision read test with multiple side sets
+echo "testrd1 ..."
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+${PREFIX} ${SRCDIR}/testrd1 | grep -v version | diff - testrd1.dmp | tee testrd1.res
+
+# testwtd - double precision write test
+echo "testwtd ..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${SRCDIR}/testwtd >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - testd.dmp | tee testwtd.res
+
+# testrdd - double precision read test
+echo "testrdd ..."
+${PREFIX} ${SRCDIR}/testrdd | grep -v version | diff - testrdd.dmp | tee testrdd.res
+
+# testwt2 - single precision write 2 files (simultaneously open) test
+echo "testwt2 ..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${SRCDIR}/testwt2 >> test.output |&grep -v "property name string" 
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - test2-1.dmp | tee testwt2-1.res
+${NCDUMP} -d5,5 test2.exo | grep -v version | diff - test2-2.dmp | tee testwt2-2.res
+
+echo "testwt_nsid ..."
+echo "begin testwt_nsid" > test.output
+${PREFIX} ${SRCDIR}/testwt_nsid >> test.output
+echo "end testwt_nsid" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version | diff - test-nsided.dmp | tee testwt_nsid.res
+
+# testrd_nsid - single precision read test
+echo "testrd_nsid ..."
+${PREFIX} ${SRCDIR}/testrd_nsid | grep -v version | diff - testrd_nsid.dmp | tee testrd_nsid.res
+
+# test_nem - nemesis routines
+echo "test_nem ..."
+${PREFIX} ${SRCDIR}/test_nem | diff - test_nem.dmp | tee test_nem.res
+
+echo "************************************************************************"
+echo "************************************************************************"
+
diff --git a/exodus/forbind/test/testall.standalone b/exodus/forbind/test/testall.standalone
new file mode 100755
index 0000000..b8fa00f
--- /dev/null
+++ b/exodus/forbind/test/testall.standalone
@@ -0,0 +1,132 @@
+# Copyright (c) 2005 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+# script to run all tests and compare them to saved dump files.
+#
+# To run the tests with valgrind checking, uncomment the next line and comment the
+# following line. Can also define other prefixes if wanted.
+
+if ($#argv == 0) then
+  set NCDUMP = `which ncdump`
+else
+  set NCDUMP = $1
+endif
+
+#set PREFIX = "valgrind --tool=memcheck"
+set PREFIX = ""
+set SRCDIR = .
+
+# testwt - single precision write test
+echo "************************************************************************"
+echo "************************************************************************"
+echo "testwt ..."
+echo "begin testwt" > test.output
+${PREFIX} ${SRCDIR}/testwt >> test.output
+echo "end testwt" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - test.dmp | tee testwt.res
+
+# testrd - single precision read test
+echo "testrd ..."
+echo "testrd ... [Expect ex_create NOCLOBBER error from this test]"
+${PREFIX} ${SRCDIR}/testrd | grep -v version | diff - testrd.dmp | tee testrd.res
+
+# testcp_ss - single-to-single precision copy test
+echo "testcp_ss ..."
+echo "begin testcp_ss" >> test.output
+${PREFIX} ${SRCDIR}/testcp >> test.output
+echo "end testcp_ss" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | diff - testcp_ss.dmp | tee testcp_ss.res
+
+# testcpln - single-to-single, large to normal copy test
+echo "testcpln ..."
+echo "begin testcpln" >> test.output
+${PREFIX} ${SRCDIR}/testcpln >> test.output
+echo "end testcpln" >> test.output
+${NCDUMP} -d5,5 testcp.exo | grep -v version | diff - testcpln.dmp | tee testcpln.res
+
+# testcpnl - single-to-single, normal to large copy test
+echo "testcpnl ..."
+echo "begin testcpnl" >> test.output
+${PREFIX} ${SRCDIR}/testcpnl >> test.output
+echo "end testcpnl" >> test.output
+${NCDUMP} -d5,5 testcpnl.exo | grep -v version | diff - testcpnl.dmp | tee testcpnl.res
+
+# testwt1 - single precision write test with multiple side sets
+echo "testwt1 ..."
+echo "testwt1 ... [Expect WEDGE6 warning from this test]"
+echo "begin testwt1" >> test.output
+${PREFIX} ${SRCDIR}/testwt1 >> test.output
+echo "end testwt1" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - test1.dmp | tee testwt1.res
+
+# testrd1 - single precision read test with multiple side sets
+echo "testrd1 ..."
+echo "testrd1 ... [Expect failure locating elem var 1 for elem block 12]"
+${PREFIX} ${SRCDIR}/testrd1 | grep -v version | diff - testrd1.dmp | tee testrd1.res
+
+# testwtd - double precision write test
+echo "testwtd ..."
+echo "begin testwtd" >> test.output
+${PREFIX} ${SRCDIR}/testwtd >> test.output
+echo "end testwtd" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - testd.dmp | tee testwtd.res
+
+# testrdd - double precision read test
+echo "testrdd ..."
+${PREFIX} ${SRCDIR}/testrdd | grep -v version | diff - testrdd.dmp | tee testrdd.res
+
+# testwt2 - single precision write 2 files (simultaneously open) test
+echo "testwt2 ..."
+echo "begin testwt2" >> test.output
+${PREFIX} ${SRCDIR}/testwt2 >> test.output |&grep -v "property name string" 
+echo "end testwt2" >> test.output
+${NCDUMP} -d5,5 test.exo | grep -v version | diff - test2-1.dmp | tee testwt2-1.res
+${NCDUMP} -d5,5 test2.exo | grep -v version | diff - test2-2.dmp | tee testwt2-2.res
+
+echo "testwt_nsid ..."
+echo "begin testwt_nsid" > test.output
+${PREFIX} ${SRCDIR}/testwt_nsid >> test.output
+echo "end testwt_nsid" >> test.output
+${NCDUMP} -d5,5 test-nsided.exo | grep -v version | diff - test-nsided.dmp | tee testwt_nsid.res
+
+# testrd_nsid - single precision read test
+echo "testrd_nsid ..."
+${PREFIX} ${SRCDIR}/testrd_nsid | grep -v version | diff - testrd_nsid.dmp | tee testrd_nsid.res
+
+# test_nem - nemesis routines
+echo "test_nem ..."
+${PREFIX} ${SRCDIR}/test_nem | diff - test_nem.dmp | tee test_nem.res
+
+echo "************************************************************************"
+echo "************************************************************************"
+
diff --git a/exodus/forbind/test/testcp.f b/exodus/forbind/test/testcp.f
new file mode 100644
index 0000000..9097bd4
--- /dev/null
+++ b/exodus/forbind/test/testcp.f
@@ -0,0 +1,96 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testcpd
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database copy function (excopy).
+c
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, exoid, exoid1, ierr, cpu_ws, io_ws
+
+      real vers
+
+      data iin /5/, iout /6/
+
+c
+c open EXODUS II input file
+c
+
+c the setting of cpu_ws isn't used for copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 4
+
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '(" I/O word size: ",i4)') io_ws
+
+c
+c  create EXODUS II output file with default size reals
+c
+c the setting of cpu_ws isn't used for copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 0
+
+      exoid1 = excre ("testcp.exo",
+     1               EXCLOB, cpu_ws, io_ws, ierr)
+      write (iout,'("after excre, id = ", i6, ", error = ",i4)') 
+     1               exoid1, ierr
+      write (iout,'(" I/O word size: ",i4)') io_ws
+
+      write (iout,'("after excre, error = ", i4)') ierr
+
+      call excopy (exoid, exoid1, ierr)
+      write (iout, '(/"after excopy, error = ", i3)' ) ierr
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      call exclos (exoid1, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testcp_dd.dmp b/exodus/forbind/test/testcp_dd.dmp
new file mode 100644
index 0000000..e69de29
diff --git a/exodus/forbind/test/testcp_ds.dmp b/exodus/forbind/test/testcp_ds.dmp
new file mode 100644
index 0000000..04d4c51
--- /dev/null
+++ b/exodus/forbind/test/testcp_ds.dmp
@@ -0,0 +1,244 @@
+netcdf testcp {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	time_step = UNLIMITED ; // (0 currently)
+	len_name = 33 ;
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coord(num_dim, num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:api_version = 5.15f ;
+		:version = 5.15f ;
+		:floating_point_word_size = 4 ;
+		:file_size = 0 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+		:maximum_name_length = 32 ;
+data:
+
+ eb_status = 0, 0, 0, 0, 0 ;
+
+ eb_prop1 = 0, 0, 0, 0, 0 ;
+
+ ns_status = 0, 0 ;
+
+ ns_prop1 = 0, 0 ;
+
+ ss_status = 0, 0, 0, 0, 0 ;
+
+ ss_prop1 = 0, 0, 0, 0, 0 ;
+
+ coord =
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "",
+  "",
+  "" ;
+
+ elem_map = 0, 0, 0, 0, 0 ;
+
+ attrib1 =
+  0 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  0, 0, 0, 0 ;
+
+ attrib2 =
+  0 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  0, 0, 0, 0 ;
+
+ attrib3 =
+  0 ;
+
+ attrib_name3 =
+  "" ;
+
+ connect3 =
+  0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ attrib4 =
+  0 ;
+
+ attrib_name4 =
+  "" ;
+
+ connect4 =
+  0, 0, 0, 0 ;
+
+ attrib5 =
+  0 ;
+
+ attrib_name5 =
+  "" ;
+
+ connect5 =
+  0, 0, 0, 0, 0, 0 ;
+
+ eb_prop2 = _, _, _, _, _ ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 0, 0, 0, 0, 0 ;
+
+ dist_fact_ns1 = 0, 0, 0, 0, 0 ;
+
+ node_ns2 = 0, 0, 0 ;
+
+ dist_fact_ns2 = 0, 0, 0 ;
+
+ ns_prop2 = _, _ ;
+
+ ns_prop3 = 0, 0 ;
+
+ elem_ss1 = 0, 0 ;
+
+ side_ss1 = 0, 0 ;
+
+ dist_fact_ss1 = 0, 0, 0, 0 ;
+
+ elem_ss2 = 0, 0 ;
+
+ side_ss2 = 0, 0 ;
+
+ dist_fact_ss2 = 0, 0, 0, 0 ;
+
+ elem_ss3 = 0, 0, 0, 0, 0, 0, 0 ;
+
+ side_ss3 = 0, 0, 0, 0, 0, 0, 0 ;
+
+ elem_ss4 = 0, 0, 0, 0 ;
+
+ side_ss4 = 0, 0, 0, 0 ;
+
+ elem_ss5 = 0, 0, 0, 0, 0 ;
+
+ side_ss5 = 0, 0, 0, 0, 0 ;
+
+ ss_prop2 = _, _, _, _, _ ;
+}
diff --git a/exodus/forbind/test/testcp_sd.dmp b/exodus/forbind/test/testcp_sd.dmp
new file mode 100644
index 0000000..e69de29
diff --git a/exodus/forbind/test/testcp_ss.dmp b/exodus/forbind/test/testcp_ss.dmp
new file mode 100644
index 0000000..47ba504
--- /dev/null
+++ b/exodus/forbind/test/testcp_ss.dmp
@@ -0,0 +1,248 @@
+netcdf testcp {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/forbind/test/testcpd.f b/exodus/forbind/test/testcpd.f
new file mode 100644
index 0000000..575d165
--- /dev/null
+++ b/exodus/forbind/test/testcpd.f
@@ -0,0 +1,96 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testcpd
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database copy function (excopy).
+c
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, exoid, exoid1, ierr, cpu_ws, io_ws
+
+      real vers
+
+      data iin /5/, iout /6/
+
+c
+c open EXODUS II input file
+c
+
+c the setting of cpu_ws isn't used in copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 0
+
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '(" I/O word size: ",i4)') io_ws
+
+c
+c  create EXODUS II output file with 8-byte reals
+c
+c the setting of cpu_ws isn't used in copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 8
+
+      exoid1 = excre ("testcpd.exo",
+     1               EXCLOB, cpu_ws, io_ws, ierr)
+      write (iout,'("after excre, id = ", i3, ", error = ",i3)') 
+     1               exoid1, ierr
+      write (iout,'(" I/O word size: ",i4)') io_ws
+
+      write (iout,'("after excre, error = ", i4)') ierr
+
+      call excopy (exoid, exoid1, ierr)
+      write (iout, '(/"after excopy, error = ", i3)' ) ierr
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      call exclos (exoid1, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testcpln.dmp b/exodus/forbind/test/testcpln.dmp
new file mode 100644
index 0000000..7877ae3
--- /dev/null
+++ b/exodus/forbind/test/testcpln.dmp
@@ -0,0 +1,245 @@
+netcdf testcp {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coord(num_dim, num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 0 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coord =
+  0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 6, 0, 
+    3, 6, 0,
+  0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 0, 0, 2, 
+    2, 2,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 6, 0, 
+    0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/forbind/test/testcpln.f b/exodus/forbind/test/testcpln.f
new file mode 100644
index 0000000..de95033
--- /dev/null
+++ b/exodus/forbind/test/testcpln.f
@@ -0,0 +1,101 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testcpnl
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database copy function (excopy).
+c
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, exoid, exoid1, ierr, cpu_ws, io_ws, mod_sz
+
+      real vers
+
+      data iin /5/, iout /6/
+
+c
+c open EXODUS II input file
+c
+
+c the setting of cpu_ws isn't used for copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 4
+
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '(" I/O word size: ",i4)') io_ws
+      mod_sz = exlgmd(exoid)
+      write (iout, '(" Model Size",i2)') mod_sz
+
+c
+c  create EXODUS II output file with default size reals
+c
+c the setting of cpu_ws isn't used for copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 0
+
+      exoid1 = excre ("testcp.exo",
+     1               EXCLOB+EXNORM, cpu_ws, io_ws, ierr)
+      write (iout,'("after excre, id = ", i6, ", error = ",i4)') 
+     1               exoid1, ierr
+      write (iout,'(" I/O word size: ",i4)') io_ws
+
+      mod_sz = exlgmd(exoid1)
+      write (iout, '(" Model Size",i2)') mod_sz
+
+      write (iout,'("after excre, error = ", i4)') ierr
+
+      call excopy (exoid, exoid1, ierr)
+      write (iout, '(/"after excopy, error = ", i3)' ) ierr
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      call exclos (exoid1, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testcpnl.dmp b/exodus/forbind/test/testcpnl.dmp
new file mode 100644
index 0000000..3f70491
--- /dev/null
+++ b/exodus/forbind/test/testcpnl.dmp
@@ -0,0 +1,248 @@
+netcdf testcpnl {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (0 currently)
+	num_dim = 3 ;
+	num_nodes = 26 ;
+	num_elem = 5 ;
+	num_el_blk = 5 ;
+	num_node_sets = 2 ;
+	num_side_sets = 5 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_el_in_blk3 = 1 ;
+	num_nod_per_el3 = 8 ;
+	num_att_in_blk3 = 1 ;
+	num_el_in_blk4 = 1 ;
+	num_nod_per_el4 = 4 ;
+	num_att_in_blk4 = 1 ;
+	num_el_in_blk5 = 1 ;
+	num_nod_per_el5 = 6 ;
+	num_att_in_blk5 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_side_ss3 = 7 ;
+	num_side_ss4 = 4 ;
+	num_side_ss5 = 5 ;
+variables:
+	float time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	float coordx(num_nodes) ;
+	float coordy(num_nodes) ;
+	float coordz(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	float attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	float attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	float attrib3(num_el_in_blk3, num_att_in_blk3) ;
+	char attrib_name3(num_att_in_blk3, len_name) ;
+	int connect3(num_el_in_blk3, num_nod_per_el3) ;
+		connect3:elem_type = "hex" ;
+	float attrib4(num_el_in_blk4, num_att_in_blk4) ;
+	char attrib_name4(num_att_in_blk4, len_name) ;
+	int connect4(num_el_in_blk4, num_nod_per_el4) ;
+		connect4:elem_type = "tetra" ;
+	float attrib5(num_el_in_blk5, num_att_in_blk5) ;
+	char attrib_name5(num_att_in_blk5, len_name) ;
+	int connect5(num_el_in_blk5, num_nod_per_el5) ;
+		connect5:elem_type = "wedge" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	float dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	float dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	float dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	float dist_fact_ss2(num_df_ss2) ;
+	int elem_ss3(num_side_ss3) ;
+	int side_ss3(num_side_ss3) ;
+	int elem_ss4(num_side_ss4) ;
+	int side_ss4(num_side_ss4) ;
+	int elem_ss5(num_side_ss5) ;
+	int side_ss5(num_side_ss5) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+
+// global attributes:
+		:floating_point_word_size = 4 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ eb_status = 1, 1, 1, 1, 1 ;
+
+ eb_prop1 = 10, 11, 12, 13, 14 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1, 1, 1, 1 ;
+
+ ss_prop1 = 30, 31, 32, 33, 34 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1, 0, 10, 10, 1, 1, 10, 10, 1, 0, 1, 10, 7, 3, 
+    6, 0, 3, 6, 0 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, 5, 0, 
+    0, 0, 2, 2, 2 ;
+
+ coordz = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10, -10, 0, 0, -10, -10, 0, 5, 2, 3, 
+    6, 0, 0, 6, 2, 0 ;
+
+ eb_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "",
+  "",
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor",
+  "zcoor" ;
+
+ elem_map = 1, 2, 3, 4, 5 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "THICKNESS" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "THICKNESS" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ attrib3 =
+  6.1416 ;
+
+ attrib_name3 =
+  "THICKNESS" ;
+
+ connect3 =
+  9, 10, 11, 12, 13, 14, 15, 16 ;
+
+ attrib4 =
+  6.1416 ;
+
+ attrib_name4 =
+  "THICKNESS" ;
+
+ connect4 =
+  17, 18, 19, 20 ;
+
+ attrib5 =
+  6.1416 ;
+
+ attrib_name5 =
+  "THICKNESS" ;
+
+ connect5 =
+  21, 22, 23, 24, 25, 26 ;
+
+ eb_prop2 = 10, 20, 30, 40, 50 ;
+
+ eb_prop3 = _, _, _, _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 2, 2 ;
+
+ side_ss1 = 4, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 1, 2 ;
+
+ side_ss2 = 2, 3 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ elem_ss3 = 3, 3, 3, 3, 3, 3, 3 ;
+
+ side_ss3 = 5, 3, 3, 2, 4, 1, 6 ;
+
+ elem_ss4 = 4, 4, 4, 4 ;
+
+ side_ss4 = 1, 2, 3, 4 ;
+
+ elem_ss5 = 5, 5, 5, 5, 5 ;
+
+ side_ss5 = 1, 2, 3, 4, 5 ;
+
+ ss_prop2 = 100, 101, _, _, _ ;
+}
diff --git a/exodus/forbind/test/testcpnl.f b/exodus/forbind/test/testcpnl.f
new file mode 100644
index 0000000..908c2bf
--- /dev/null
+++ b/exodus/forbind/test/testcpnl.f
@@ -0,0 +1,101 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testcpnl
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database copy function (excopy).
+c
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, exoid, exoid1, ierr, cpu_ws, io_ws, mod_sz
+
+      real vers
+
+      data iin /5/, iout /6/
+
+c
+c open EXODUS II input file
+c
+
+c the setting of cpu_ws isn't used for copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 4
+
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '(" I/O word size: ",i4)') io_ws
+      mod_sz = exlgmd(exoid)
+      write (iout, '(" Model Size",i2)') mod_sz
+
+c
+c  create EXODUS II output file with default size reals
+c
+c the setting of cpu_ws isn't used for copying but will test the
+c conversion routines
+
+      cpu_ws = 8
+      io_ws = 0
+
+      exoid1 = excre ("testcpnl.exo",
+     1               EXCLOB+EXLARG, cpu_ws, io_ws, ierr)
+      write (iout,'("after excre, id = ", i3, ", error = ",i3)') 
+     1               exoid1, ierr
+      write (iout,'(" I/O word size: ",i4)') io_ws
+
+      mod_sz = exlgmd(exoid1)
+      write (iout, '(" Model Size",i2)') mod_sz
+
+      write (iout,'("after excre, error = ", i4)') ierr
+
+      call excopy (exoid, exoid1, ierr)
+      write (iout, '(/"after excopy, error = ", i3)' ) ierr
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      call exclos (exoid1, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testd.dmp b/exodus/forbind/test/testd.dmp
new file mode 100644
index 0000000..42a0091
--- /dev/null
+++ b/exodus/forbind/test/testd.dmp
@@ -0,0 +1,326 @@
+netcdf test {
+dimensions:
+	len_string = 33 ;
+	len_line = 81 ;
+	four = 4 ;
+	len_name = 33 ;
+	time_step = UNLIMITED ; // (10 currently)
+	num_dim = 2 ;
+	num_nodes = 8 ;
+	num_elem = 2 ;
+	num_el_blk = 2 ;
+	num_node_sets = 2 ;
+	num_side_sets = 2 ;
+	num_el_in_blk1 = 1 ;
+	num_nod_per_el1 = 4 ;
+	num_att_in_blk1 = 1 ;
+	num_el_in_blk2 = 1 ;
+	num_nod_per_el2 = 4 ;
+	num_att_in_blk2 = 1 ;
+	num_nod_ns1 = 5 ;
+	num_nod_ns2 = 3 ;
+	num_side_ss1 = 2 ;
+	num_df_ss1 = 4 ;
+	num_side_ss2 = 2 ;
+	num_df_ss2 = 4 ;
+	num_qa_rec = 2 ;
+	num_info = 3 ;
+	num_glo_var = 1 ;
+	num_nod_var = 2 ;
+	num_elem_var = 3 ;
+variables:
+	double time_whole(time_step) ;
+	int eb_status(num_el_blk) ;
+	int eb_prop1(num_el_blk) ;
+		eb_prop1:name = "ID" ;
+	int ns_status(num_node_sets) ;
+	int ns_prop1(num_node_sets) ;
+		ns_prop1:name = "ID" ;
+	int ss_status(num_side_sets) ;
+	int ss_prop1(num_side_sets) ;
+		ss_prop1:name = "ID" ;
+	double coordx(num_nodes) ;
+	double coordy(num_nodes) ;
+	char eb_names(num_el_blk, len_name) ;
+	char ns_names(num_node_sets, len_name) ;
+	char ss_names(num_side_sets, len_name) ;
+	char coor_names(num_dim, len_name) ;
+	int elem_map(num_elem) ;
+	double attrib1(num_el_in_blk1, num_att_in_blk1) ;
+	char attrib_name1(num_att_in_blk1, len_name) ;
+	int connect1(num_el_in_blk1, num_nod_per_el1) ;
+		connect1:elem_type = "quad" ;
+	double attrib2(num_el_in_blk2, num_att_in_blk2) ;
+	char attrib_name2(num_att_in_blk2, len_name) ;
+	int connect2(num_el_in_blk2, num_nod_per_el2) ;
+		connect2:elem_type = "quad" ;
+	int eb_prop2(num_el_blk) ;
+		eb_prop2:_FillValue = 0 ;
+		eb_prop2:name = "MATL" ;
+	int eb_prop3(num_el_blk) ;
+		eb_prop3:_FillValue = 0 ;
+		eb_prop3:name = "DENSITY" ;
+	int node_ns1(num_nod_ns1) ;
+	double dist_fact_ns1(num_nod_ns1) ;
+	int node_ns2(num_nod_ns2) ;
+	double dist_fact_ns2(num_nod_ns2) ;
+	int ns_prop2(num_node_sets) ;
+		ns_prop2:_FillValue = 0 ;
+		ns_prop2:name = "FACE" ;
+	int ns_prop3(num_node_sets) ;
+		ns_prop3:name = "VELOCITY" ;
+	int elem_ss1(num_side_ss1) ;
+	int side_ss1(num_side_ss1) ;
+	double dist_fact_ss1(num_df_ss1) ;
+	int elem_ss2(num_side_ss2) ;
+	int side_ss2(num_side_ss2) ;
+	double dist_fact_ss2(num_df_ss2) ;
+	int ss_prop2(num_side_sets) ;
+		ss_prop2:_FillValue = 0 ;
+		ss_prop2:name = "COLOR" ;
+	char qa_records(num_qa_rec, four, len_string) ;
+	char info_records(num_info, len_line) ;
+	char name_glo_var(num_glo_var, len_name) ;
+	double vals_glo_var(time_step, num_glo_var) ;
+	double vals_nod_var1(time_step, num_nodes) ;
+	double vals_nod_var2(time_step, num_nodes) ;
+	char name_nod_var(num_nod_var, len_name) ;
+	char name_elem_var(num_elem_var, len_name) ;
+	double vals_elem_var1eb1(time_step, num_el_in_blk1) ;
+	double vals_elem_var2eb1(time_step, num_el_in_blk1) ;
+	double vals_elem_var3eb1(time_step, num_el_in_blk1) ;
+	double vals_elem_var1eb2(time_step, num_el_in_blk2) ;
+	double vals_elem_var2eb2(time_step, num_el_in_blk2) ;
+	double vals_elem_var3eb2(time_step, num_el_in_blk2) ;
+	int elem_var_tab(num_el_blk, num_elem_var) ;
+
+// global attributes:
+		:floating_point_word_size = 8 ;
+		:file_size = 1 ;
+		:maximum_name_length = 32 ;
+		:int64_status = 0 ;
+		:title = "This is a test" ;
+data:
+
+ time_whole = 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ;
+
+ eb_status = 1, 1 ;
+
+ eb_prop1 = 10, 11 ;
+
+ ns_status = 1, 1 ;
+
+ ns_prop1 = 20, 21 ;
+
+ ss_status = 1, 1 ;
+
+ ss_prop1 = 30, 31 ;
+
+ coordx = 0, 1, 1, 0, 1, 2, 2, 1 ;
+
+ coordy = 0, 0, 1, 1, 0, 0, 1, 1 ;
+
+ eb_names =
+  "",
+  "" ;
+
+ ns_names =
+  "",
+  "" ;
+
+ ss_names =
+  "",
+  "" ;
+
+ coor_names =
+  "xcoor",
+  "ycoor" ;
+
+ elem_map = 1, 2 ;
+
+ attrib1 =
+  3.1416 ;
+
+ attrib_name1 =
+  "" ;
+
+ connect1 =
+  1, 2, 3, 4 ;
+
+ attrib2 =
+  6.1416 ;
+
+ attrib_name2 =
+  "" ;
+
+ connect2 =
+  5, 6, 7, 8 ;
+
+ eb_prop2 = 10, 20 ;
+
+ eb_prop3 = _, _ ;
+
+ node_ns1 = 100, 101, 102, 103, 104 ;
+
+ dist_fact_ns1 = 1, 2, 3, 4, 5 ;
+
+ node_ns2 = 200, 201, 202 ;
+
+ dist_fact_ns2 = 1.1, 2.1, 3.1 ;
+
+ ns_prop2 = 4, 5 ;
+
+ ns_prop3 = 1000, 2000 ;
+
+ elem_ss1 = 11, 12 ;
+
+ side_ss1 = 1, 2 ;
+
+ dist_fact_ss1 = 30, 30.1, 30.2, 30.3 ;
+
+ elem_ss2 = 13, 14 ;
+
+ side_ss2 = 3, 4 ;
+
+ dist_fact_ss2 = 31, 31.1, 31.2, 31.3 ;
+
+ ss_prop2 = 100, 101 ;
+
+ qa_records =
+  "testwtd",
+  "07/07/93",
+  "15:41:33",
+  "FASTQ",
+  "fastq",
+  "07/07/93",
+  "16:41:33" ;
+
+ info_records =
+  "This is the first information record.",
+  "This is the second information record.",
+  "This is the third information record." ;
+
+ name_glo_var =
+  "glo_vars" ;
+
+ vals_glo_var =
+  0.02,
+  0.04,
+  0.06,
+  0.08,
+  0.1,
+  0.12,
+  0.14,
+  0.16,
+  0.18,
+  0.2 ;
+
+ vals_nod_var1 =
+  1.01, 1.02, 1.03, 1.04, 1.05, 1.06, 1.07, 1.08,
+  1.02, 1.04, 1.06, 1.08, 1.1, 1.12, 1.14, 1.16,
+  1.03, 1.06, 1.09, 1.12, 1.15, 1.18, 1.21, 1.24,
+  1.04, 1.08, 1.12, 1.16, 1.2, 1.24, 1.28, 1.32,
+  1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4,
+  1.06, 1.12, 1.18, 1.24, 1.3, 1.36, 1.42, 1.48,
+  1.07, 1.14, 1.21, 1.28, 1.35, 1.42, 1.49, 1.56,
+  1.08, 1.16, 1.24, 1.32, 1.4, 1.48, 1.56, 1.64,
+  1.09, 1.18, 1.27, 1.36, 1.45, 1.54, 1.63, 1.72,
+  1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8 ;
+
+ vals_nod_var2 =
+  2.01, 2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08,
+  2.02, 2.04, 2.06, 2.08, 2.1, 2.12, 2.14, 2.16,
+  2.03, 2.06, 2.09, 2.12, 2.15, 2.18, 2.21, 2.24,
+  2.04, 2.08, 2.12, 2.16, 2.2, 2.24, 2.28, 2.32,
+  2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.4,
+  2.06, 2.12, 2.18, 2.24, 2.3, 2.36, 2.42, 2.48,
+  2.07, 2.14, 2.21, 2.28, 2.35, 2.42, 2.49, 2.56,
+  2.08, 2.16, 2.24, 2.32, 2.4, 2.48, 2.56, 2.64,
+  2.09, 2.18, 2.27, 2.36, 2.45, 2.54, 2.63, 2.72,
+  2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8 ;
+
+ name_nod_var =
+  "nod_var0",
+  "nod_var1" ;
+
+ name_elem_var =
+  "ele_var0",
+  "ele_var1",
+  "ele_var2" ;
+
+ vals_elem_var1eb1 =
+  4.01,
+  4.02,
+  4.03,
+  4.04,
+  4.05,
+  4.06,
+  4.07,
+  4.08,
+  4.09,
+  4.1 ;
+
+ vals_elem_var2eb1 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var3eb1 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var1eb2 =
+  5.01,
+  5.02,
+  5.03,
+  5.04,
+  5.05,
+  5.06,
+  5.07,
+  5.08,
+  5.09,
+  5.1 ;
+
+ vals_elem_var2eb2 =
+  6.01,
+  6.02,
+  6.03,
+  6.04,
+  6.05,
+  6.06,
+  6.07,
+  6.08,
+  6.09,
+  6.1 ;
+
+ vals_elem_var3eb2 =
+  7.01,
+  7.02,
+  7.03,
+  7.04,
+  7.05,
+  7.06,
+  7.07,
+  7.08,
+  7.09,
+  7.1 ;
+
+ elem_var_tab =
+  1, 1, 1,
+  1, 1, 1 ;
+}
diff --git a/exodus/forbind/test/testrd.dmp b/exodus/forbind/test/testrd.dmp
new file mode 100644
index 0000000..a136ffa
--- /dev/null
+++ b/exodus/forbind/test/testrd.dmp
@@ -0,0 +1,798 @@
+
+after exopen, error =   0
+  I/O word size 4
+  Model Size 1
+  Maximum Allowed/Used DB Name Size 3232
+
+after exgini, error =   0
+database parameters:
+title =  This is a test                                                                  
+num_dim =   3
+num_nodes =  26
+num_elem =   5
+num_elem_blk =   5
+num_node_sets =   2
+num_side_sets =   5
+
+after exgcor, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+
+after exgcon, error =   0
+x coord name = xcoor    
+y coord name = ycoor    
+
+after exgmap, error =   0
+elem_map(1) = 1
+elem_map(2) = 2
+elem_map(3) = 3
+elem_map(4) = 4
+elem_map(5) = 5
+
+after exgebi, error =   0
+
+after exgelb, error =   0
+element block id = 10
+element type = quad     
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after exgelb, error =   0
+element block id = 11
+element type = quad     
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after exgelb, error =   0
+element block id = 12
+element type = hex      
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  1
+
+after exgelb, error =   0
+element block id = 13
+element type = tetra    
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after exgelb, error =   0
+element block id = 14
+element type = wedge    
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  1
+
+after exinq, error =   0
+
+There are  3 properties for each element block
+after exgpn, error =   0
+elem block  1 property( 1): ID                               =    10
+elem block  2 property( 1): ID                               =    11
+elem block  3 property( 1): ID                               =    12
+elem block  4 property( 1): ID                               =    13
+elem block  5 property( 1): ID                               =    14
+elem block  1 property( 2): MATL                             =    10
+elem block  2 property( 2): MATL                             =    20
+elem block  3 property( 2): MATL                             =    30
+elem block  4 property( 2): MATL                             =    40
+elem block  5 property( 2): MATL                             =    50
+elem block  1 property( 3): DENSITY                          =     0
+elem block  2 property( 3): DENSITY                          =     0
+elem block  3 property( 3): DENSITY                          =     0
+elem block  4 property( 3): DENSITY                          =     0
+elem block  5 property( 3): DENSITY                          =     0
+
+after exgelc, error =   0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after exgelc, error =   0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after exgelc, error =   0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after exgelc, error =   0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after exgelc, error =   0
+connect array for elem block 14
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 10 has  1 attribute(s) and  1 element(s):
+THICKNESS                        = 3.1416
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 11 has  1 attribute(s) and  1 element(s):
+THICKNESS                        = 6.1416
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 12 has  1 attribute(s) and  1 element(s):
+THICKNESS                        = 6.1416
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 13 has  1 attribute(s) and  1 element(s):
+THICKNESS                        = 6.1416
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 14 has  1 attribute(s) and  1 element(s):
+THICKNESS                        = 6.1416
+
+after exgnsi, error =   0
+
+after exgnp, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+
+after exgns, error =   0
+
+after exgnsd, error =   0
+
+node list for node set 20
+100
+101
+102
+103
+104
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+
+after exgnp, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+
+after exgns, error =   0
+
+after exgnsd, error =   0
+
+node list for node set 21
+200
+201
+202
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+
+after exinq, error =   0
+
+There are  3 properties for each node set
+after exgpn, error =   0
+node set  1 property( 1): ID                               =    20
+node set  2 property( 1): ID                               =    21
+node set  1 property( 2): FACE                             =     4
+node set  2 property( 2): FACE                             =     5
+node set  1 property( 3): VELOCITY                         =  1000
+node set  2 property( 3): VELOCITY                         =  2000
+
+after exinq, error =   0
+
+after EXNSNL =  8 exinq, error =   0
+
+after EXNSDF =  8 exinq, error =   0
+
+after exgcns, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  1
+  6
+node_list = 
+100
+101
+102
+103
+104
+200
+201
+202
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after exgssi, error =   0
+
+after exgsp, error =   0
+side set 30 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+after exgssd, error =   0
+
+element list for side set 30
+  2
+  2
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after exgsp, error =   0
+side set 31 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+after exgssd, error =   0
+
+element list for side set 31
+  1
+  2
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after exgsp, error =   0
+side set 32 parameters:
+num_sides =   7
+num_dist_factors =   0
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+element list for side set 32
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after exgsp, error =   0
+side set 33 parameters:
+num_sides =   4
+num_dist_factors =   0
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+element list for side set 33
+  4
+  4
+  4
+  4
+side list for side set 33
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+no dist factors for side set 33
+
+after exgsp, error =   0
+side set 34 parameters:
+num_sides =   5
+num_dist_factors =   0
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+element list for side set 34
+  5
+  5
+  5
+  5
+  5
+side list for side set 34
+  1
+  2
+  3
+  4
+  5
+node list for side set 34
+ 21
+ 22
+ 25
+ 24
+ 22
+ 23
+ 26
+ 25
+ 21
+ 24
+ 26
+ 23
+ 21
+ 23
+ 22
+ 24
+ 25
+ 26
+no dist factors for side set 34
+
+after exinq, error =   0
+
+There are  2 properties for each side set
+after exgpn, error =   0
+side set  1 property( 1): ID                               =    30
+side set  2 property( 1): ID                               =    31
+side set  3 property( 1): ID                               =    32
+side set  4 property( 1): ID                               =    33
+side set  5 property( 1): ID                               =    34
+side set  1 property( 2): COLOR                            =   100
+side set  2 property( 2): COLOR                            =   101
+side set  3 property( 2): COLOR                            =     0
+side set  4 property( 2): COLOR                            =     0
+side set  5 property( 2): COLOR                            =     0
+
+after exinq: EXSIDS =  5, error =   0
+
+after exinq: EXSSEL = 20, error =   0
+
+after exinq: EXSSNL = 66, error =   0
+
+after exinq: EXSSDF =  8, error =   0
+
+after exgcss, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  4
+  5
+num_df_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  1
+  3
+  5
+ 12
+ 16
+df_ind = 
+  1
+  5
+  9
+  9
+  9
+elem_list = 
+  2
+  2
+  1
+  2
+  3
+  3
+  3
+  3
+  3
+  3
+  3
+  4
+  4
+  4
+  4
+  5
+  5
+  5
+  5
+  5
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  2
+  3
+  4
+  5
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after exinq, error =   0
+
+after exgqa, error =   0
+QA records = 
+testwt                          
+07/07/93                        
+15:41:33                        
+FASTQ                           
+fastq                           
+07/07/93                        
+16:41:33                        
+
+after exinq, error =   0
+
+after exginf, error =   0
+info records = 
+ This is the first information record.                                           
+ This is the second information record.                                          
+ This is the third information record.                                           
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  1 global variables; their names are :
+glo_vars 
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  2 nodal variables; their names are :
+nod_var0 
+nod_var1 
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  3 element variables; their names are :
+ele_var0 
+ele_var1 
+ele_var2 
+
+after exgvtt, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after exinq, error =   0
+There are 10 time steps in the database.
+
+after exgtim, error =   0
+time value at time step  3 = 0.030
+
+after exgatm, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after exggv, error =   0
+global variable values at time step  3
+0.060
+
+after exggvt, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after exgnv, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+
+after exgnvt, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+after exgebi, error =   0
+
+after exgev, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after exgev, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after exgev, error =   0
+element variable  1 values of element block 12 at time step  3
+6.030
+
+after exgev, error =   0
+element variable  1 values of element block 13 at time step  3
+7.030
+
+after exgev, error =   0
+element variable  1 values of element block 14 at time step  3
+8.030
+
+after exgevt, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+after exclos, error =   0
diff --git a/exodus/forbind/test/testrd.f b/exodus/forbind/test/testrd.f
new file mode 100644
index 0000000..24b079a
--- /dev/null
+++ b/exodus/forbind/test/testrd.f
@@ -0,0 +1,771 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testrd
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database read routines
+c
+c	09/07/93 V.R. Yarberry - Modified for API 2.00
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, ierr
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_node_sets
+      integer num_side_sets
+      integer i, j, k, elem_map(5), connect(10), node_list(100) 
+      integer elem_list(100), side_list(100), ids(10) 
+      integer num_elem_per_set(10), num_nodes_per_set(10)
+      integer num_df_per_set(10)
+      integer num_df_in_set, num_sides_in_set
+      integer df_ind(10),node_ind(10),elem_ind(10),num_qa_rec,num_info
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,5)
+      integer num_time_steps
+      integer num_elem_in_block(10), num_nodes_per_elem(10)
+      integer num_attr(10), node_ctr_list(10), node_ctr
+      integer num_nodes_in_set, num_elem_in_set
+      integer df_list_len, list_len, elem_list_len, node_list_len
+      integer node_num, time_step, var_index, beg_time, end_time
+      integer elem_num
+      integer cpu_ws,io_ws, mod_sz
+      integer num_props, prop_value
+      integer mxalnmlen, mxusnmlen
+
+      real time_value, time_values(100), var_values(100)
+      real x(100), y(100), z(100)
+      real attrib(100), dist_fact(100)
+      real vers, fdum
+
+      character*(MXSTLN) coord_names(3), qa_record(4,2), var_names(3)
+      character*(MXLNLN) inform(3), titl
+      character typ*(MXSTLN), cdum*1
+      character*(MXSTLN) prop_names(3)
+      character*(MXSTLN) attrib_names(100)
+
+      data iin /5/, iout /6/
+
+
+c
+c open EXODUS II files
+c
+
+      cpu_ws = 0
+      io_ws = 0
+
+      exoid = excre("test.exo", EXNOCL, cpu_ws, io_ws, ierr)
+  
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '("  I/O word size",i2)') io_ws
+
+      mod_sz = exlgmd(exoid)
+      write (iout, '("  Model Size",i2)') mod_sz
+
+      call exinq (exoid, EXNEBP, num_props, fdum, cdum, ierr)
+      call exinq (exoid, EXDBMXALNM, mxalnmlen, fdum, cdum, ierr)
+      call exinq (exoid, EXDBMXUSNM, mxusnmlen, fdum, cdum, ierr)
+      write (iout, '("  Maximum Allowed/Used DB Name Size ",i2,i2)')
+     *  mxalnmlen, mxusnmlen
+      
+c
+c read database parameters
+c
+
+      call exgini (exoid, titl, num_dim, num_nodes, num_elem, 
+     1             num_elem_blk, num_node_sets, num_side_sets, ierr)
+      write (iout, '(/"after exgini, error = ", i3)' ) ierr
+
+      write (iout, '("database parameters:"/
+     1               "title = ", a81 /
+     2               "num_dim = ", i3 /
+     3               "num_nodes = ", i3 /
+     4               "num_elem = ", i3 /
+     5               "num_elem_blk = ", i3 /
+     6               "num_node_sets = ", i3 /
+     7               "num_side_sets = ", i3)')
+     8               titl,num_dim, num_nodes, num_elem,
+     9               num_elem_blk,num_node_sets, num_side_sets
+
+
+c
+c read nodal coordinates values and names from database
+c
+
+      call exgcor (exoid, x, y, z, ierr)
+      write (iout, '(/"after exgcor, error = ", i3)' ) ierr
+
+      write (iout, '("x coords = ")')
+      do 10 i = 1, num_nodes
+         write (iout, '(f5.1)') x(i)
+10    continue
+
+      write (iout, '("y coords = ")')
+      do 20 i = 1, num_nodes
+         write (iout, '(f5.1)') y(i)
+20    continue
+
+      if (num_dim .gt. 2) then
+      write (iout, '("z coords = ")')
+      do 22 i = 1, num_nodes
+         write (iout, '(f5.1)') z(i)
+22    continue
+      endif
+
+      call exgcon (exoid, coord_names, ierr)
+      write (iout, '(/"after exgcon, error = ", i3)' ) ierr
+ 
+      write (iout, '("x coord name = ", a9)') coord_names(1)
+      write (iout, '("y coord name = ", a9)') coord_names(2)
+
+c
+c read element order map
+c
+ 
+      call exgmap (exoid, elem_map, ierr)
+      write (iout, '(/"after exgmap, error = ", i3)' ) ierr
+ 
+      do 30 i = 1, num_elem
+         write (iout, '("elem_map(",i1,") = ", i1)') i, elem_map(i)
+30    continue
+
+c
+c read element block parameters
+c
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 40 i = 1, num_elem_blk
+
+         call exgelb (exoid, ids(i), typ, num_elem_in_block(i),
+     1                num_nodes_per_elem(i), num_attr(i), ierr)
+         write (iout, '(/"after exgelb, error = ", i3)' ) ierr
+
+         write (iout, '("element block id = ", i2,/
+     1                  "element type = ", a9,/
+     2                  "num_elem_in_block = ", i2,/
+     3                  "num_nodes_per_elem = ", i2,/
+     4                  "num_attr = ", i2)')
+     5                  ids(i), typ, num_elem_in_block(i), 
+     6                  num_nodes_per_elem(i), num_attr(i)
+
+40    continue
+
+c     read element block properties */
+
+      call exinq (exoid, EXNEBP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each element block")')
+     2	num_props
+
+
+      call exgpn(exoid, EXEBLK, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 47 i = 1, num_props
+        do 45 j = 1, num_elem_blk
+          call exgp(exoid, EXEBLK,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("elem block ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+45      continue
+47    continue
+
+c
+c read element connectivity
+c
+
+      do 60 i = 1, num_elem_blk
+
+         call exgelc (exoid, ids(i), connect, ierr)
+         write (iout, '(/"after exgelc, error = ", i3)' ) ierr
+ 
+         write (iout, '("connect array for elem block ", i2)') ids(i)
+
+         do 50 j = 1, num_nodes_per_elem(i)
+            write (iout, '(i3)') connect(j)
+50       continue
+
+60    continue
+
+c
+c read element block attributes
+c
+
+      do 70 i = 1, num_elem_blk
+
+         call exgeat (exoid, ids(i), attrib, ierr)
+         write (iout, '(/"after exgeat, error = ", i3)' ) ierr
+
+         call exgean (exoid, ids(i), num_attr(i), attrib_names, ierr)
+         write (iout, '(/"after exgean, error = ", i3)' ) ierr
+ 
+         write (iout,
+     *     '("element block ", i2, " has ",i2," attribute(s) and ",
+     *     i2, " element(s):")')
+     1          ids(i), num_attr(i), num_elem_in_block(i)
+         do j=1, num_attr(i)
+           write (iout, 69) attrib_names(j),
+     *       (attrib(k),k= j, num_attr(i)*num_elem_in_block(i),
+     *       num_attr(i))
+         end do
+ 69      format(A32," = ", 10(f6.4,2x))
+70    continue
+
+c
+c read individual node sets
+c
+      if (num_node_sets .gt. 0) then
+         call exgnsi (exoid, ids, ierr)
+         write (iout, '(/"after exgnsi, error = ", i3)' ) ierr
+      endif
+
+      do 100 i = 1, num_node_sets
+
+         call exgnp (exoid, ids(i), num_nodes_in_set, 
+     1               num_df_in_set, ierr)
+         write (iout, '(/"after exgnp, error = ", i3)' ) ierr
+
+         write (iout, '(/"node set ", i2, " parameters: ",/
+     2                  "num_nodes = ", i2)') ids(i), num_nodes_in_set
+
+         call exgns (exoid, ids(i), node_list, ierr)
+         write (iout, '(/"after exgns, error = ", i3)' ) ierr
+
+         if (num_df_in_set .gt. 0) then
+           call exgnsd (exoid, ids(i), dist_fact, ierr)
+           write (iout, '(/"after exgnsd, error = ", i3)' ) ierr
+	 endif
+
+         write (iout, '(/"node list for node set ", i2)') ids(i)
+ 
+         do 80 j = 1, num_nodes_in_set
+            write (iout, '(i3)') node_list(j)
+80       continue
+
+	 if (num_df_in_set .gt. 0) then
+           write (iout, '("dist factors for node set ", i2)') ids(i)
+           do 90 j = 1, num_nodes_in_set
+             write (iout, '(f5.2)') dist_fact(j)
+90         continue
+	 else
+           write (iout, '("no dist factors for node set ", i2)') ids(i)
+	 endif
+
+100   continue
+
+c     read node set properties
+
+      call exinq (exoid, EXNNSP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each node set")')
+     2	num_props
+
+
+      call exgpn(exoid, EXNSET, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 107 i = 1, num_props
+        do 105 j = 1, num_node_sets
+          call exgp(exoid,EXNSET,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("node set ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+105      continue
+107    continue
+
+c
+c read concatenated node sets; this produces the same information as
+c the above code which reads individual node sets
+c
+      call exinq (exoid, EXNODS, num_node_sets, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+ 
+      if (num_node_sets .gt. 0) then
+         call exinq (exoid, EXNSNL, list_len, fdum, cdum, ierr)
+         write(iout,'(/"after EXNSNL =",i3," exinq, error = ",i3)')
+     1			list_len,ierr
+ 
+         call exinq (exoid, EXNSDF, list_len, fdum, cdum, ierr)
+         write(iout,'(/"after EXNSDF =",i3," exinq, error = ",i3)')
+     1			list_len,ierr
+ 
+         call exgcns (exoid, ids, num_nodes_per_set, num_df_per_set,
+     1                node_ind, df_ind, node_list, dist_fact, ierr)
+         write (iout, '(/"after exgcns, error = ", i3)' ) ierr
+ 
+         write (iout, '(/"concatenated node set info")')
+ 
+         write (iout, '("ids = ")')
+
+         do 110 i = 1, num_node_sets
+            write (iout, '(i3)') ids(i)
+110      continue
+
+         write (iout, '("num_nodes_per_set = ")')
+
+         do 120 i = 1, num_node_sets
+            write (iout, '(i3)') num_nodes_per_set(i)
+120      continue
+
+         write (iout, '("node_ind = ")')
+
+         do 130 i = 1, num_node_sets
+            write (iout, '(i3)') node_ind(i)
+130      continue
+
+         write (iout, '("node_list = ")')
+
+         do 140 i = 1, list_len
+            write (iout, '(i3)') node_list(i)
+140      continue
+
+         write (iout, '("dist_fact = ")')
+
+         do 150 i = 1, list_len
+            write (iout, '(f5.3)') dist_fact(i)
+150      continue
+      endif
+
+c
+c read individual side sets
+c
+      if (num_side_sets .gt. 0) then
+         call exgssi (exoid, ids, ierr)
+         write (iout, '(/"after exgssi, error = ", i3)' ) ierr
+      endif
+
+      do 190 i = 1, num_side_sets
+
+         call exgsp (exoid, ids(i), num_sides_in_set, num_df_in_set,
+     1               ierr)
+         write (iout, '(/"after exgsp, error = ", i3)' ) ierr
+ 
+         write (iout, '("side set ", i2, " parameters:",/
+     2          "num_sides = ", i3,/
+     3          "num_dist_factors = ", i3)')
+     4          ids(i), num_sides_in_set, num_df_in_set
+ 
+         call exgss (exoid, ids(i), elem_list, side_list, ierr)
+         write (iout, '(/"after exgss, error = ", i3)' ) ierr
+
+         call exgssn (exoid, ids(i), node_ctr_list, node_list, ierr)
+         write (iout, '(/"after exgssn, error = ", i3)' ) ierr
+
+	 if (num_df_in_set .gt. 0) then
+           call exgssd (exoid, ids(i), dist_fact, ierr)
+           write (iout, '(/"after exgssd, error = ", i3)' ) ierr
+         endif
+
+         write (iout, '(/"element list for side set ", i2)') ids(i)
+
+         num_elem_in_set = num_sides_in_set
+         do 160 j = 1, num_elem_in_set
+            write (iout, '(i3)') elem_list(j)
+160      continue
+
+         write (iout, '("side list for side set ", i2)') ids(i)
+
+         do 170 j = 1, num_sides_in_set
+            write (iout, '(i3)') side_list(j)
+170      continue
+
+	 node_ctr = 0
+	 write (iout, '("node list for side set ", i2)') ids(i)
+	 do 178 k=1, num_elem_in_set
+	   do 175 j=1, node_ctr_list(k)
+	     write (iout, '(i3)') node_list(j+node_ctr)
+175	   continue
+	   node_ctr = node_ctr+node_ctr_list(k)
+178	 continue
+
+	 if (num_df_in_set .gt. 0) then
+           write (iout, '("dist factors for side set ", i2)') ids(i)
+           do 180 j = 1, num_df_in_set
+             write (iout, '(f6.3)') dist_fact(j)
+180        continue
+	 else
+           write (iout, '("no dist factors for side set ", i2)') ids(i)
+         endif
+
+190   continue
+
+c     read side set properties
+
+      call exinq (exoid, EXNSSP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each side set")')
+     2	num_props
+
+
+      call exgpn(exoid, EXSSET, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 197 i = 1, num_props
+        do 195 j = 1, num_side_sets
+          call exgp(exoid, EXSSET,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("side set ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+195      continue
+197    continue
+
+      call exinq (exoid, EXSIDS, num_side_sets, fdum, cdum, ierr)
+      write (iout, '(/"after exinq: EXSIDS =",i3,", error = ",i3)')
+     1		num_side_sets,ierr
+ 
+      if (num_side_sets .gt. 0) then
+         call exinq (exoid, EXSSEL, elem_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSEL =",i3,", error = ",i3)')
+     1		elem_list_len,ierr
+ 
+         call exinq (exoid, EXSSNL, node_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSNL =",i3,", error = ",i3)')
+     1		node_list_len,ierr
+ 
+         call exinq (exoid, EXSSDF, df_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSDF =",i3,", error = ",i3)')
+     1		df_list_len,ierr
+c
+c read concatenated side sets; this produces the same information as
+c the above code which reads individual side sets
+c
+         call exgcss (exoid, ids, num_elem_per_set, num_df_per_set, 
+     1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+     2             ierr)
+         write (iout, '(/"after exgcss, error = ", i3)' ) ierr
+ 
+         write (iout, '("concatenated side set info")')
+ 
+         write (iout, '("ids = ")')
+
+         do 200 i = 1, num_side_sets
+            write (iout, '(i3)') ids(i)
+200      continue
+
+         write (iout, '("num_elem_per_set = ")')
+
+         do 210 i = 1, num_side_sets
+            write (iout, '(i3)') num_elem_per_set(i)
+210      continue
+
+         write (iout, '("num_df_per_set = ")')
+
+         do 220 i = 1, num_side_sets
+            write (iout, '(i3)') num_df_per_set(i)
+220      continue
+
+         write (iout, '("elem_ind = ")')
+
+         do 230 i = 1, num_side_sets
+            write (iout, '(i3)') elem_ind(i)
+230      continue
+
+         write (iout, '("df_ind = ")')
+
+         do 240 i = 1, num_side_sets
+            write (iout, '(i3)') df_ind(i)
+240      continue
+
+         write (iout, '("elem_list = ")')
+
+         do 250 i = 1, elem_list_len
+            write (iout, '(i3)') elem_list(i)
+250      continue
+
+         write (iout, '("side_list = ")')
+
+         do 260 i = 1, elem_list_len
+            write (iout, '(i3)') side_list(i)
+260      continue
+
+         write (iout, '("dist_fact = ")')
+
+         do 270 i = 1, df_list_len
+            write (iout, '(f6.3)') dist_fact(i)
+270      continue
+      endif
+
+c
+c read QA records
+c
+      call exinq (exoid, EXQA, num_qa_rec, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+
+      call exgqa (exoid, qa_record, ierr) 
+      write (iout, '(/"after exgqa, error = ", i3)' ) ierr
+ 
+      write (iout, '("QA records = ")')
+
+      do 290 i = 1, num_qa_rec
+         do 280 j = 1, 4
+            write (iout, '(a)') qa_record(j,i)
+280      continue
+290   continue
+
+c
+c read information records
+c
+      call exinq (exoid, EXINFO, num_info, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+ 
+      call exginf (exoid, inform, ierr) 
+      write (iout, '(/"after exginf, error = ", i3)' ) ierr
+
+      write (iout, '("info records = ")')
+
+      do 300 i = 1, num_info
+         write (iout, '(a81)') inform(i)
+300   continue
+
+c
+c read global variables parameters and names 
+c
+      call exgvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," global variables; their names ",
+     1                "are :")')  num_glo_vars
+
+      do 320 i = 1, num_glo_vars
+         write (iout, '(a9)') var_names(i)
+320   continue
+
+c
+c read nodal variables parameters and names
+c
+      call exgvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," nodal variables; their names ",
+     1                "are :")')  num_nod_vars
+
+      do 330 i = 1, num_nod_vars
+         write (iout, '(a9)') var_names(i)
+330   continue
+
+c
+c read element variables parameters and names
+c
+      call exgvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," element variables; their names ",
+     1                "are :")')  num_ele_vars
+
+      do 340 i = 1, num_ele_vars
+         write (iout, '(a9)') var_names(i)
+340   continue
+
+c
+c read element variable truth table
+c
+      call exgvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '(/"after exgvtt, error = ", i3)' ) ierr
+
+      write (iout, '("This is the element variable truth table:")')
+
+      do 360 i = 1, num_elem_blk
+         do 350 j = 1, num_ele_vars
+            write (iout, '(i2)') truth_tab(j,i)
+350      continue
+360   continue
+
+c
+c determine how many time steps are stored
+c
+      call exinq (exoid, EXTIMS, num_time_steps, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+
+      write (iout, '("There are ",i2," time steps in the database.")') 
+     1       num_time_steps
+c
+c read time value at one time step
+c
+      time_step = 3
+      call exgtim (exoid, time_step, time_value, ierr)
+      write (iout, '(/"after exgtim, error = ", i3)' ) ierr
+ 
+      write (iout, '("time value at time step ",i2," = ", f5.3)') 
+     1       time_step, time_value
+c
+c read time values at all time steps
+c
+      call exgatm (exoid, time_values, ierr)
+      write (iout, '(/"after exgatm, error = ", i3)' ) ierr
+ 
+      write (iout, '("time values at all time steps are:")')
+
+      do 370 i = 1, num_time_steps
+         write (iout, '(f5.3)') time_values(i)
+370   continue
+
+      var_index = 1
+      beg_time = 1
+      end_time = -1
+c
+c read all global variables at one time step
+c
+      call exggv (exoid, time_step, num_glo_vars, var_values, ierr)
+      write (iout, '(/"after exggv, error = ", i3)' ) ierr
+ 
+      write (iout, '("global variable values at time step ",i2)') 
+     1       time_step
+
+      do 400 i = 1, num_glo_vars
+         write (iout, '(f5.3)') var_values(i)
+400   continue
+
+c
+c read a single global variable through time
+c
+      call exggvt (exoid, var_index, beg_time, end_time, var_values,
+     1             ierr)
+      write (iout, '(/"after exggvt, error = ", i3)' ) ierr
+ 
+      write (iout, '("global variable ",i2," values through time:")')
+     1       var_index
+
+      do 410 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+410   continue
+
+c
+c read a nodal variable at one time step
+c
+      call exgnv (exoid, time_step, var_index, num_nodes, var_values,
+     1            ierr)
+      write (iout, '(/"after exgnv, error = ", i3)' ) ierr
+
+      write (iout, '("nodal variable ",i2," values at time step ",i2)') 
+     1       var_index, time_step
+
+      do 420 i = 1, num_nodes
+         write (iout, '(f5.3)') var_values(i)
+420   continue
+
+c
+c read a nodal variable through time
+c
+      node_num = 1
+
+      call exgnvt (exoid, var_index, node_num, beg_time, end_time, 
+     1             var_values, ierr)
+      write (iout, '(/"after exgnvt, error = ", i3)' ) ierr
+ 
+      write (iout, '("nodal variable ",i2," values for node ",i2,
+     1               " through time:")') var_index, node_num
+
+      do 430 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+430   continue
+
+c
+c read an element variable at one time step
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 450 i = 1, num_elem_blk
+
+         call exgev (exoid, time_step, var_index, ids(i), 
+     1               num_elem_in_block(i), var_values, ierr)
+         write (iout, '(/"after exgev, error = ", i3)' ) ierr
+ 
+         if (ierr .eq. 0) then
+            write (iout, '("element variable ",i2," values of element ",
+     1                     "block ",i2," at time step ",i2)')
+     2                     var_index, ids(i), time_step
+         endif
+
+         do 440 j = 1, num_elem_in_block(i)
+            write (iout, '(f5.3)') var_values(j)
+440      continue
+
+450   continue
+
+c
+c read an element variable through time
+c
+      var_index = 2
+      elem_num = 2
+
+      call exgevt (exoid, var_index, elem_num, beg_time, end_time, 
+     1             var_values, ierr)
+      write (iout, '(/"after exgevt, error = ", i3)' ) ierr
+ 
+      write (iout, '("element variable ",i2," values for element ",i2,
+     1               " through time:")') var_index, elem_num
+
+      do 460 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+460   continue
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testrd1.dmp b/exodus/forbind/test/testrd1.dmp
new file mode 100644
index 0000000..3d9ea50
--- /dev/null
+++ b/exodus/forbind/test/testrd1.dmp
@@ -0,0 +1,917 @@
+
+after exopen, error =   0
+  I/O word size 4
+
+after exgini, error =   0
+database parameters:
+title =  This is testwt1                                                                 
+num_dim =   3
+num_nodes =  28
+num_elem =   8
+num_elem_blk =   7
+num_node_sets =   2
+num_side_sets =   5
+
+after exgcor, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+100.0
+ 50.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+100.0
+ 50.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  0.0
+ 20.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+
+after exgcon, error =   0
+x coord name = xcoor    
+y coord name = ycoor    
+
+after exgmp, error =   0
+
+after exgpa, error =   0
+
+after exgem, error =   0
+
+element map id = 111
+elem_map(  1) =   1
+elem_map(  2) =   2
+elem_map(  3) =   3
+elem_map(  4) =   4
+elem_map(  5) =   5
+elem_map(  6) =   6
+elem_map(  7) =   7
+elem_map(  8) =   8
+
+after exgem, error =   0
+
+element map id = 222
+elem_map(  1) =   2
+elem_map(  2) =   4
+elem_map(  3) =   6
+elem_map(  4) =   8
+elem_map(  5) =  10
+elem_map(  6) =  12
+elem_map(  7) =  14
+elem_map(  8) =  16
+
+after exinq, error =   0
+
+There are  3 properties for each element map
+after exgpn, error =   0
+elem map  1 property( 1): ID                               =   111
+elem map  2 property( 1): ID                               =   222
+elem map  1 property( 2): ORDER                            =     1
+elem map  2 property( 2): ORDER                            =     0
+elem map  1 property( 3): NUMBER                           =     0
+elem map  2 property( 3): NUMBER                           =     1
+
+after exgpa, error =   0
+
+after exgnm, error =   0
+
+node map id = 333
+node_map(  1) =   3
+node_map(  2) =   6
+node_map(  3) =   9
+node_map(  4) =  12
+node_map(  5) =  15
+node_map(  6) =  18
+node_map(  7) =  21
+node_map(  8) =  24
+node_map(  9) =  27
+node_map( 10) =  30
+node_map( 11) =  33
+node_map( 12) =  36
+node_map( 13) =  39
+node_map( 14) =  42
+node_map( 15) =  45
+node_map( 16) =  48
+node_map( 17) =  51
+node_map( 18) =  54
+node_map( 19) =  57
+node_map( 20) =  60
+node_map( 21) =  63
+node_map( 22) =  66
+node_map( 23) =  69
+node_map( 24) =  72
+node_map( 25) =  75
+node_map( 26) =  78
+node_map( 27) =  81
+node_map( 28) =  84
+
+after exinq, error =   0
+
+There are  2 properties for each node map
+after exgpn, error =   0
+node map  1 property( 1): ID                               =   333
+node map  1 property( 2): NUMBER                           =     1
+
+after exgebi, error =   0
+
+after exgelb, error =   0
+element block id = 10
+element type = quad     
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  3
+
+after exgelb, error =   0
+element block id = 11
+element type = quad     
+num_elem_in_block =  2
+num_nodes_per_elem =  4
+num_attr =  3
+
+after exgelb, error =   0
+element block id = 12
+element type = hex      
+num_elem_in_block =  1
+num_nodes_per_elem =  8
+num_attr =  3
+
+after exgelb, error =   0
+element block id = 13
+element type = tetra    
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  3
+
+after exgelb, error =   0
+element block id = 14
+element type = circle   
+num_elem_in_block =  1
+num_nodes_per_elem =  1
+num_attr =  3
+
+after exgelb, error =   0
+element block id = 15
+element type = sphere   
+num_elem_in_block =  1
+num_nodes_per_elem =  1
+num_attr =  3
+
+after exgelb, error =   0
+element block id = 16
+element type = wedge    
+num_elem_in_block =  1
+num_nodes_per_elem =  6
+num_attr =  3
+
+after exinq, error =   0
+
+There are  3 properties for each element block
+after exgpn, error =   0
+elem block  1 property( 1): ID                               =    10
+elem block  2 property( 1): ID                               =    11
+elem block  3 property( 1): ID                               =    12
+elem block  4 property( 1): ID                               =    13
+elem block  5 property( 1): ID                               =    14
+elem block  6 property( 1): ID                               =    15
+elem block  7 property( 1): ID                               =    16
+elem block  1 property( 2): MATL                             =    10
+elem block  2 property( 2): MATL                             =    20
+elem block  3 property( 2): MATL                             =    30
+elem block  4 property( 2): MATL                             =    40
+elem block  5 property( 2): MATL                             =    50
+elem block  6 property( 2): MATL                             =    60
+elem block  7 property( 2): MATL                             =    70
+elem block  1 property( 3): DENSITY                          =     0
+elem block  2 property( 3): DENSITY                          =     0
+elem block  3 property( 3): DENSITY                          =     0
+elem block  4 property( 3): DENSITY                          =     0
+elem block  5 property( 3): DENSITY                          =     0
+elem block  6 property( 3): DENSITY                          =     0
+elem block  7 property( 3): DENSITY                          =     0
+
+after exgelc, error =   0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after exgelc, error =   0
+connect array for elem block 11
+  1
+  2
+  3
+  4
+
+after exgelc, error =   0
+connect array for elem block 12
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+
+after exgelc, error =   0
+connect array for elem block 13
+ 17
+ 18
+ 19
+ 20
+
+after exgelc, error =   0
+connect array for elem block 14
+ 21
+
+after exgelc, error =   0
+connect array for elem block 15
+ 22
+
+after exgelc, error =   0
+connect array for elem block 16
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 10 has  3 attribute(s) and  1 element(s):
+attribute_1                      = 1.0000
+attribute_2                      = 2.0000
+attribute_3                      = 3.0000
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 11 has  3 attribute(s) and  2 element(s):
+attribute_1                      = 1.1100  1.1200
+attribute_2                      = 2.1100  2.1200
+attribute_3                      = 3.1100  3.1200
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 12 has  3 attribute(s) and  1 element(s):
+attribute_1                      = 1.2000
+attribute_2                      = 2.2000
+attribute_3                      = 3.2000
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 13 has  3 attribute(s) and  1 element(s):
+attribute_1                      = 1.3000
+attribute_2                      = 2.3000
+attribute_3                      = 3.3000
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 14 has  3 attribute(s) and  1 element(s):
+attribute_1                      = 1.4000
+attribute_2                      = 2.4000
+attribute_3                      = 3.4000
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 15 has  3 attribute(s) and  1 element(s):
+attribute_1                      = 1.5000
+attribute_2                      = 2.5000
+attribute_3                      = 3.5000
+
+after exgeat, error =   0
+
+after exgean, error =   0
+element block 16 has  3 attribute(s) and  1 element(s):
+attribute_1                      = 1.6000
+attribute_2                      = 2.6000
+attribute_3                      = 3.6000
+
+after exgnsi, error =   0
+
+after exgnp, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+
+after exgns, error =   0
+
+after exgnsd, error =   0
+
+node list for node set 20
+100
+101
+102
+103
+104
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+
+after exgnp, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+
+after exgns, error =   0
+
+after exgnsd, error =   0
+
+node list for node set 21
+200
+201
+202
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+
+after exinq, error =   0
+
+There are  3 properties for each node set
+after exgpn, error =   0
+node set  1 property( 1): ID                               =    20
+node set  2 property( 1): ID                               =    21
+node set  1 property( 2): FACE                             =     4
+node set  2 property( 2): FACE                             =     5
+node set  1 property( 3): VELOCITY                         =  1000
+node set  2 property( 3): VELOCITY                         =  2000
+
+after exinq, error =   0
+
+after EXNSNL =  8 exinq, error =   0
+
+after EXNSDF =  8 exinq, error =   0
+
+after exgcns, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  1
+  6
+node_list = 
+100
+101
+102
+103
+104
+200
+201
+202
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after exgssi, error =   0
+
+after exgsp, error =   0
+side set 30 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+after exgssd, error =   0
+
+element list for side set 30
+  3
+  3
+side list for side set 30
+  4
+  2
+node list for side set 30
+  8
+  5
+  6
+  7
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after exgsp, error =   0
+side set 31 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+after exgssd, error =   0
+
+element list for side set 31
+  1
+  3
+side list for side set 31
+  2
+  3
+node list for side set 31
+  2
+  3
+  7
+  8
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after exgsp, error =   0
+side set 32 parameters:
+num_sides =   7
+num_dist_factors =   0
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+element list for side set 32
+  4
+  4
+  4
+  4
+  4
+  4
+  4
+side list for side set 32
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+node list for side set 32
+  9
+ 12
+ 11
+ 10
+ 11
+ 12
+ 16
+ 15
+ 11
+ 12
+ 16
+ 15
+ 10
+ 11
+ 15
+ 14
+  9
+ 13
+ 16
+ 12
+  9
+ 10
+ 14
+ 13
+ 13
+ 14
+ 15
+ 16
+no dist factors for side set 32
+
+after exgsp, error =   0
+side set 33 parameters:
+num_sides =   4
+num_dist_factors =   0
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+element list for side set 33
+  5
+  5
+  5
+  5
+side list for side set 33
+  1
+  2
+  3
+  4
+node list for side set 33
+ 17
+ 18
+ 20
+ 18
+ 19
+ 20
+ 17
+ 20
+ 19
+ 17
+ 19
+ 18
+no dist factors for side set 33
+
+after exgsp, error =   0
+side set 34 parameters:
+num_sides =   2
+num_dist_factors =   0
+
+after exgss, error =   0
+
+after exgssn, error =   0
+
+element list for side set 34
+  6
+  7
+side list for side set 34
+  1
+  1
+node list for side set 34
+ 21
+ 22
+no dist factors for side set 34
+
+after exinq, error =   0
+
+There are  2 properties for each side set
+after exgpn, error =   0
+side set  1 property( 1): ID                               =    30
+side set  2 property( 1): ID                               =    31
+side set  3 property( 1): ID                               =    32
+side set  4 property( 1): ID                               =    33
+side set  5 property( 1): ID                               =    34
+side set  1 property( 2): COLOR                            =   100
+side set  2 property( 2): COLOR                            =   101
+side set  3 property( 2): COLOR                            =     0
+side set  4 property( 2): COLOR                            =     0
+side set  5 property( 2): COLOR                            =     0
+
+after exinq: EXSIDS =  5, error =   0
+
+after exinq: EXSSEL = 17, error =   0
+
+after exinq: EXSSNL = 50, error =   0
+
+after exinq: EXSSDF =  8, error =   0
+
+after exgcss, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+ 32
+ 33
+ 34
+num_elem_per_set = 
+  2
+  2
+  7
+  4
+  2
+num_df_per_set = 
+  4
+  4
+  0
+  0
+  0
+elem_ind = 
+  1
+  3
+  5
+ 12
+ 16
+df_ind = 
+  1
+  5
+  9
+  9
+  9
+elem_list = 
+  3
+  3
+  1
+  3
+  4
+  4
+  4
+  4
+  4
+  4
+  4
+  5
+  5
+  5
+  5
+  6
+  7
+side_list = 
+  4
+  2
+  2
+  3
+  5
+  3
+  3
+  2
+  4
+  1
+  6
+  1
+  2
+  3
+  4
+  1
+  1
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after exinq, error =   0
+
+after exgqa, error =   0
+QA records = 
+testwt1                         
+03/16/94                        
+15:41:33                        
+FASTQ                           
+fastq                           
+07/07/93                        
+16:41:33                        
+
+after exinq, error =   0
+
+after exginf, error =   0
+info records = 
+ This is the first information record.                                           
+ This is the second information record.                                          
+ This is the third information record.                                           
+
+after exgvp, error =   0
+
+after exgvnm, error =   0
+There are  1 global variables; their names are :
+glo vars 
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  2 nodal variables; their names are :
+nod_var0 
+nod_var1 
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  3 element variables; their names are :
+ele_var0 
+ele_var1 
+ele_var2 
+
+after exgvtt, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 0
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after exinq, error =   0
+There are 10 time steps in the database.
+
+after exgtim, error =   0
+time value at time step  3 = 0.030
+
+after exgatm, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after exggv, error =   0
+global variable values at time step  3
+0.060
+
+after exggvt, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after exgnv, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+1.270
+1.300
+1.330
+1.360
+1.390
+1.420
+1.450
+1.480
+1.510
+1.540
+1.570
+1.600
+1.630
+1.660
+1.690
+1.720
+1.750
+1.780
+1.810
+1.840
+
+after exgnvt, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+after exgebi, error =   0
+
+after exgev, error =   0
+element variable  1 values of element block 10 at time step  3
+ 4.030
+
+after exgev, error =   0
+element variable  1 values of element block 11 at time step  3
+ 5.030
+ 5.060
+
+after exgev, error =  -1
+ 5.030
+
+after exgev, error =   0
+element variable  1 values of element block 13 at time step  3
+ 7.030
+
+after exgev, error =   0
+element variable  1 values of element block 14 at time step  3
+ 8.030
+
+after exgev, error =   0
+element variable  1 values of element block 15 at time step  3
+ 9.030
+
+after exgev, error =   0
+element variable  1 values of element block 16 at time step  3
+10.030
+
+after exgevt, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+after exclos, error =   0
diff --git a/exodus/forbind/test/testrd1.f b/exodus/forbind/test/testrd1.f
new file mode 100644
index 0000000..3f0661d
--- /dev/null
+++ b/exodus/forbind/test/testrd1.f
@@ -0,0 +1,857 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testrd1
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database read routines
+c
+c	09/07/93 V.R. Yarberry - Modified for API 2.00
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, ierr
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_node_sets
+      integer num_side_sets
+      integer i, j, k, elem_map(10), connect(10), node_list(100) 
+      integer elem_list(100), side_list(100), ids(10), node_map(100) 
+      integer num_elem_per_set(10), num_nodes_per_set(10)
+      integer num_df_per_set(10)
+      integer num_df_in_set, num_sides_in_set
+      integer df_ind(10),node_ind(10),elem_ind(10),num_qa_rec,num_info
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,7)
+      integer num_time_steps
+      integer num_elem_in_block(10), num_nodes_per_elem(10)
+      integer num_attr(10), node_ctr_list(10), node_ctr
+      integer num_nodes_in_set, num_elem_in_set
+      integer df_list_len, list_len, elem_list_len, node_list_len
+      integer node_num, time_step, var_index, beg_time, end_time
+      integer elem_num
+      integer cpu_ws,io_ws
+      integer num_props, prop_value, n_node_map, n_elem_map
+      integer ival
+
+      real time_value, time_values(100), var_values(100)
+      real x(100), y(100), z(100)
+      real attrib(100), dist_fact(100)
+      real vers, fdum
+
+      character*(MXSTLN) coord_names(3), qa_record(4,2), var_names(3)
+      character*(MXLNLN) inform(3), titl
+      character typ*(MXSTLN), cdum*1
+      character*(MXSTLN) prop_names(3)
+      character*(MXSTLN) attrib_names(100)
+      data iin /5/, iout /6/
+
+c      call exopts (EXVRBS, ierr)
+c      write (iout, '(/"after exopts, error = ", i3)' ) ierr
+
+c
+c open EXODUS II files
+c
+
+      cpu_ws = 0
+      io_ws = 0
+
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '("  I/O word size",i2)') io_ws
+
+c
+c read database parameters
+c
+
+      call exgini (exoid, titl, num_dim, num_nodes, num_elem, 
+     1             num_elem_blk, num_node_sets, num_side_sets, ierr)
+      write (iout, '(/"after exgini, error = ", i3)' ) ierr
+
+      write (iout, '("database parameters:"/
+     1               "title = ", a81 /
+     2               "num_dim = ", i3 /
+     3               "num_nodes = ", i3 /
+     4               "num_elem = ", i3 /
+     5               "num_elem_blk = ", i3 /
+     6               "num_node_sets = ", i3 /
+     7               "num_side_sets = ", i3)')
+     8               titl,num_dim, num_nodes, num_elem,
+     9               num_elem_blk,num_node_sets, num_side_sets
+
+
+c
+c read nodal coordinates values and names from database
+c
+
+      call exgcor (exoid, x, y, z, ierr)
+      write (iout, '(/"after exgcor, error = ", i3)' ) ierr
+
+      write (iout, '("x coords = ")')
+      do 10 i = 1, num_nodes
+         write (iout, '(f5.1)') x(i)
+10    continue
+
+      write (iout, '("y coords = ")')
+      do 20 i = 1, num_nodes
+         write (iout, '(f5.1)') y(i)
+20    continue
+
+      if (num_dim .gt. 2) then
+      write (iout, '("z coords = ")')
+      do 22 i = 1, num_nodes
+         write (iout, '(f5.1)') z(i)
+22    continue
+      endif
+
+      call exgcon (exoid, coord_names, ierr)
+      write (iout, '(/"after exgcon, error = ", i3)' ) ierr
+ 
+      write (iout, '("x coord name = ", a9)') coord_names(1)
+      write (iout, '("y coord name = ", a9)') coord_names(2)
+
+c
+c read map parameters
+c
+
+      call exgmp (exoid, n_node_map, n_elem_map, ierr)
+      write (iout, '(/"after exgmp, error = ", i3)' ) ierr
+
+c
+c read element maps
+c
+ 
+      call exgpa (exoid, EXEMAP, "ID", ids, ierr)
+      write (iout, '(/"after exgpa, error = ", i3)' ) ierr
+
+      do 26 j = 1,n_elem_map
+
+         call exgem (exoid, ids(j), elem_map, ierr)
+         write (iout, '(/"after exgem, error = ", i3)' ) ierr
+ 
+         write (iout, '(/"element map id = ", i3)' ) ids(j)
+
+         do 24 i = 1, num_elem
+            write (iout, '("elem_map(",i3,") = ", i3)') i, elem_map(i)
+C .. test reading partial element maps...
+            call exgpem(exoid, ids(j), i, 1, ival, ierr)
+            if (ival .ne. elem_map(i)) then
+              write (iout, '("bad value found for map ",
+     *          " element ", i3)') i, elem_map(i)
+            end if
+24       continue
+
+26    continue
+
+c
+c     read element map properties
+c
+
+      call exinq (exoid, EXNEMP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each element map")')
+     2	num_props
+
+
+      call exgpn(exoid, EXEMAP, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 30 i = 1, num_props
+        do 28 j = 1, n_elem_map
+          call exgp(exoid, EXEMAP,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("elem map ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+28      continue
+30    continue
+
+c
+c read node maps
+c
+ 
+      call exgpa (exoid, EXNMAP, "ID", ids, ierr)
+      write (iout, '(/"after exgpa, error = ", i3)' ) ierr
+
+      do 34 j = 1,n_node_map
+
+         call exgnm (exoid, ids(j), node_map, ierr)
+         write (iout, '(/"after exgnm, error = ", i3)' ) ierr
+ 
+         write (iout, '(/"node map id = ", i3)' ) ids(j)
+
+         do 32 i = 1, num_nodes
+            write (iout, '("node_map(",i3,") = ", i3)') i, node_map(i)
+32       continue
+
+34    continue
+
+c
+c     read node map properties
+c
+
+      call exinq (exoid, EXNNMP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each node map")')
+     2	num_props
+
+
+      call exgpn(exoid, EXNMAP, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 38 i = 1, num_props
+        do 36 j = 1, n_node_map
+          call exgp(exoid, EXNMAP,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("node map ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+36      continue
+38    continue
+
+c
+c read element block parameters
+c
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 40 i = 1, num_elem_blk
+
+         call exgelb (exoid, ids(i), typ, num_elem_in_block(i),
+     1                num_nodes_per_elem(i), num_attr(i), ierr)
+         write (iout, '(/"after exgelb, error = ", i3)' ) ierr
+
+         write (iout, '("element block id = ", i2,/
+     1                  "element type = ", a9,/
+     2                  "num_elem_in_block = ", i2,/
+     3                  "num_nodes_per_elem = ", i2,/
+     4                  "num_attr = ", i2)')
+     5                  ids(i), typ, num_elem_in_block(i), 
+     6                  num_nodes_per_elem(i), num_attr(i)
+
+40    continue
+
+c     read element block properties
+
+      call exinq (exoid, EXNEBP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each element block")')
+     2	num_props
+
+
+      call exgpn(exoid, EXEBLK, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 47 i = 1, num_props
+        do 45 j = 1, num_elem_blk
+          call exgp(exoid, EXEBLK,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("elem block ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+45      continue
+47    continue
+
+c
+c read element connectivity
+c
+
+      do 60 i = 1, num_elem_blk
+
+         call exgelc (exoid, ids(i), connect, ierr)
+         write (iout, '(/"after exgelc, error = ", i3)' ) ierr
+ 
+         write (iout, '("connect array for elem block ", i2)') ids(i)
+
+         do 50 j = 1, num_nodes_per_elem(i)
+            write (iout, '(i3)') connect(j)
+50       continue
+
+60    continue
+
+c
+c read element block attributes
+c
+
+      do 70 i = 1, num_elem_blk
+
+         call exgeat (exoid, ids(i), attrib, ierr)
+         write (iout, '(/"after exgeat, error = ", i3)' ) ierr
+
+         call exgean (exoid, ids(i), num_attr(i), attrib_names, ierr)
+         write (iout, '(/"after exgean, error = ", i3)' ) ierr
+ 
+         write (iout,
+     *     '("element block ", i2, " has ",i2," attribute(s) and ",
+     *     i2, " element(s):")')
+     1          ids(i), num_attr(i), num_elem_in_block(i)
+         do j=1, num_attr(i)
+           write (iout, 69) attrib_names(j),
+     *       (attrib(k),k= j, num_attr(i)*num_elem_in_block(i),
+     *       num_attr(i))
+         end do
+ 69      format(A32," = ", 10(f6.4,2x))
+70    continue
+
+c
+c read individual node sets
+c
+      if (num_node_sets .gt. 0) then
+         call exgnsi (exoid, ids, ierr)
+         write (iout, '(/"after exgnsi, error = ", i3)' ) ierr
+      endif
+
+      do 100 i = 1, num_node_sets
+
+         call exgnp (exoid, ids(i), num_nodes_in_set, 
+     1               num_df_in_set, ierr)
+         write (iout, '(/"after exgnp, error = ", i3)' ) ierr
+
+         write (iout, '(/"node set ", i2, " parameters: ",/
+     2                  "num_nodes = ", i2)') ids(i), num_nodes_in_set
+
+         call exgns (exoid, ids(i), node_list, ierr)
+         write (iout, '(/"after exgns, error = ", i3)' ) ierr
+
+         if (num_df_in_set .gt. 0) then
+           call exgnsd (exoid, ids(i), dist_fact, ierr)
+           write (iout, '(/"after exgnsd, error = ", i3)' ) ierr
+	 endif
+
+         write (iout, '(/"node list for node set ", i2)') ids(i)
+ 
+         do 80 j = 1, num_nodes_in_set
+            write (iout, '(i3)') node_list(j)
+80       continue
+
+	 if (num_df_in_set .gt. 0) then
+           write (iout, '("dist factors for node set ", i2)') ids(i)
+           do 90 j = 1, num_nodes_in_set
+             write (iout, '(f5.2)') dist_fact(j)
+90         continue
+	 else
+           write (iout, '("no dist factors for node set ", i2)') ids(i)
+	 endif
+
+100   continue
+
+c     read node set properties
+
+      call exinq (exoid, EXNNSP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each node set")')
+     2	num_props
+
+
+      call exgpn(exoid, EXNSET, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 107 i = 1, num_props
+        do 105 j = 1, num_node_sets
+          call exgp(exoid,EXNSET,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("node set ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+105      continue
+107    continue
+
+c
+c read concatenated node sets; this produces the same information as
+c the above code which reads individual node sets
+c
+      call exinq (exoid, EXNODS, num_node_sets, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+ 
+      if (num_node_sets .gt. 0) then
+         call exinq (exoid, EXNSNL, list_len, fdum, cdum, ierr)
+         write(iout,'(/"after EXNSNL =",i3," exinq, error = ",i3)')
+     1			list_len,ierr
+ 
+         call exinq (exoid, EXNSDF, list_len, fdum, cdum, ierr)
+         write(iout,'(/"after EXNSDF =",i3," exinq, error = ",i3)')
+     1			list_len,ierr
+ 
+         call exgcns (exoid, ids, num_nodes_per_set, num_df_per_set,
+     1                node_ind, df_ind, node_list, dist_fact, ierr)
+         write (iout, '(/"after exgcns, error = ", i3)' ) ierr
+ 
+         write (iout, '(/"concatenated node set info")')
+ 
+         write (iout, '("ids = ")')
+
+         do 110 i = 1, num_node_sets
+            write (iout, '(i3)') ids(i)
+110      continue
+
+         write (iout, '("num_nodes_per_set = ")')
+
+         do 120 i = 1, num_node_sets
+            write (iout, '(i3)') num_nodes_per_set(i)
+120      continue
+
+         write (iout, '("node_ind = ")')
+
+         do 130 i = 1, num_node_sets
+            write (iout, '(i3)') node_ind(i)
+130      continue
+
+         write (iout, '("node_list = ")')
+
+         do 140 i = 1, list_len
+            write (iout, '(i3)') node_list(i)
+140      continue
+
+         write (iout, '("dist_fact = ")')
+
+         do 150 i = 1, list_len
+            write (iout, '(f5.3)') dist_fact(i)
+150      continue
+      endif
+
+c
+c read individual side sets
+c
+      if (num_side_sets .gt. 0) then
+         call exgssi (exoid, ids, ierr)
+         write (iout, '(/"after exgssi, error = ", i3)' ) ierr
+      endif
+
+      do 190 i = 1, num_side_sets
+
+         call exgsp (exoid, ids(i), num_sides_in_set, num_df_in_set,
+     1               ierr)
+         write (iout, '(/"after exgsp, error = ", i3)' ) ierr
+ 
+         write (iout, '("side set ", i2, " parameters:",/
+     2          "num_sides = ", i3,/
+     3          "num_dist_factors = ", i3)')
+     4          ids(i), num_sides_in_set, num_df_in_set
+ 
+         call exgss (exoid, ids(i), elem_list, side_list, ierr)
+         write (iout, '(/"after exgss, error = ", i3)' ) ierr
+
+         call exgssn (exoid, ids(i), node_ctr_list, node_list, ierr)
+         write (iout, '(/"after exgssn, error = ", i3)' ) ierr
+
+	 if (num_df_in_set .gt. 0) then
+           call exgssd (exoid, ids(i), dist_fact, ierr)
+           write (iout, '(/"after exgssd, error = ", i3)' ) ierr
+         endif
+
+         write (iout, '(/"element list for side set ", i2)') ids(i)
+
+         num_elem_in_set = num_sides_in_set
+         do 160 j = 1, num_elem_in_set
+            write (iout, '(i3)') elem_list(j)
+160      continue
+
+         write (iout, '("side list for side set ", i2)') ids(i)
+
+         do 170 j = 1, num_sides_in_set
+            write (iout, '(i3)') side_list(j)
+170      continue
+
+	 node_ctr = 0
+	 write (iout, '("node list for side set ", i2)') ids(i)
+	 do 178 k=1, num_elem_in_set
+	   do 175 j=1, node_ctr_list(k)
+	     write (iout, '(i3)') node_list(j+node_ctr)
+175	   continue
+	   node_ctr = node_ctr+node_ctr_list(k)
+178	 continue
+
+	 if (num_df_in_set .gt. 0) then
+           write (iout, '("dist factors for side set ", i2)') ids(i)
+           do 180 j = 1, num_df_in_set
+             write (iout, '(f6.3)') dist_fact(j)
+180        continue
+	 else
+           write (iout, '("no dist factors for side set ", i2)') ids(i)
+         endif
+
+190   continue
+
+c     read side set properties
+
+      call exinq (exoid, EXNSSP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each side set")')
+     2	num_props
+
+
+      call exgpn(exoid, EXSSET, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 197 i = 1, num_props
+        do 195 j = 1, num_side_sets
+          call exgp(exoid, EXSSET,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("side set ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+195      continue
+197    continue
+
+      call exinq (exoid, EXSIDS, num_side_sets, fdum, cdum, ierr)
+      write (iout, '(/"after exinq: EXSIDS =",i3,", error = ",i3)')
+     1		num_side_sets,ierr
+ 
+      if (num_side_sets .gt. 0) then
+         call exinq (exoid, EXSSEL, elem_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSEL =",i3,", error = ",i3)')
+     1		elem_list_len,ierr
+ 
+         call exinq (exoid, EXSSNL, node_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSNL =",i3,", error = ",i3)')
+     1		node_list_len,ierr
+ 
+         call exinq (exoid, EXSSDF, df_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSDF =",i3,", error = ",i3)')
+     1		df_list_len,ierr
+c
+c read concatenated side sets; this produces the same information as
+c the above code which reads individual side sets
+c
+         call exgcss (exoid, ids, num_elem_per_set, num_df_per_set, 
+     1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+     2             ierr)
+         write (iout, '(/"after exgcss, error = ", i3)' ) ierr
+ 
+         write (iout, '("concatenated side set info")')
+ 
+         write (iout, '("ids = ")')
+
+         do 200 i = 1, num_side_sets
+            write (iout, '(i3)') ids(i)
+200      continue
+
+         write (iout, '("num_elem_per_set = ")')
+
+         do 210 i = 1, num_side_sets
+            write (iout, '(i3)') num_elem_per_set(i)
+210      continue
+
+         write (iout, '("num_df_per_set = ")')
+
+         do 220 i = 1, num_side_sets
+            write (iout, '(i3)') num_df_per_set(i)
+220      continue
+
+         write (iout, '("elem_ind = ")')
+
+         do 230 i = 1, num_side_sets
+            write (iout, '(i3)') elem_ind(i)
+230      continue
+
+         write (iout, '("df_ind = ")')
+
+         do 240 i = 1, num_side_sets
+            write (iout, '(i3)') df_ind(i)
+240      continue
+
+         write (iout, '("elem_list = ")')
+
+         do 250 i = 1, elem_list_len
+            write (iout, '(i3)') elem_list(i)
+250      continue
+
+         write (iout, '("side_list = ")')
+
+         do 260 i = 1, elem_list_len
+            write (iout, '(i3)') side_list(i)
+260      continue
+
+         write (iout, '("dist_fact = ")')
+
+         do 270 i = 1, df_list_len
+            write (iout, '(f6.3)') dist_fact(i)
+270      continue
+      endif
+
+c
+c read QA records
+c
+      call exinq (exoid, EXQA, num_qa_rec, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+
+      call exgqa (exoid, qa_record, ierr) 
+      write (iout, '(/"after exgqa, error = ", i3)' ) ierr
+ 
+      write (iout, '("QA records = ")')
+
+      do 290 i = 1, num_qa_rec
+         do 280 j = 1, 4
+            write (iout, '(a)') qa_record(j,i)
+280      continue
+290   continue
+
+c
+c read information records
+c
+      call exinq (exoid, EXINFO, num_info, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+ 
+      call exginf (exoid, inform, ierr) 
+      write (iout, '(/"after exginf, error = ", i3)' ) ierr
+
+      write (iout, '("info records = ")')
+
+      do 300 i = 1, num_info
+         write (iout, '(a81)') inform(i)
+300   continue
+
+c
+c read global variables parameters and names 
+c
+      call exgvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvnm (exoid, "g", 1, var_names(1), ierr)
+      write (iout, '(/"after exgvnm, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," global variables; their names ",
+     1                "are :")')  num_glo_vars
+
+      do 320 i = 1, num_glo_vars
+         write (iout, '(a9)') var_names(i)
+320   continue
+
+c
+c read nodal variables parameters and names
+c
+      call exgvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," nodal variables; their names ",
+     1                "are :")')  num_nod_vars
+
+      do 330 i = 1, num_nod_vars
+         write (iout, '(a9)') var_names(i)
+330   continue
+
+c
+c read element variables parameters and names
+c
+      call exgvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," element variables; their names ",
+     1                "are :")')  num_ele_vars
+
+      do 340 i = 1, num_ele_vars
+         write (iout, '(a9)') var_names(i)
+340   continue
+
+c
+c read element variable truth table
+c
+      call exgvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '(/"after exgvtt, error = ", i3)' ) ierr
+
+      write (iout, '("This is the element variable truth table:")')
+
+      do 360 i = 1, num_elem_blk
+         do 350 j = 1, num_ele_vars
+            write (iout, '(i2)') truth_tab(j,i)
+350      continue
+360   continue
+
+c
+c determine how many time steps are stored
+c
+      call exinq (exoid, EXTIMS, num_time_steps, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+
+      write (iout, '("There are ",i2," time steps in the database.")') 
+     1       num_time_steps
+c
+c read time value at one time step
+c
+      time_step = 3
+      call exgtim (exoid, time_step, time_value, ierr)
+      write (iout, '(/"after exgtim, error = ", i3)' ) ierr
+ 
+      write (iout, '("time value at time step ",i2," = ", f5.3)') 
+     1       time_step, time_value
+c
+c read time values at all time steps
+c
+      call exgatm (exoid, time_values, ierr)
+      write (iout, '(/"after exgatm, error = ", i3)' ) ierr
+ 
+      write (iout, '("time values at all time steps are:")')
+
+      do 370 i = 1, num_time_steps
+         write (iout, '(f5.3)') time_values(i)
+370   continue
+
+      var_index = 1
+      beg_time = 1
+      end_time = -1
+c
+c read all global variables at one time step
+c
+      call exggv (exoid, time_step, num_glo_vars, var_values, ierr)
+      write (iout, '(/"after exggv, error = ", i3)' ) ierr
+ 
+      write (iout, '("global variable values at time step ",i2)') 
+     1       time_step
+
+      do 400 i = 1, num_glo_vars
+         write (iout, '(f5.3)') var_values(i)
+400   continue
+
+c
+c read a single global variable through time
+c
+      call exggvt (exoid, var_index, beg_time, end_time, var_values,
+     1             ierr)
+      write (iout, '(/"after exggvt, error = ", i3)' ) ierr
+ 
+      write (iout, '("global variable ",i2," values through time:")')
+     1       var_index
+
+      do 410 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+410   continue
+
+c
+c read a nodal variable at one time step
+c
+      call exgnv (exoid, time_step, var_index, num_nodes, var_values,
+     1            ierr)
+      write (iout, '(/"after exgnv, error = ", i3)' ) ierr
+
+      write (iout, '("nodal variable ",i2," values at time step ",i2)') 
+     1       var_index, time_step
+
+      do 420 i = 1, num_nodes
+         write (iout, '(f5.3)') var_values(i)
+420   continue
+
+c
+c read a nodal variable through time
+c
+      node_num = 1
+
+      call exgnvt (exoid, var_index, node_num, beg_time, end_time, 
+     1             var_values, ierr)
+      write (iout, '(/"after exgnvt, error = ", i3)' ) ierr
+ 
+      write (iout, '("nodal variable ",i2," values for node ",i2,
+     1               " through time:")') var_index, node_num
+
+      do 430 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+430   continue
+
+c
+c read an element variable at one time step
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 450 i = 1, num_elem_blk
+
+         call exgev (exoid, time_step, var_index, ids(i), 
+     1               num_elem_in_block(i), var_values, ierr)
+         write (iout, '(/"after exgev, error = ", i3)' ) ierr
+ 
+         if (ierr .eq. 0) then
+            write (iout, '("element variable ",i2," values of element ",
+     1                     "block ",i2," at time step ",i2)')
+     2                     var_index, ids(i), time_step
+         endif
+
+         do 440 j = 1, num_elem_in_block(i)
+            write (iout, '(f6.3)') var_values(j)
+440      continue
+
+450   continue
+
+c
+c read an element variable through time
+c
+      var_index = 2
+      elem_num = 2
+
+      call exgevt (exoid, var_index, elem_num, beg_time, end_time, 
+     1             var_values, ierr)
+      write (iout, '(/"after exgevt, error = ", i3)' ) ierr
+ 
+      write (iout, '("element variable ",i2," values for element ",i2,
+     1               " through time:")') var_index, elem_num
+
+      do 460 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+460   continue
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testrd_nsid.dmp b/exodus/forbind/test/testrd_nsid.dmp
new file mode 100644
index 0000000..e956f17
--- /dev/null
+++ b/exodus/forbind/test/testrd_nsid.dmp
@@ -0,0 +1,162 @@
+
+after exopen, error =   0
+  I/O word size 4
+  Model Size 1
+
+after exgini, error =   0
+database parameters:
+title =  This is a test                                                                  
+num_dim =   3
+num_nodes =  33
+num_elem =   7
+num_elem_blk =   1
+num_node_sets =   0
+num_side_sets =   0
+
+after exgcor, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+  0.0
+ 10.0
+ 10.0
+  1.0
+  1.0
+ 10.0
+ 10.0
+  1.0
+  0.0
+  1.0
+ 10.0
+  7.0
+  3.0
+  6.0
+  0.0
+  3.0
+  6.0
+  0.0
+  2.7
+  6.0
+  5.7
+  3.7
+  0.0
+ 10.0
+ 10.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  0.0
+  0.0
+ 10.0
+ 10.0
+ 10.0
+ 10.0
+  0.0
+  0.0
+  0.0
+  5.0
+  0.0
+  0.0
+  0.0
+  2.0
+  2.0
+  2.0
+  1.7
+  1.7
+  1.7
+  0.0
+  0.0
+  0.0
+ 10.0
+z coords = 
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  0.0
+-10.0
+-10.0
+  0.0
+  5.0
+  2.0
+  3.0
+  6.0
+  0.0
+  0.0
+  6.0
+  2.0
+  0.0
+  2.7
+  3.3
+  1.7
+  2.3
+  0.0
+  0.0
+ 10.0
+
+after exgcon, error =   0
+x coord name = xcoor    
+y coord name = ycoor    
+
+after exgmap, error =   0
+elem_map(1) = 1
+elem_map(2) = 2
+elem_map(3) = 3
+elem_map(4) = 4
+elem_map(5) = 5
+elem_map(6) = 6
+elem_map(7) = 7
+
+after exgebi, error =   0
+
+after exgelb, error =   0
+element block id = 10
+element type = nsided   
+num_elem_in_block =  7
+num_nodes_per_elem = 37
+num_attr =  0
+
+after exgelc, error =   0
+
+after exgecpp, error =   0
+connect array for elem block 10
+ Element   1, Nodes/Element =   4 --   1  2  3  4
+ Element   2, Nodes/Element =   4 --   5  6  7  8
+ Element   3, Nodes/Element =   8 --   9 10 11 12 13 14 15 16
+ Element   4, Nodes/Element =   4 --  17 18 19 20
+ Element   5, Nodes/Element =   6 --  21 22 23 24 25 26
+ Element   6, Nodes/Element =   8 --  17 18 19 20 27 28 30 29
+ Element   7, Nodes/Element =   3 --  31 32 33
+
+after exinq, error =   0
+
+There are  3 coordinate frames
+after exgfrm, error =    0
+    1   RECTANGULAR                           0.10      0.20      0.30      0.40      0.50      0.60      0.70      0.80      0.90
+   11   CYLINDRICAL                           1.10      1.20      1.30      1.40      1.50      1.60      1.70      1.80      1.90
+  111   SPHERICAL                             2.10      2.20      2.30      2.40      2.50      2.60      2.70      2.80      2.90
+
+after exclos, error =   0
diff --git a/exodus/forbind/test/testrd_nsid.f b/exodus/forbind/test/testrd_nsid.f
new file mode 100644
index 0000000..2f028c4
--- /dev/null
+++ b/exodus/forbind/test/testrd_nsid.f
@@ -0,0 +1,241 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testrd
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database read routines
+c
+c	09/07/93 V.R. Yarberry - Modified for API 2.00
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, ierr, ioff
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_node_sets
+      integer num_side_sets
+      integer i, j, k, elem_map(100), connect(100), nnpe(10)
+      integer ids(10) 
+      integer num_elem_in_block(10), num_nodes_per_elem(10)
+      integer num_attr(10)
+      integer cpu_ws,io_ws, mod_sz
+
+      real x(100), y(100), z(100)
+      real vers
+
+      character*(MXSTLN) coord_names(3)
+      character*(MXLNLN) titl
+      character*(MXSTLN) eltype(10)
+
+      data iin /5/, iout /6/
+
+
+c
+c open EXODUS II files
+c
+
+      cpu_ws = 0
+      io_ws = 0
+
+      exoid = exopen ("test-nsided.exo", EXREAD, cpu_ws, io_ws,
+     *  vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test-nsided.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '("  I/O word size",i2)') io_ws
+
+      mod_sz = exlgmd(exoid)
+      write (iout, '("  Model Size",i2)') mod_sz
+
+c
+c read database parameters
+c
+
+      call exgini (exoid, titl, num_dim, num_nodes, num_elem, 
+     1             num_elem_blk, num_node_sets, num_side_sets, ierr)
+      write (iout, '(/"after exgini, error = ", i3)' ) ierr
+
+      write (iout, '("database parameters:"/
+     1               "title = ", a81 /
+     2               "num_dim = ", i3 /
+     3               "num_nodes = ", i3 /
+     4               "num_elem = ", i3 /
+     5               "num_elem_blk = ", i3 /
+     6               "num_node_sets = ", i3 /
+     7               "num_side_sets = ", i3)')
+     8               titl,num_dim, num_nodes, num_elem,
+     9               num_elem_blk,num_node_sets, num_side_sets
+
+
+c
+c read nodal coordinates values and names from database
+c
+
+      call exgcor (exoid, x, y, z, ierr)
+      write (iout, '(/"after exgcor, error = ", i3)' ) ierr
+
+      write (iout, '("x coords = ")')
+      do 10 i = 1, num_nodes
+         write (iout, '(f5.1)') x(i)
+10    continue
+
+      write (iout, '("y coords = ")')
+      do 20 i = 1, num_nodes
+         write (iout, '(f5.1)') y(i)
+20    continue
+
+      if (num_dim .gt. 2) then
+      write (iout, '("z coords = ")')
+      do 22 i = 1, num_nodes
+         write (iout, '(f5.1)') z(i)
+22    continue
+      endif
+
+      call exgcon (exoid, coord_names, ierr)
+      write (iout, '(/"after exgcon, error = ", i3)' ) ierr
+ 
+      write (iout, '("x coord name = ", a9)') coord_names(1)
+      write (iout, '("y coord name = ", a9)') coord_names(2)
+
+c
+c read element order map
+c
+ 
+      call exgmap (exoid, elem_map, ierr)
+      write (iout, '(/"after exgmap, error = ", i3)' ) ierr
+ 
+      do 30 i = 1, num_elem
+         write (iout, '("elem_map(",i1,") = ", i1)') i, elem_map(i)
+30    continue
+
+c
+c read element block parameters
+c
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 40 i = 1, num_elem_blk
+
+         call exgelb (exoid, ids(i), eltype(i), num_elem_in_block(i),
+     1                num_nodes_per_elem(i), num_attr(i), ierr)
+         write (iout, '(/"after exgelb, error = ", i3)' ) ierr
+
+         write (iout, '("element block id = ", i2,/
+     1                  "element type = ", a9,/
+     2                  "num_elem_in_block = ", i2,/
+     3                  "num_nodes_per_elem = ", i2,/
+     4                  "num_attr = ", i2)')
+     5                  ids(i), eltype(i), num_elem_in_block(i), 
+     6                  num_nodes_per_elem(i), num_attr(i)
+
+40    continue
+
+c
+c read element connectivity
+c
+
+      do 60 i = 1, num_elem_blk
+
+        call exgelc (exoid, ids(i), connect, ierr)
+        write (iout, '(/"after exgelc, error = ", i3)' ) ierr
+        
+        if (eltype(i) .eq. 'nsided' .or. eltype(i) .eq. 'NSIDED') then
+          call exgecpp(exoid, EXEBLK, ids(i), nnpe, ierr)
+          write (iout, '(/"after exgecpp, error = ", i3)' ) ierr
+          
+          write (iout, '("connect array for elem block ", i2)') ids(i)
+          
+          ioff = 0
+          do j = 1, num_elem_in_block(i)
+            write (iout, 100) j, nnpe(j), (connect(ioff+k),k=1,nnpe(j))
+            ioff = ioff + nnpe(j)
+          end do
+          
+        end if
+60    continue
+
+C ... Test coordinate frames
+      call getfrm(exoid)
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+ 100  format(' Element ',I3,', Nodes/Element = ',I3,' -- ',20I3)
+      stop
+      end
+
+      subroutine getfrm(exoid)
+      implicit none
+      include 'exodusII.inc'
+
+      real fdum
+      character*1 cdum
+      integer iout
+
+      integer exoid, ierr, i, j
+      integer numfrm;   ! Assumed to be 3 for remaining dimensions
+      integer cfids(3), tags(3)
+      character*32 ctag
+      real    coord(27)
+
+      data iout /6/
+
+      call exinq(exoid, EXNCF, numfrm, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1  '(/"There are ",i2," coordinate frames")')
+     2  numfrm
+
+      call exgfrm(exoid, numfrm, cfids, coord, tags, ierr);
+      write (6,'("after exgfrm, error = ", i4)') ierr
+
+! NOTE: These values may not be sensical; just used for testing.
+      do i=0,2
+        if (tags(i+1) .eq. EXCFREC) then
+          ctag = 'RECTANGULAR'
+        else if (tags(i+1) .eq. EXCFCYL) then
+          ctag = 'CYLINDRICAL'
+        else if (tags(i+1) .eq. EXCFSPH) then
+          ctag = 'SPHERICAL'
+        end if
+
+        write (iout, 100) cfids(i+1), ctag, (COORD(9*i+j),j=1,9)
+      end do
+
+ 100  format(i5, 3x, A, 9F10.2)
+      return
+      end
diff --git a/exodus/forbind/test/testrdd.dmp b/exodus/forbind/test/testrdd.dmp
new file mode 100644
index 0000000..be84733
--- /dev/null
+++ b/exodus/forbind/test/testrdd.dmp
@@ -0,0 +1,409 @@
+
+after exopen, error =   0
+  I/O word size 8
+
+after exgini, error =   0
+database parameters:
+title =  This is a test                                                                  
+num_dim =   2
+num_nodes =   8
+num_elem =   2
+num_elem_blk =   2
+num_node_sets =   2
+num_side_sets =   2
+
+after exgcor, error =   0
+x coords = 
+  0.0
+  1.0
+  1.0
+  0.0
+  1.0
+  2.0
+  2.0
+  1.0
+y coords = 
+  0.0
+  0.0
+  1.0
+  1.0
+  0.0
+  0.0
+  1.0
+  1.0
+
+after exgcon, error =   0
+x coord name = xcoor    
+y coord name = ycoor    
+
+after exgmap, error =   0
+elem_map(1) = 1
+elem_map(2) = 2
+
+after exgebi, error =   0
+
+after exgelb, error =   0
+element block id = 10
+element type = quad     
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after exgelb, error =   0
+element block id = 11
+element type = quad     
+num_elem_in_block =  1
+num_nodes_per_elem =  4
+num_attr =  1
+
+after exinq, error =   0
+
+There are  3 properties for each element block
+after exgpn, error =   0
+elem block  1 property( 1): ID                               =    10
+elem block  2 property( 1): ID                               =    11
+elem block  1 property( 2): MATL                             =    10
+elem block  2 property( 2): MATL                             =    20
+elem block  1 property( 3): DENSITY                          =     0
+elem block  2 property( 3): DENSITY                          =     0
+
+after exgelc, error =   0
+connect array for elem block 10
+  1
+  2
+  3
+  4
+
+after exgelc, error =   0
+connect array for elem block 11
+  5
+  6
+  7
+  8
+
+after exgeat, error =   0
+element block 10 attributes = 3.1416
+
+after exgeat, error =   0
+element block 11 attributes = 6.1416
+
+after exgnsi, error =   0
+
+after exgnp, error =   0
+
+node set 20 parameters: 
+num_nodes =  5
+
+after exgns, error =   0
+
+after exgnsd, error =   0
+
+node list for node set 20
+100
+101
+102
+103
+104
+dist factors for node set 20
+ 1.00
+ 2.00
+ 3.00
+ 4.00
+ 5.00
+
+after exgnp, error =   0
+
+node set 21 parameters: 
+num_nodes =  3
+
+after exgns, error =   0
+
+after exgnsd, error =   0
+
+node list for node set 21
+200
+201
+202
+dist factors for node set 21
+ 1.10
+ 2.10
+ 3.10
+
+after exinq, error =   0
+
+There are  3 properties for each node set
+after exgpn, error =   0
+node set  1 property( 1): ID                               =    20
+node set  2 property( 1): ID                               =    21
+node set  1 property( 2): FACE                             =     4
+node set  2 property( 2): FACE                             =     5
+node set  1 property( 3): VELOCITY                         =  1000
+node set  2 property( 3): VELOCITY                         =  2000
+
+after exinq, error =   0
+
+after EXNSNL =  8 exinq, error =   0
+
+after EXNSDF =  8 exinq, error =   0
+
+after exgcns, error =   0
+
+concatenated node set info
+ids = 
+ 20
+ 21
+num_nodes_per_set = 
+  5
+  3
+node_ind = 
+  1
+  6
+node_list = 
+100
+101
+102
+103
+104
+200
+201
+202
+dist_fact = 
+1.000
+2.000
+3.000
+4.000
+5.000
+1.100
+2.100
+3.100
+
+after exgssi, error =   0
+
+after exgsp, error =   0
+side set 30 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after exgss, error =   0
+
+after exgssd, error =   0
+
+element list for side set 30
+ 11
+ 12
+side list for side set 30
+  1
+  2
+dist factors for side set 30
+30.000
+30.100
+30.200
+30.300
+
+after exgsp, error =   0
+side set 31 parameters:
+num_sides =   2
+num_dist_factors =   4
+
+after exgss, error =   0
+
+after exgssd, error =   0
+
+element list for side set 31
+ 13
+ 14
+side list for side set 31
+  3
+  4
+dist factors for side set 31
+31.000
+31.100
+31.200
+31.300
+
+after exinq, error =   0
+
+There are  2 properties for each side set
+after exgpn, error =   0
+side set  1 property( 1): ID                               =    30
+side set  2 property( 1): ID                               =    31
+side set  1 property( 2): COLOR                            =   100
+side set  2 property( 2): COLOR                            =   101
+
+after exinq: EXSIDS =  2, error =   0
+
+after exinq: EXSSEL =  4, error =   0
+
+after exinq: EXSSDF =  8, error =   0
+
+after exgcss, error =   0
+concatenated side set info
+ids = 
+ 30
+ 31
+num_elem_per_set = 
+  2
+  2
+num_df_per_set = 
+  4
+  4
+elem_ind = 
+  1
+  3
+df_ind = 
+  1
+  5
+elem_list = 
+ 11
+ 12
+ 13
+ 14
+side_list = 
+  1
+  2
+  3
+  4
+dist_fact = 
+30.000
+30.100
+30.200
+30.300
+31.000
+31.100
+31.200
+31.300
+
+after exinq, error =   0
+
+after exgqa, error =   0
+QA records = 
+testwtd                         
+07/07/93                        
+15:41:33                        
+FASTQ                           
+fastq                           
+07/07/93                        
+16:41:33                        
+
+after exinq, error =   0
+
+after exginf, error =   0
+info records = 
+ This is the first information record.                                           
+ This is the second information record.                                          
+ This is the third information record.                                           
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  1 global variables; their names are :
+glo_vars 
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  2 nodal variables; their names are :
+nod_var0 
+nod_var1 
+
+after exgvp, error =   0
+
+after exgvan, error =   0
+There are  3 element variables; their names are :
+ele_var0 
+ele_var1 
+ele_var2 
+
+after exgvtt, error =   0
+This is the element variable truth table:
+ 1
+ 1
+ 1
+ 1
+ 1
+ 1
+
+after exinq, error =   0
+There are 10 time steps in the database.
+
+after exgtim, error =   0
+time value at time step  3 = 0.030
+
+after exgatm, error =   0
+time values at all time steps are:
+0.010
+0.020
+0.030
+0.040
+0.050
+0.060
+0.070
+0.080
+0.090
+0.100
+
+after exggv, error =   0
+global variable values at time step  3
+0.060
+
+after exggvt, error =   0
+global variable  1 values through time:
+0.020
+0.040
+0.060
+0.080
+0.100
+0.120
+0.140
+0.160
+0.180
+0.200
+
+after exgnv, error =   0
+nodal variable  1 values at time step  3
+1.030
+1.060
+1.090
+1.120
+1.150
+1.180
+1.210
+1.240
+
+after exgnvt, error =   0
+nodal variable  1 values for node  1 through time:
+1.010
+1.020
+1.030
+1.040
+1.050
+1.060
+1.070
+1.080
+1.090
+1.100
+
+after exgebi, error =   0
+
+after exgev, error =   0
+element variable  1 values of element block 10 at time step  3
+4.030
+
+after exgev, error =   0
+element variable  1 values of element block 11 at time step  3
+5.030
+
+after exgevt, error =   0
+element variable  2 values for element  2 through time:
+6.010
+6.020
+6.030
+6.040
+6.050
+6.060
+6.070
+6.080
+6.090
+6.100
+
+after exclos, error =   0
diff --git a/exodus/forbind/test/testrdd.f b/exodus/forbind/test/testrdd.f
new file mode 100644
index 0000000..18d1b6d
--- /dev/null
+++ b/exodus/forbind/test/testrdd.f
@@ -0,0 +1,722 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testrdd
+
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database read routines with double precision
+c
+c	09/07/93 V.R. Yarberry - Modified for API 2.00
+      implicit none
+
+      include 'exodusII.inc'
+
+      integer iin, iout, ierr
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_node_sets
+      integer num_side_sets
+      integer i, j, elem_map(2), connect(4), node_list(10) 
+      integer elem_list(10), side_list(10), ids(5) 
+      integer num_elem_per_set(2), num_nodes_per_set(2)
+      integer num_df_per_set(2)
+      integer num_df_in_set, num_sides_in_set
+      integer df_ind(2), node_ind(2), elem_ind(2), num_qa_rec, num_info
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,2)
+      integer num_time_steps
+      integer num_elem_in_block(2), num_nodes_per_elem(2)
+      integer num_attr(2)
+      integer num_nodes_in_set, num_elem_in_set
+      integer df_list_len, list_len, elem_list_len
+      integer node_num, time_step, var_index, beg_time, end_time
+      integer elem_num
+      integer cpu_ws,io_ws
+      integer num_props, prop_value
+
+      real*8 time_value, time_values(10), var_values(10)
+      real*8 x(8), y(8), dummy(1)
+      real*8 attrib(1), dist_fact(8)
+      real vers, fdum
+
+      character*(MXSTLN) coord_names(3), qa_record(4,2), var_names(3)
+      character*(MXLNLN) inform(3), titl
+      character typ*(MXSTLN), cdum*1
+      character*(MXSTLN) prop_names(3)
+
+      data iin /5/, iout /6/
+
+
+c
+c open EXODUS II files
+c
+
+      cpu_ws = 8
+      io_ws = 0
+
+      exoid = exopen ("test.exo", EXREAD, cpu_ws, io_ws, vers, ierr)
+      write (iout, '(/"after exopen, error = ",i3)')
+     1			ierr
+
+      write (iout, '("test.exo is an EXODUSII file; version ",
+     1                f4.2)') vers
+      write (iout, '("  I/O word size",i2)') io_ws
+
+c
+c read database parameters
+c
+
+      call exgini (exoid, titl, num_dim, num_nodes, num_elem, 
+     1             num_elem_blk, num_node_sets, num_side_sets, ierr)
+      write (iout, '(/"after exgini, error = ", i3)' ) ierr
+
+      write (iout, '("database parameters:"/
+     1               "title = ", a81 /
+     2               "num_dim = ", i3 /
+     3               "num_nodes = ", i3 /
+     4               "num_elem = ", i3 /
+     5               "num_elem_blk = ", i3 /
+     6               "num_node_sets = ", i3 /
+     7               "num_side_sets = ", i3)')
+     8               titl,num_dim, num_nodes, num_elem,
+     9               num_elem_blk,num_node_sets, num_side_sets
+
+
+c
+c read nodal coordinates values and names from database
+c
+
+      call exgcor (exoid, x, y, dummy, ierr)
+      write (iout, '(/"after exgcor, error = ", i3)' ) ierr
+
+      write (iout, '("x coords = ")')
+      do 10 i = 1, num_nodes
+         write (iout, '(f5.1)') x(i)
+10    continue
+
+      write (iout, '("y coords = ")')
+      do 20 i = 1, num_nodes
+         write (iout, '(f5.1)') y(i)
+20    continue
+
+      call exgcon (exoid, coord_names, ierr)
+      write (iout, '(/"after exgcon, error = ", i3)' ) ierr
+ 
+      write (iout, '("x coord name = ", a9)') coord_names(1)
+      write (iout, '("y coord name = ", a9)') coord_names(2)
+
+c
+c read element order map
+c
+ 
+      call exgmap (exoid, elem_map, ierr)
+      write (iout, '(/"after exgmap, error = ", i3)' ) ierr
+ 
+      do 30 i = 1, num_elem
+         write (iout, '("elem_map(",i1,") = ", i1)') i, elem_map(i)
+30    continue
+
+c
+c read element block parameters
+c
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 40 i = 1, num_elem_blk
+
+         call exgelb (exoid, ids(i), typ, num_elem_in_block(i),
+     1                num_nodes_per_elem(i), num_attr(i), ierr)
+         write (iout, '(/"after exgelb, error = ", i3)' ) ierr
+
+         write (iout, '("element block id = ", i2,/
+     1                  "element type = ", a9,/
+     2                  "num_elem_in_block = ", i2,/
+     3                  "num_nodes_per_elem = ", i2,/
+     4                  "num_attr = ", i2)')
+     5                  ids(i), typ, num_elem_in_block(i), 
+     6                  num_nodes_per_elem(i), num_attr(i)
+
+40    continue
+
+c     read element block properties */
+
+      call exinq (exoid, EXNEBP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each element block")')
+     2	num_props
+
+
+      call exgpn(exoid, EXEBLK, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 47 i = 1, num_props
+        do 45 j = 1, num_elem_blk
+          call exgp(exoid, EXEBLK,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("elem block ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+45      continue
+47    continue
+
+c
+c read element connectivity
+c
+
+      do 60 i = 1, num_elem_blk
+
+         call exgelc (exoid, ids(i), connect, ierr)
+         write (iout, '(/"after exgelc, error = ", i3)' ) ierr
+ 
+         write (iout, '("connect array for elem block ", i2)') ids(i)
+
+         do 50 j = 1, num_nodes_per_elem(i)
+            write (iout, '(i3)') connect(j)
+50       continue
+
+60    continue
+
+c
+c read element block attributes
+c
+
+      do 70 i = 1, num_elem_blk
+
+         call exgeat (exoid, ids(i), attrib, ierr)
+         write (iout, '(/"after exgeat, error = ", i3)' ) ierr
+ 
+         write (iout, '("element block ", i2, " attributes = ", f6.4)')
+     1          ids(i), attrib
+
+70    continue
+
+c
+c read individual node sets
+c
+      if (num_node_sets .gt. 0) then
+         call exgnsi (exoid, ids, ierr)
+         write (iout, '(/"after exgnsi, error = ", i3)' ) ierr
+      endif
+
+      do 100 i = 1, num_node_sets
+
+         call exgnp (exoid, ids(i), num_nodes_in_set, 
+     1               num_df_in_set, ierr)
+         write (iout, '(/"after exgnp, error = ", i3)' ) ierr
+
+         write (iout, '(/"node set ", i2, " parameters: ",/
+     2                  "num_nodes = ", i2)') ids(i), num_nodes_in_set
+
+         call exgns (exoid, ids(i), node_list, ierr)
+         write (iout, '(/"after exgns, error = ", i3)' ) ierr
+         call exgnsd (exoid, ids(i), dist_fact, ierr)
+         write (iout, '(/"after exgnsd, error = ", i3)' ) ierr
+
+         write (iout, '(/"node list for node set ", i2)') ids(i)
+ 
+         do 80 j = 1, num_nodes_in_set
+            write (iout, '(i3)') node_list(j)
+80       continue
+
+         write (iout, '("dist factors for node set ", i2)') ids(i)
+ 
+         do 90 j = 1, num_nodes_in_set
+            write (iout, '(f5.2)') dist_fact(j)
+90       continue
+
+100   continue
+
+c     read node set properties
+
+      call exinq (exoid, EXNNSP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each node set")')
+     2	num_props
+
+
+      call exgpn(exoid, EXNSET, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 107 i = 1, num_props
+        do 105 j = 1, num_node_sets
+          call exgp(exoid,EXNSET,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("node set ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+105      continue
+107    continue
+
+c
+c read concatenated node sets; this produces the same information as
+c the above code which reads individual node sets
+c
+      call exinq (exoid, EXNODS, num_node_sets, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+ 
+      if (num_node_sets .gt. 0) then
+         call exinq (exoid, EXNSNL, list_len, fdum, cdum, ierr)
+         write(iout,'(/"after EXNSNL =",i3," exinq, error = ",i3)')
+     1			list_len,ierr
+ 
+         call exinq (exoid, EXNSDF, list_len, fdum, cdum, ierr)
+         write(iout,'(/"after EXNSDF =",i3," exinq, error = ",i3)')
+     1			list_len,ierr
+ 
+         call exgcns (exoid, ids, num_nodes_per_set, num_df_per_set,
+     1                node_ind, df_ind, node_list, dist_fact, ierr)
+         write (iout, '(/"after exgcns, error = ", i3)' ) ierr
+ 
+         write (iout, '(/"concatenated node set info")')
+ 
+         write (iout, '("ids = ")')
+
+         do 110 i = 1, num_node_sets
+            write (iout, '(i3)') ids(i)
+110      continue
+
+         write (iout, '("num_nodes_per_set = ")')
+
+         do 120 i = 1, num_node_sets
+            write (iout, '(i3)') num_nodes_per_set(i)
+120      continue
+
+         write (iout, '("node_ind = ")')
+
+         do 130 i = 1, num_node_sets
+            write (iout, '(i3)') node_ind(i)
+130      continue
+
+         write (iout, '("node_list = ")')
+
+         do 140 i = 1, list_len
+            write (iout, '(i3)') node_list(i)
+140      continue
+
+         write (iout, '("dist_fact = ")')
+
+         do 150 i = 1, list_len
+            write (iout, '(f5.3)') dist_fact(i)
+150      continue
+      endif
+
+c
+c read individual side sets
+c
+      if (num_side_sets .gt. 0) then
+         call exgssi (exoid, ids, ierr)
+         write (iout, '(/"after exgssi, error = ", i3)' ) ierr
+      endif
+
+      do 190 i = 1, num_side_sets
+
+         call exgsp (exoid, ids(i), num_sides_in_set, num_df_in_set,
+     1               ierr)
+         write (iout, '(/"after exgsp, error = ", i3)' ) ierr
+ 
+         write (iout, '("side set ", i2, " parameters:",/
+     2          "num_sides = ", i3,/
+     3          "num_dist_factors = ", i3)')
+     4          ids(i), num_sides_in_set, num_df_in_set
+ 
+         call exgss (exoid, ids(i), elem_list, side_list, ierr)
+         write (iout, '(/"after exgss, error = ", i3)' ) ierr
+
+         call exgssd (exoid, ids(i), dist_fact, ierr)
+         write (iout, '(/"after exgssd, error = ", i3)' ) ierr
+
+         write (iout, '(/"element list for side set ", i2)') ids(i)
+
+         num_elem_in_set = num_sides_in_set
+         do 160 j = 1, num_elem_in_set
+            write (iout, '(i3)') elem_list(j)
+160      continue
+
+         write (iout, '("side list for side set ", i2)') ids(i)
+
+         do 170 j = 1, num_sides_in_set
+            write (iout, '(i3)') side_list(j)
+170      continue
+
+
+         write (iout, '("dist factors for side set ", i2)') ids(i)
+ 
+         do 180 j = 1, num_df_in_set
+            write (iout, '(f6.3)') dist_fact(j)
+180      continue
+
+190   continue
+
+c     read side set properties
+
+      call exinq (exoid, EXNSSP, num_props, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+      write (iout,
+     1	'(/"There are ",i2," properties for each side set")')
+     2	num_props
+
+
+      call exgpn(exoid, EXSSET, prop_names, ierr)
+      write (iout, '("after exgpn, error = ", i3)' ) ierr
+
+      do 197 i = 1, num_props
+        do 195 j = 1, num_side_sets
+          call exgp(exoid, EXSSET,ids(j),prop_names(i),prop_value,ierr)
+          if (ierr .eq. 0) then
+            write( iout,
+     1	      '("side set ",i2," property(",i2,"): ",a," = ",i5)' )
+     2	      j, i, prop_names(i), prop_value
+          else
+	    write (iout, '(/"after exgp, error = ", i3)' ) ierr
+          endif
+195      continue
+197    continue
+
+      call exinq (exoid, EXSIDS, num_side_sets, fdum, cdum, ierr)
+      write (iout, '(/"after exinq: EXSIDS =",i3,", error = ",i3)')
+     1		num_side_sets,ierr
+ 
+      if (num_side_sets .gt. 0) then
+         call exinq (exoid, EXSSEL, elem_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSEL =",i3,", error = ",i3)')
+     1		elem_list_len,ierr
+ 
+c        call exinq (exoid, EXSSNL, node_list_len, fdum, cdum, ierr)
+c        write (iout, '(/"after exinq: EXSSNL =",i3,", error = ",i3)')
+c    1		node_list_len,ierr
+ 
+         call exinq (exoid, EXSSDF, df_list_len, fdum, cdum, ierr)
+         write (iout, '(/"after exinq: EXSSDF =",i3,", error = ",i3)')
+     1		df_list_len,ierr
+c
+c read concatenated side sets; this produces the same information as
+c the above code which reads individual side sets
+c
+c NOTE: SKIP concatenated side set until routine exgcss has been redefined
+c	if (.TRUE.) goto 275
+c 
+         call exgcss (exoid, ids, num_elem_per_set, num_df_per_set, 
+     1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+     2             ierr)
+         write (iout, '(/"after exgcss, error = ", i3)' ) ierr
+ 
+         write (iout, '("concatenated side set info")')
+ 
+         write (iout, '("ids = ")')
+
+         do 200 i = 1, num_side_sets
+            write (iout, '(i3)') ids(i)
+200      continue
+
+         write (iout, '("num_elem_per_set = ")')
+
+         do 210 i = 1, num_side_sets
+            write (iout, '(i3)') num_elem_per_set(i)
+210      continue
+
+         write (iout, '("num_df_per_set = ")')
+
+         do 220 i = 1, num_side_sets
+            write (iout, '(i3)') num_df_per_set(i)
+220      continue
+
+         write (iout, '("elem_ind = ")')
+
+         do 230 i = 1, num_side_sets
+            write (iout, '(i3)') elem_ind(i)
+230      continue
+
+         write (iout, '("df_ind = ")')
+
+         do 240 i = 1, num_side_sets
+            write (iout, '(i3)') df_ind(i)
+240      continue
+
+         write (iout, '("elem_list = ")')
+
+         do 250 i = 1, elem_list_len
+            write (iout, '(i3)') elem_list(i)
+250      continue
+
+         write (iout, '("side_list = ")')
+
+         do 260 i = 1, elem_list_len
+            write (iout, '(i3)') side_list(i)
+260      continue
+
+         write (iout, '("dist_fact = ")')
+
+         do 270 i = 1, df_list_len
+            write (iout, '(f6.3)') dist_fact(i)
+270      continue
+      endif
+
+c
+c read QA records
+c
+      call exinq (exoid, EXQA, num_qa_rec, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+
+      call exgqa (exoid, qa_record, ierr) 
+      write (iout, '(/"after exgqa, error = ", i3)' ) ierr
+ 
+      write (iout, '("QA records = ")')
+
+      do 290 i = 1, num_qa_rec
+         do 280 j = 1, 4
+            write (iout, '(a)') qa_record(j,i)
+280      continue
+290   continue
+
+c
+c read information records
+c
+      call exinq (exoid, EXINFO, num_info, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+ 
+      call exginf (exoid, inform, ierr) 
+      write (iout, '(/"after exginf, error = ", i3)' ) ierr
+
+      write (iout, '("info records = ")')
+
+      do 300 i = 1, num_info
+         write (iout, '(a81)') inform(i)
+300   continue
+
+c
+c read global variables parameters and names 
+c
+      call exgvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," global variables; their names ",
+     1                "are :")')  num_glo_vars
+
+      do 320 i = 1, num_glo_vars
+         write (iout, '(a9)') var_names(i)
+320   continue
+
+c
+c read nodal variables parameters and names
+c
+      call exgvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," nodal variables; their names ",
+     1                "are :")')  num_nod_vars
+
+      do 330 i = 1, num_nod_vars
+         write (iout, '(a9)') var_names(i)
+330   continue
+
+c
+c read element variables parameters and names
+c
+      call exgvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '(/"after exgvp, error = ", i3)' ) ierr
+ 
+      call exgvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '(/"after exgvan, error = ", i3)' ) ierr
+ 
+      write (iout, '("There are ",i2," element variables; their names ",
+     1                "are :")')  num_ele_vars
+
+      do 340 i = 1, num_ele_vars
+         write (iout, '(a9)') var_names(i)
+340   continue
+
+c
+c read element variable truth table
+c
+      call exgvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '(/"after exgvtt, error = ", i3)' ) ierr
+
+      write (iout, '("This is the element variable truth table:")')
+
+      do 360 i = 1, num_elem_blk
+         do 350 j = 1, num_ele_vars
+            write (iout, '(i2)') truth_tab(j,i)
+350      continue
+360   continue
+
+c
+c determine how many time steps are stored
+c
+      call exinq (exoid, EXTIMS, num_time_steps, fdum, cdum, ierr)
+      write (iout, '(/"after exinq, error = ", i3)' ) ierr
+
+      write (iout, '("There are ",i2," time steps in the database.")') 
+     1       num_time_steps
+c
+c read time value at one time step
+c
+      time_step = 3
+      call exgtim (exoid, time_step, time_value, ierr)
+      write (iout, '(/"after exgtim, error = ", i3)' ) ierr
+ 
+      write (iout, '("time value at time step ",i2," = ", f5.3)') 
+     1       time_step, time_value
+c
+c read time values at all time steps
+c
+      call exgatm (exoid, time_values, ierr)
+      write (iout, '(/"after exgatm, error = ", i3)' ) ierr
+ 
+      write (iout, '("time values at all time steps are:")')
+
+      do 370 i = 1, num_time_steps
+         write (iout, '(f5.3)') time_values(i)
+370   continue
+
+      var_index = 1
+      beg_time = 1
+      end_time = -1
+c
+c read all global variables at one time step
+c
+      call exggv (exoid, time_step, num_glo_vars, var_values, ierr)
+      write (iout, '(/"after exggv, error = ", i3)' ) ierr
+ 
+      write (iout, '("global variable values at time step ",i2)') 
+     1       time_step
+
+      do 400 i = 1, num_glo_vars
+         write (iout, '(f5.3)') var_values(i)
+400   continue
+
+c
+c read a single global variable through time
+c
+      call exggvt (exoid, var_index, beg_time, end_time, var_values,
+     1             ierr)
+      write (iout, '(/"after exggvt, error = ", i3)' ) ierr
+ 
+      write (iout, '("global variable ",i2," values through time:")')
+     1       var_index
+
+      do 410 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+410   continue
+
+c
+c read a nodal variable at one time step
+c
+      call exgnv (exoid, time_step, var_index, num_nodes, var_values,
+     1            ierr)
+      write (iout, '(/"after exgnv, error = ", i3)' ) ierr
+
+      write (iout, '("nodal variable ",i2," values at time step ",i2)') 
+     1       var_index, time_step
+
+      do 420 i = 1, num_nodes
+         write (iout, '(f5.3)') var_values(i)
+420   continue
+
+c
+c read a nodal variable through time
+c
+      node_num = 1
+
+      call exgnvt (exoid, var_index, node_num, beg_time, end_time, 
+     1             var_values, ierr)
+      write (iout, '(/"after exgnvt, error = ", i3)' ) ierr
+ 
+      write (iout, '("nodal variable ",i2," values for node ",i2,
+     1               " through time:")') var_index, node_num
+
+      do 430 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+430   continue
+
+c
+c read an element variable at one time step
+c
+      call exgebi (exoid, ids, ierr)
+      write (iout, '(/"after exgebi, error = ", i3)' ) ierr
+
+      do 450 i = 1, num_elem_blk
+
+         call exgev (exoid, time_step, var_index, ids(i), 
+     1               num_elem_in_block(i), var_values, ierr)
+         write (iout, '(/"after exgev, error = ", i3)' ) ierr
+ 
+         if (ierr .eq. 0) then
+            write (iout, '("element variable ",i2," values of element ",
+     1                     "block ",i2," at time step ",i2)')
+     2                     var_index, ids(i), time_step
+         endif
+
+         do 440 j = 1, num_elem_in_block(i)
+            write (iout, '(f5.3)') var_values(j)
+440      continue
+
+450   continue
+
+c
+c read an element variable through time
+c
+      var_index = 2
+      elem_num = 2
+
+      call exgevt (exoid, var_index, elem_num, beg_time, end_time, 
+     1             var_values, ierr)
+      write (iout, '(/"after exgevt, error = ", i3)' ) ierr
+ 
+      write (iout, '("element variable ",i2," values for element ",i2,
+     1               " through time:")') var_index, elem_num
+
+      do 460 i = 1, num_time_steps
+         write (iout, '(f5.3)') var_values(i)
+460   continue
+
+      call exclos (exoid, ierr)
+      write (iout, '(/"after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testwt.f b/exodus/forbind/test/testwt.f
new file mode 100644
index 0000000..13c5cbb
--- /dev/null
+++ b/exodus/forbind/test/testwt.f
@@ -0,0 +1,1183 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwt
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines.
+c
+      include 'exodusII.inc'
+
+      integer iin, iout
+      integer exoid, num_dim,num_nodes,elem_map(5),num_elem,num_elem_blk
+      integer num_elem_in_block(10), num_nodes_per_elem(10),numattr(10)
+      integer num_node_sets, num_side_sets
+      integer i, j, k, m, connect(10) 
+      integer node_list(100), elem_list(100), side_list(100)
+      integer ebids(10),ids(10), num_nodes_per_set(10)
+      integer num_elem_per_set(10), num_df_per_set(10)
+      integer df_ind(10), node_ind(10), elem_ind(10)
+      integer num_qa_rec, num_info
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,5)
+      integer whole_time_step, num_time_steps
+      integer cpu_word_size, io_word_size
+      integer prop_array(2)
+
+      real glob_var_vals(100), nodal_var_vals(100) 
+      real time_value, elem_var_vals(100)
+      real x(100), y(100), z(100)
+      real attrib(100), dist_fact(100)
+
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) var_names(3)
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXLNLN) inform(3)
+      character*(MXSTLN) prop_names(2)
+      character*(MXSTLN) attrib_names(1)
+
+      data iin /5/, iout /6/
+
+      call exopts (EXABRT, ierr)
+      write (iout,'("after exopts, error = ", i4)') ierr
+      cpu_word_size = 0
+      io_word_size = 0
+c
+c  create EXODUS II files 
+c
+      exoid = excre ("test.exo",
+     1	 	     EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test.exo, id: ", i4)') exoid
+      write (iout,'("  cpu word size: ",i4," io word size: ",i4)')
+     1                  cpu_word_size, io_word_size
+      write (iout,'("after excre, error = ", i4)') ierr
+c
+c  initialize file with parameters
+c
+
+      num_dim = 3
+      num_nodes = 26
+      num_elem = 5
+      num_elem_blk = 5
+      num_node_sets = 2
+      num_side_sets = 5
+      call expini (exoid, "This is a test", num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i4)' ) ierr
+
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c  write nodal coordinates values and names to database
+c
+c  Quad #1
+      x(1) = 0.0 
+      x(2) = 1.0 
+      x(3) = 1.0 
+      x(4) = 0.0 
+
+      y(1) = 0.0 
+      y(2) = 0.0 
+      y(3) = 1.0 
+      y(4) = 1.0 
+
+      z(1) = 0.0
+      z(2) = 0.0
+      z(3) = 0.0
+      z(4) = 0.0
+
+c  Quad #2
+      x(5) = 1.0 
+      x(6) = 2.0 
+      x(7) = 2.0 
+      x(8) = 1.0
+
+      y(5) = 0.0 
+      y(6) = 0.0 
+      y(7) = 1.0 
+      y(8) = 1.0
+
+      z(5) = 0.0
+      z(6) = 0.0
+      z(7) = 0.0
+      z(8) = 0.0
+
+c  Hex #1
+      x(9)  =  0.0
+      x(10) = 10.0
+      x(11) = 10.0
+      x(12) =  1.0
+      x(13) =  1.0
+      x(14) = 10.0
+      x(15) = 10.0
+      x(16) =  1.0
+
+      y(9)  =  0.0
+      y(10) =  0.0
+      y(11) =  0.0
+      y(12) =  0.0
+      y(13) = 10.0
+      y(14) = 10.0
+      y(15) = 10.0
+      y(16) = 10.0
+
+      z(9)  =  0.0
+      z(10) =  0.0
+      z(11) =-10.0
+      z(12) =-10.0
+      z(13) =  0.0
+      z(14) =  0.0
+      z(15) =-10.0
+      z(16) =-10.0
+
+c  Tetra #1
+      x(17) =  0.0
+      x(18) =  1.0
+      x(19) = 10.0
+      x(20) =  7.0
+
+      y(17) =  0.0
+      y(18) =  0.0
+      y(19) =  0.0
+      y(20) =  5.0
+
+      z(17) =  0.0
+      z(18) =  5.0
+      z(19) =  2.0
+      z(20) =  3.0
+
+c  Wedge #1
+      x(21) =  3.0
+      x(22) =  6.0
+      x(23) =  0.0
+      x(24) =  3.0
+      x(25) =  6.0
+      x(26) =  0.0
+
+      y(21) =  0.0
+      y(22) =  0.0
+      y(23) =  0.0
+      y(24) =  2.0
+      y(25) =  2.0
+      y(26) =  2.0
+
+      z(21) =  6.0
+      z(22) =  0.0
+      z(23) =  0.0
+      z(24) =  6.0
+      z(25) =  2.0
+      z(26) =  0.0
+      call expcor (exoid, x, y, z, ierr)
+      write (iout, '("after expcor, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+      coord_names(1) = "xcoor"
+      coord_names(2) = "ycoor"
+      coord_names(3) = "zcoor"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i4)' ) ierr
+      call exupda(exoid,ierr)
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      call expmap (exoid, elem_map, ierr)
+      write (iout, '("after expmap, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 1
+      num_elem_in_block(2) = 1
+      num_elem_in_block(3) = 1
+      num_elem_in_block(4) = 1
+      num_elem_in_block(5) = 1
+
+      num_nodes_per_elem(1) = 4
+      num_nodes_per_elem(2) = 4
+      num_nodes_per_elem(3) = 8
+      num_nodes_per_elem(4) = 4
+      num_nodes_per_elem(5) = 6
+
+      ebids(1) = 10
+      ebids(2) = 11
+      ebids(3) = 12
+      ebids(4) = 13
+      ebids(5) = 14
+
+      numattr(1) = 1
+      numattr(2) = 1
+      numattr(3) = 1
+      numattr(4) = 1
+      numattr(5) = 1
+
+      cname = "quad"
+      call expelb (exoid,ebids(1),cname,num_elem_in_block(1),
+     1		num_nodes_per_elem(1),numattr(1),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expelb (exoid,ebids(2),cname,num_elem_in_block(2),
+     1		num_nodes_per_elem(2),numattr(2),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      cname = "hex"
+      call expelb (exoid,ebids(3),cname,num_elem_in_block(3),
+     1		num_nodes_per_elem(3),numattr(3),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      cname = "tetra"
+      call expelb (exoid,ebids(4),cname,num_elem_in_block(4),
+     1		num_nodes_per_elem(4),numattr(4),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      cname = "wedge"
+      call expelb (exoid,ebids(5),cname,num_elem_in_block(5),
+     1		num_nodes_per_elem(5),numattr(5),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c  write element block properties
+
+      prop_names(1) = "MATL"
+      prop_names(2) = "DENSITY"
+      call exppn(exoid,EXEBLK,2,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expp(exoid, EXEBLK, ebids(1), "MATL", 10, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expp(exoid, EXEBLK, ebids(2), "MATL", 20, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expp(exoid, EXEBLK, ebids(3), "MATL", 30, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expp(exoid, EXEBLK, ebids(4), "MATL", 40, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expp(exoid, EXEBLK, ebids(5), "MATL", 50, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write element connectivity
+c
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      connect(1) = 5
+      connect(2) = 6 
+      connect(3) = 7 
+      connect(4) = 8
+
+      call expelc (exoid, ebids(2), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      connect(1) =  9
+      connect(2) = 10
+      connect(3) = 11 
+      connect(4) = 12
+      connect(5) = 13
+      connect(6) = 14
+      connect(7) = 15
+      connect(8) = 16
+
+      call expelc (exoid, ebids(3), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      connect(1) = 17
+      connect(2) = 18
+      connect(3) = 19 
+      connect(4) = 20
+
+      call expelc (exoid, ebids(4), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      connect(1) = 21
+      connect(2) = 22
+      connect(3) = 23
+      connect(4) = 24
+      connect(5) = 25
+      connect(6) = 26
+
+      call expelc (exoid, ebids(5), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write element block attributes
+c
+      attrib(1) = 3.14159
+      call expeat (exoid, ebids(1), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      attrib(1) = 6.14159
+      call expeat (exoid, ebids(2), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expeat (exoid, ebids(3), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expeat (exoid, ebids(4), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expeat (exoid, ebids(5), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      attrib_names(1) = 'THICKNESS'
+      do i=1, 5
+        call expean (exoid, ebids(i), 1, attrib_names, ierr)
+        write (iout, '("after expean, error = ", i4)' ) ierr
+        if (ierr .ne. 0) then
+          call exclos(exoid,ierr)
+          call exit (0)
+        endif
+      end do
+c
+c write individual node sets
+c
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0
+
+      call expnp (exoid, 20, 5, 5, ierr)
+      write (iout, '("after expnp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expns (exoid, 20, node_list, ierr)
+      write (iout, '("after expns, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expnsd (exoid, 20, dist_fact, ierr)
+      write (iout, '("after expnsd, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      node_list(1) = 200 
+      node_list(2) = 201 
+      node_list(3) = 202 
+   
+      dist_fact(1) = 1.1 
+      dist_fact(2) = 2.1 
+      dist_fact(3) = 3.1
+
+      call expnp (exoid, 21, 3, 3, ierr)
+      write (iout, '("after expnp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expns (exoid, 21, node_list, ierr)
+      write (iout, '("after expns, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expnsd (exoid, 21, dist_fact, ierr)
+      write (iout, '("after expnsd, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write concatenated node sets; this produces the same information as
+c the above code which writes individual node sets
+c
+
+      ids(1) = 20 
+      ids(2) = 21
+
+      num_nodes_per_set(1) = 5 
+      num_nodes_per_set(2) = 3
+
+      num_df_per_set(1) = 5 
+      num_df_per_set(2) = 3
+
+      node_ind(1) = 1 
+      node_ind(2) = 6
+
+      df_ind(1) = 1 
+      df_ind(2) = 6
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+      node_list(6) = 200 
+      node_list(7) = 201 
+      node_list(8) = 202
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0 
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0 
+      dist_fact(6) = 1.1 
+      dist_fact(7) = 2.1 
+      dist_fact(8) = 3.1
+
+c     call expcns (exoid, ids, num_nodes_per_set, num_df_per_set,
+c    1        node_ind, df_ind, node_list, dist_fact, ierr)
+c     write (iout, '("after expcns, error = ", i4)' ) ierr
+
+c     write node set properties
+
+      prop_names(1) = "FACE"
+      call expp(exoid, EXNSET, 20, prop_names(1), 4, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expp(exoid, EXNSET, 21, prop_names(1), 5, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      prop_array(1) = 1000
+      prop_array(2) = 2000
+
+      prop_names(1) = "VELOCITY"
+      call exppa(exoid, EXNSET, prop_names(1), prop_array, ierr)
+      write (iout, '("after exppa, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write individual side sets
+c
+
+c     side set #1 - quad
+
+      elem_list(1) = 2
+      elem_list(2) = 2
+
+      side_list(1) = 4 
+      side_list(2) = 2 
+
+      dist_fact(1) = 30.0 
+      dist_fact(2) = 30.1 
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+
+      call expsp (exoid, 30, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expss (exoid, 30, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expssd (exoid, 30, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c     side set #2 - quad, spanning 2 elements
+
+      elem_list(1) = 1
+      elem_list(2) = 2
+
+      side_list(1) = 2
+      side_list(2) = 3
+
+      dist_fact(1) = 31.0
+      dist_fact(2) = 31.1
+      dist_fact(3) = 31.2
+      dist_fact(4) = 31.3
+
+      call expsp (exoid, 31, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expss (exoid, 31, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expssd (exoid, 31, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c     side set #3 - hex
+
+      elem_list(1) = 3
+      elem_list(2) = 3
+      elem_list(3) = 3
+      elem_list(4) = 3
+      elem_list(5) = 3
+      elem_list(6) = 3
+      elem_list(7) = 3
+
+      side_list(1) = 5
+      side_list(2) = 3
+      side_list(3) = 3
+      side_list(4) = 2
+      side_list(5) = 4
+      side_list(6) = 1
+      side_list(7) = 6
+
+      call expsp (exoid, 32, 7, 0, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expss (exoid, 32, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c     side set #4 - tetras
+
+      elem_list(1) = 4
+      elem_list(2) = 4
+      elem_list(3) = 4
+      elem_list(4) = 4
+
+      side_list(1) = 1
+      side_list(2) = 2
+      side_list(3) = 3
+      side_list(4) = 4
+
+      call expsp (exoid, 33, 4, 0, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expss (exoid, 33, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c     side set #5 - wedges
+
+      elem_list(1) = 5
+      elem_list(2) = 5
+      elem_list(3) = 5
+      elem_list(4) = 5
+      elem_list(5) = 5
+
+      side_list(1) = 1
+      side_list(2) = 2
+      side_list(3) = 3
+      side_list(4) = 4
+      side_list(5) = 5
+
+      call expsp (exoid, 34, 5, 0, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expss (exoid, 34, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+c write concatenated side sets; this produces the same information as
+c the above code which writes individual side sets
+c
+
+      ids(1) = 30
+      ids(2) = 31
+      ids(3) = 32
+      ids(4) = 33
+      ids(5) = 34
+
+c     side set #1
+      node_list(1) = 8
+      node_list(2) = 5
+      node_list(3) = 6
+      node_list(4) = 7
+
+c     side set #2
+      node_list(5) = 2
+      node_list(6) = 3
+      node_list(7) = 7
+      node_list(8) = 8
+
+c     side set #3
+      node_list(9)  =  9 
+      node_list(10) = 12
+      node_list(11) = 11
+      node_list(12) = 10
+
+      node_list(13) = 11
+      node_list(14) = 12
+      node_list(15) = 16
+      node_list(16) = 15
+
+      node_list(17) = 16
+      node_list(18) = 15
+      node_list(19) = 11
+      node_list(20) = 12
+
+      node_list(21) = 10
+      node_list(22) = 11
+      node_list(23) = 15
+      node_list(24) = 14
+
+      node_list(25) = 13
+      node_list(26) = 16
+      node_list(27) = 12
+      node_list(28) =  9
+
+      node_list(29) = 14
+      node_list(30) = 13
+      node_list(31) =  9
+      node_list(32) = 10
+
+      node_list(33) = 16
+      node_list(34) = 13
+      node_list(35) = 14
+      node_list(36) = 15
+
+c     side set #4
+      node_list(37) = 17
+      node_list(38) = 18
+      node_list(39) = 20
+
+      node_list(40) = 18
+      node_list(41) = 19
+      node_list(42) = 20
+
+      node_list(43) = 20
+      node_list(44) = 19
+      node_list(45) = 17
+
+      node_list(46) = 19
+      node_list(47) = 18
+      node_list(48) = 17
+
+c     side set #5
+      node_list(49) = 25
+      node_list(50) = 24
+      node_list(51) = 21
+      node_list(52) = 22
+
+      node_list(53) = 26
+      node_list(54) = 25
+      node_list(55) = 22
+      node_list(56) = 23
+
+      node_list(57) = 26
+      node_list(58) = 23
+      node_list(59) = 21
+      node_list(60) = 24
+
+      node_list(61) = 23
+      node_list(62) = 22
+      node_list(63) = 21
+
+      node_list(64) = 24
+      node_list(65) = 25
+      node_list(66) = 26
+
+      num_elem_per_set(1) = 2
+      num_elem_per_set(2) = 2
+      num_elem_per_set(3) = 7
+      num_elem_per_set(4) = 4
+      num_elem_per_set(5) = 5
+
+      num_nodes_per_set(1) = 4
+      num_nodes_per_set(2) = 4
+      num_nodes_per_set(3) = 28
+      num_nodes_per_set(4) = 12
+      num_nodes_per_set(5) = 20
+
+      elem_ind(1) = 1
+      elem_ind(2) = 3
+      elem_ind(3) = 5
+      elem_ind(4) = 12
+      elem_ind(5) = 16
+
+      node_ind(1) = 1
+      node_ind(2) = 5
+      node_ind(3) = 9
+      node_ind(4) = 37
+      node_ind(5) = 48
+   
+      elem_list(1) = 3 
+      elem_list(2) = 3
+      elem_list(3) = 1 
+      elem_list(4) = 3
+      elem_list(5) = 4
+      elem_list(6) = 4
+      elem_list(7) = 4
+      elem_list(8) = 4
+      elem_list(9) = 4
+      elem_list(10) = 4
+      elem_list(11) = 4
+      elem_list(12) = 5
+      elem_list(13) = 5
+      elem_list(14) = 5
+      elem_list(15) = 5
+      elem_list(16) = 6
+      elem_list(17) = 6
+      elem_list(18) = 6
+      elem_list(19) = 6
+      elem_list(20) = 6
+
+c     side_list(1) = 1 
+c     side_list(2) = 2 
+c     side_list(3) = 3 
+c     side_list(4) = 4
+
+c     call excn2s(exoid, num_elem_per_set, num_nodes_per_set, elem_ind,
+c    1		node_ind, elem_list, node_list, side_list, ierr)
+c     write (iout, '("after excn2s, error = ", i4)' ) ierr
+
+
+      num_df_per_set(1) = 4
+      num_df_per_set(2) = 4
+      num_df_per_set(3) = 0
+      num_df_per_set(4) = 0
+      num_df_per_set(5) = 0
+
+      df_ind(1) = 1
+      df_ind(2) = 5
+   
+      dist_fact(1) = 30.0 
+      dist_fact(2) = 30.1 
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3 
+      dist_fact(5) = 31.0 
+      dist_fact(6) = 31.1 
+      dist_fact(7) = 31.2
+      dist_fact(8) = 31.3 
+
+c     call expcss (exoid, ids, num_elem_per_set, num_df_per_set, 
+c    1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+c    2             ierr)
+c     write (iout, '("after expcss, error = ", i4)' ) ierr
+
+      prop_names(1) = "COLOR"
+      call expp(exoid, EXSSET, 30, prop_names(1), 100, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expp(exoid, EXSSET, 31, prop_names(1), 101, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+c
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "TESTWT fortran version"
+      qa_record(2,1) = "testwt"
+      qa_record(3,1) = "07/07/93"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "07/07/93"
+      qa_record(4,2) = "16:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c write results variables parameters and names
+
+      num_glo_vars = 1
+  
+      var_names(1) = "glo_vars"
+
+      call expvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+      num_nod_vars = 2
+
+      var_names(1) = "nod_var0"
+      var_names(2) = "nod_var1"
+
+      call expvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+   
+      num_ele_vars = 3
+
+      var_names(1) = "ele_var0"
+      var_names(2) = "ele_var1"
+      var_names(3) = "ele_var2"
+
+      call expvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+      call expvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write element variable truth table
+c
+
+      k = 0
+
+      do 30 i = 1,num_elem_blk
+         do 20 j = 1,num_ele_vars
+            truth_tab(j,i) = 1
+20       continue
+30    continue
+
+      call expvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '("after expvtt, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c for each time step, write the analysis results;
+c the code below fills the arrays glob_var_vals, 
+c nodal_var_vals, and elem_var_vals with values for debugging purposes;
+c obviously the analysis code will populate these arrays
+c
+
+      whole_time_step = 1
+      num_time_steps = 10
+
+      do 110 i = 1, num_time_steps
+        time_value = real(i)/100.
+c
+c write time value
+c
+
+        call exptim (exoid, whole_time_step, time_value, ierr)
+        write (iout, '("after exptim, error = ", i4)' ) ierr
+        if (ierr .ne. 0) then
+           call exclos(exoid,ierr)
+           call exit (0)
+        endif
+
+c
+c write global variables
+c
+
+        do 50 j = 1, num_glo_vars
+          glob_var_vals(j) = real(j+1) * time_value
+50      continue
+
+        call expgv (exoid, whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+        write (iout, '("after expgv, error = ", i4)' ) ierr
+        if (ierr .ne. 0) then
+           call exclos(exoid,ierr)
+           call exit (0)
+        endif
+
+c
+c write nodal variables
+c
+
+        do 70 k = 1, num_nod_vars
+          do 60 j = 1, num_nodes
+
+            nodal_var_vals(j) = real(k) + (real(j) * time_value)
+
+60        continue
+
+          call expnv (exoid, whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+          write (iout, '("after expnv, error = ", i4)' ) ierr
+          if (ierr .ne. 0) then
+             call exclos(exoid,ierr)
+             call exit (0)
+          endif
+
+70      continue
+
+c
+c write element variables
+c
+
+        do 100 k = 1, num_ele_vars
+          do 90 j = 1, num_elem_blk
+            do 80 m = 1, num_elem_in_block(j)
+
+              elem_var_vals(m) = real(k+1) + real(j+1) + 
+     1                          (real(m)*time_value)
+c             write(iout,*)'elem_var_val(',m,'): ',elem_var_vals(m)
+
+80          continue
+
+            call expev (exoid, whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+            write (iout, '("after expev, error = ", i4)' ) ierr
+            if (ierr .ne. 0) then
+               call exclos(exoid,ierr)
+               call exit (0)
+            endif
+
+90        continue
+100     continue
+
+        whole_time_step = whole_time_step + 1
+
+c
+c update the data file; this should be done at the end of every time 
+c step to ensure that no data is lost if the analysis dies
+c
+        call exupda (exoid, ierr)
+        write (iout, '("after exupda, error = ", i4)' ) ierr
+        if (ierr .ne. 0) then
+           call exclos(exoid,ierr)
+           call exit (0)
+        endif
+
+110   continue
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i4)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testwt1.f b/exodus/forbind/test/testwt1.f
new file mode 100644
index 0000000..8db73b0
--- /dev/null
+++ b/exodus/forbind/test/testwt1.f
@@ -0,0 +1,1029 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwt1
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines.
+c
+
+c	history - 
+c	Original L.A. Schoof
+c	02/25/93 V.R. Yarberry - Added error checks for file creation.
+c	03/04/93 V.R. Yarberry - Fixed bug in expvtt test, ebids was not passed 
+c	08/31/93 VRY - updated to match API version 2.00
+c
+      include 'exodusII.inc'
+
+      integer iin, iout
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_elem_in_block(10), num_nodes_per_elem(10),numattr(10)
+      integer num_node_sets, num_side_sets
+      integer i, j, k, m, elem_map(10), node_map(100), connect(10) 
+      integer node_list(100), elem_list(100), side_list(100)
+      integer ebids(10),ids(10), num_nodes_per_set(10)
+      integer num_elem_per_set(10), num_df_per_set(10)
+      integer df_ind(10), node_ind(10), elem_ind(10)
+      integer num_qa_rec, num_info
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,7)
+      integer whole_time_step, num_time_steps
+      integer cpu_word_size, io_word_size
+      integer prop_array(2)
+
+      real glob_var_vals(100), nodal_var_vals(100) 
+      real time_value, elem_var_vals(100)
+      real x(100), y(100), z(100)
+      real attrib(100), dist_fact(100)
+
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) var_names(3)
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXLNLN) inform(3)
+      character*(MXSTLN) prop_names(2)
+      character*(MXSTLN) attrib_names(3)
+
+      data iin /5/, iout /6/
+
+      cpu_word_size = 0
+      io_word_size = 0
+c
+c  create EXODUS II files 
+c
+      exoid = excre ("test.exo",
+     1	 	     EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test.exo, id: ", i4)') exoid
+      write (iout,'("  cpu word size: ",i4," io word size: ",i4)')
+     1                  cpu_word_size, io_word_size
+      write (iout,'("after excre, error = ", i4)') ierr
+c
+c  initialize file with parameters
+c
+
+      num_dim = 3
+      num_nodes = 28
+      num_elem = 8
+      num_elem_blk = 7
+      num_node_sets = 2
+      num_side_sets = 5
+c     Uncomment the following line to test NULL side sets
+c     num_side_sets = 6
+
+      call expini (exoid, "This is testwt1", num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i4)' ) ierr
+
+c
+c  write nodal coordinates values and names to database
+c
+c  Quad #1
+      x(1) = 0.0 
+      x(2) = 1.0 
+      x(3) = 1.0 
+      x(4) = 0.0 
+
+      y(1) = 0.0 
+      y(2) = 0.0 
+      y(3) = 1.0 
+      y(4) = 1.0 
+
+      z(1) = 0.0
+      z(2) = 0.0
+      z(3) = 0.0
+      z(4) = 0.0
+
+c  Quad #2
+      x(5) = 1.0 
+      x(6) = 2.0 
+      x(7) = 2.0 
+      x(8) = 1.0
+
+      y(5) = 0.0 
+      y(6) = 0.0 
+      y(7) = 1.0 
+      y(8) = 1.0
+
+      z(5) = 0.0
+      z(6) = 0.0
+      z(7) = 0.0
+      z(8) = 0.0
+
+c  Hex #1
+      x(9)  =  0.0
+      x(10) = 10.0
+      x(11) = 10.0
+      x(12) =  1.0
+      x(13) =  1.0
+      x(14) = 10.0
+      x(15) = 10.0
+      x(16) =  1.0
+
+      y(9)  =  0.0
+      y(10) =  0.0
+      y(11) =  0.0
+      y(12) =  0.0
+      y(13) = 10.0
+      y(14) = 10.0
+      y(15) = 10.0
+      y(16) = 10.0
+
+      z(9)  =  0.0
+      z(10) =  0.0
+      z(11) =-10.0
+      z(12) =-10.0
+      z(13) =  0.0
+      z(14) =  0.0
+      z(15) =-10.0
+      z(16) =-10.0
+
+c  Tetra #1
+      x(17) =  0.0
+      x(18) =  1.0
+      x(19) = 10.0
+      x(20) =  7.0
+
+      y(17) =  0.0
+      y(18) =  0.0
+      y(19) =  0.0
+      y(20) =  5.0
+
+      z(17) =  0.0
+      z(18) =  5.0
+      z(19) =  2.0
+      z(20) =  3.0
+
+c Circle #1
+      x(21) = 100.0
+      y(21) = 100.0
+      z(21) =   0.0
+
+c  Sphere #1
+      x(22) = 50.0
+      y(22) = 50.0
+      z(22) = 20.0
+
+c  Wedge #1
+      x(23) =  3.0
+      x(24) =  6.0
+      x(25) =  0.0
+      x(26) =  3.0
+      x(27) =  6.0
+      x(28) =  0.0
+
+      y(23) =  0.0
+      y(24) =  0.0
+      y(25) =  0.0
+      y(26) =  2.0
+      y(27) =  2.0
+      y(28) =  2.0
+
+      z(23) =  6.0
+      z(24) =  0.0
+      z(25) =  0.0
+      z(26) =  6.0
+      z(27) =  2.0
+      z(28) =  0.0
+      call expcor (exoid, x, y, z, ierr)
+      write (iout, '("after expcor, error = ", i4)' ) ierr
+
+      coord_names(1) = "xcoor"
+      coord_names(2) = "ycoor"
+      coord_names(3) = "zcoor"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i4)' ) ierr
+
+c
+c write node and element map parameters
+c
+
+      n_node_maps = 1
+      n_elem_maps = 2
+
+      call expmp (exoid, n_node_maps, n_elem_maps, ierr)
+      write (iout, '("after expmp, error = ", i4)' ) ierr
+
+c
+c write element map properties
+c
+
+      prop_names(1) = "ORDER"
+      prop_names(2) = "NUMBER"
+      call exppn(exoid,EXEMAP,2,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      id = 111
+      call expem (exoid, id, elem_map, ierr)
+      write (iout, '("after expem, error = ", i4)' ) ierr
+
+      call expp(exoid, EXEMAP, id, "ORDER", 1, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+c
+c write element numbering map
+c
+      id = 222
+C write map an element at a time...
+      do 11 i = 1, num_elem
+        elem_map(i) = i*2
+        call exppem (exoid, id, i, 1, elem_map(i), ierr)
+        write (iout, '("after exppem, error = ", i4)' ) ierr
+11    continue
+
+      call expp(exoid, EXEMAP, id, "NUMBER", 1, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+c
+c write node map properties
+c
+
+      prop_names(1) = "NUMBER"
+      call exppn(exoid,EXNMAP,1,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+
+c
+c write node numbering map
+c
+
+      do 13 i = 1, num_nodes
+        node_map(i) = i*3
+ 13   continue
+
+      id = 333
+      call expnm (exoid, id, node_map, ierr)
+      write (iout, '("after expnm, error = ", i4)' ) ierr
+
+      call expp(exoid, EXNMAP, id, "NUMBER", 1, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 1
+      num_elem_in_block(2) = 2
+      num_elem_in_block(3) = 1
+      num_elem_in_block(4) = 1
+      num_elem_in_block(5) = 1
+      num_elem_in_block(6) = 1
+      num_elem_in_block(7) = 1
+
+      num_nodes_per_elem(1) = 4
+      num_nodes_per_elem(2) = 4
+      num_nodes_per_elem(3) = 8
+      num_nodes_per_elem(4) = 4
+      num_nodes_per_elem(5) = 1
+      num_nodes_per_elem(6) = 1
+      num_nodes_per_elem(7) = 6
+
+      ebids(1) = 10
+      ebids(2) = 11
+      ebids(3) = 12
+      ebids(4) = 13
+      ebids(5) = 14
+      ebids(6) = 15
+      ebids(7) = 16
+
+      numattr(1) = 3
+      numattr(2) = 3
+      numattr(3) = 3
+      numattr(4) = 3
+      numattr(5) = 3
+      numattr(6) = 3
+      numattr(7) = 3
+
+      cname = "quad"
+      call expelb (exoid,ebids(1),cname,num_elem_in_block(1),
+     1		num_nodes_per_elem(1),numattr(1),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      call expelb (exoid,ebids(2),cname,num_elem_in_block(2),
+     1		num_nodes_per_elem(2),numattr(2),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "hex"
+      call expelb (exoid,ebids(3),cname,num_elem_in_block(3),
+     1		num_nodes_per_elem(3),numattr(3),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "tetra"
+      call expelb (exoid,ebids(4),cname,num_elem_in_block(4),
+     1		num_nodes_per_elem(4),numattr(4),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "circle"
+      call expelb (exoid,ebids(5),cname,num_elem_in_block(5),
+     1		num_nodes_per_elem(5),numattr(5),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "sphere"
+      call expelb (exoid,ebids(6),cname,num_elem_in_block(6),
+     1		num_nodes_per_elem(6),numattr(6),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "wedge"
+      call expelb (exoid,ebids(7),cname,num_elem_in_block(7),
+     1		num_nodes_per_elem(7),numattr(7),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+c  write element block properties
+
+      prop_names(1) = "MATL"
+      prop_names(2) = "DENSITY"
+      call exppn(exoid,EXEBLK,2,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+
+      call expp(exoid, EXEBLK, ebids(1), "MATL", 10, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(2), "MATL", 20, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(3), "MATL", 30, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(4), "MATL", 40, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(5), "MATL", 50, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(6), "MATL", 60, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(7), "MATL", 70, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+c
+c write element connectivity
+c
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+      connect(5) = 5
+      connect(6) = 6 
+      connect(7) = 7 
+      connect(8) = 8
+
+      call expelc (exoid, ebids(2), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) =  9
+      connect(2) = 10
+      connect(3) = 11 
+      connect(4) = 12
+      connect(5) = 13
+      connect(6) = 14
+      connect(7) = 15
+      connect(8) = 16
+
+      call expelc (exoid, ebids(3), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 17
+      connect(2) = 18
+      connect(3) = 19 
+      connect(4) = 20
+
+      call expelc (exoid, ebids(4), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 21
+
+      call expelc (exoid, ebids(5), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 22
+
+      call expelc (exoid, ebids(6), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 23
+      connect(2) = 24
+      connect(3) = 25
+      connect(4) = 26
+      connect(5) = 27
+      connect(6) = 28
+
+      call expelc (exoid, ebids(7), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+c
+c write element block attributes
+c
+      attrib(1) = 1.0  !  block 1
+      attrib(2) = 2.0 
+      attrib(3) = 3.0 
+      attrib(4) = 1.11 !  block 2, element 1
+      attrib(5) = 2.11 
+      attrib(6) = 3.11 
+      attrib(7) = 1.12 !  block 2, element 2
+      attrib(8) = 2.12 
+      attrib(9) = 3.12 
+      attrib(10) = 1.2  !  block 3
+      attrib(11) = 2.2 
+      attrib(12) = 3.2 
+      attrib(13) = 1.3 !  block 4
+      attrib(14) = 2.3 
+      attrib(15) = 3.3 
+      attrib(16) = 1.4 !  block 5
+      attrib(17) = 2.4 
+      attrib(18) = 3.4 
+      attrib(19) = 1.5 !  block 6
+      attrib(20) = 2.5 
+      attrib(21) = 3.5 
+      attrib(22) = 1.6 !  block 7
+      attrib(23) = 2.6 
+      attrib(24) = 3.6 
+
+      call expeat (exoid, ebids(1), attrib(1), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(2), attrib(4), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(3), attrib(10), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(4), attrib(13), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(5), attrib(16), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(6), attrib(19), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(7), attrib(22), ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      attrib_names(1) = "attribute_1"
+      attrib_names(2) = "attribute_2"
+      attrib_names(3) = "attribute_3"
+      do i=1, num_elem_blk
+        call expean (exoid, ebids(i), numattr(i), attrib_names, ierr)
+        write (iout, '("after expean, error = ", i4)' ) ierr
+      end do
+        
+c
+c write individual node sets
+c
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0
+
+c     call expnp (exoid, 20, 5, 5, ierr)
+c     write (iout, '("after expnp, error = ", i4)' ) ierr
+c     call expns (exoid, 20, node_list, ierr)
+c     write (iout, '("after expns, error = ", i4)' ) ierr
+c     call expnsd (exoid, 20, dist_fact, ierr)
+c     write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+      node_list(1) = 200 
+      node_list(2) = 201 
+      node_list(3) = 202 
+   
+      dist_fact(1) = 1.1 
+      dist_fact(2) = 2.1 
+      dist_fact(3) = 3.1
+
+c     call expnp (exoid, 21, 3, 3, ierr)
+c     write (iout, '("after expnp, error = ", i4)' ) ierr
+c     call expns (exoid, 21, node_list, ierr)
+c     write (iout, '("after expns, error = ", i4)' ) ierr
+c     call expnsd (exoid, 21, dist_fact, ierr)
+c     write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+c
+c write concatenated node sets; this produces the same information as
+c the above code which writes individual node sets
+c
+
+      ids(1) = 20 
+      ids(2) = 21
+
+      num_nodes_per_set(1) = 5 
+      num_nodes_per_set(2) = 3
+
+      num_df_per_set(1) = 5 
+      num_df_per_set(2) = 3
+
+      node_ind(1) = 1 
+      node_ind(2) = 6
+
+      df_ind(1) = 1 
+      df_ind(2) = 6
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+      node_list(6) = 200 
+      node_list(7) = 201 
+      node_list(8) = 202
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0 
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0 
+      dist_fact(6) = 1.1 
+      dist_fact(7) = 2.1 
+      dist_fact(8) = 3.1
+
+      call expcns (exoid, ids, num_nodes_per_set, num_df_per_set,
+     1        node_ind, df_ind, node_list, dist_fact, ierr)
+      write (iout, '("after expcns, error = ", i4)' ) ierr
+
+c     write node set properties
+
+      prop_names(1) = "FACE"
+      call expp(exoid, EXNSET, 20, prop_names(1), 4, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXNSET, 21, prop_names(1), 5, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      prop_array(1) = 1000
+      prop_array(2) = 2000
+
+      prop_names(1) = "VELOCITY"
+      call exppa(exoid, EXNSET, prop_names(1), prop_array, ierr)
+      write (iout, '("after exppa, error = ", i4)' ) ierr
+
+c
+c write individual side sets
+c
+
+      elem_list(1) = 11
+      elem_list(2) = 12
+
+      side_list(1) = 1 
+      side_list(2) = 2 
+
+      dist_fact(1) = 30.0 
+      dist_fact(2) = 30.1 
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+
+c     call expsp (exoid, 30, 2, 4, ierr)
+c     write (iout, '("after expsp, error = ", i4)' ) ierr
+
+c     call expss (exoid, 30, elem_list, side_list, ierr)
+c     write (iout, '("after expss, error = ", i4)' ) ierr
+
+c     call expssd (exoid, 30, dist_fact, ierr)
+c     write (iout, '("after expssd, error = ", i4)' ) ierr
+
+      elem_list(1) = 13
+      elem_list(2) = 14
+
+      side_list(1) = 3
+      side_list(2) = 4
+
+      dist_fact(1) = 31.0
+      dist_fact(2) = 31.1
+      dist_fact(3) = 31.2
+      dist_fact(4) = 31.3
+
+c     call expsp (exoid, 31, 2, 4, ierr)
+c     write (iout, '("after expsp, error = ", i4)' ) ierr
+
+c     call expss (exoid, 31, elem_list, side_list, ierr)
+c     write (iout, '("after expss, error = ", i4)' ) ierr
+
+c     call expssd (exoid, 31, dist_fact, ierr)
+c     write (iout, '("after expssd, error = ", i4)' ) ierr
+
+c write concatenated side sets; this produces the same information as
+c the above code which writes individual side sets
+c
+
+      ids(1) = 30
+      ids(2) = 31
+      ids(3) = 32
+      ids(4) = 33
+      ids(5) = 34
+      ids(6) = 35
+
+c     side set #1 - quad
+      node_list(1) = 8
+      node_list(2) = 5
+      node_list(3) = 6
+      node_list(4) = 7
+
+c     side set #2 - quad/hex, spanning 2 element types
+      node_list(5) = 2
+      node_list(6) = 3
+      node_list(7) = 7
+      node_list(8) = 8
+
+c     side set #3 - hex
+      node_list(9)  =  9 
+      node_list(10) = 12
+      node_list(11) = 11
+      node_list(12) = 10
+
+      node_list(13) = 11
+      node_list(14) = 12
+      node_list(15) = 16
+      node_list(16) = 15
+
+      node_list(17) = 16
+      node_list(18) = 15
+      node_list(19) = 11
+      node_list(20) = 12
+
+      node_list(21) = 10
+      node_list(22) = 11
+      node_list(23) = 15
+      node_list(24) = 14
+
+      node_list(25) = 13
+      node_list(26) = 16
+      node_list(27) = 12
+      node_list(28) =  9
+
+      node_list(29) = 14
+      node_list(30) = 13
+      node_list(31) =  9
+      node_list(32) = 10
+
+      node_list(33) = 16
+      node_list(34) = 13
+      node_list(35) = 14
+      node_list(36) = 15
+
+c     side set #4 - Tetra
+      node_list(37) = 17
+      node_list(38) = 18
+      node_list(39) = 20
+
+      node_list(40) = 18
+      node_list(41) = 19
+      node_list(42) = 20
+
+      node_list(43) = 20
+      node_list(44) = 19
+      node_list(45) = 17
+
+      node_list(46) = 19
+      node_list(47) = 18
+      node_list(48) = 17
+
+c     side set #5 - Circle/Sphere
+      node_list(49) = 21
+      node_list(50) = 22
+
+c     side set #6 - Wedges
+      node_list(51) = 27
+      node_list(52) = 26
+      node_list(53) = 23
+      node_list(54) = 24
+
+      node_list(55) = 28
+      node_list(56) = 27
+      node_list(57) = 24
+      node_list(58) = 25
+
+      node_list(59) = 28
+      node_list(60) = 25
+      node_list(61) = 23
+      node_list(62) = 26
+
+      node_list(63) = 25
+      node_list(64) = 24
+      node_list(65) = 23
+
+      node_list(66) = 26
+      node_list(67) = 27
+      node_list(68) = 28
+
+      num_elem_per_set(1) = 2
+      num_elem_per_set(2) = 2
+      num_elem_per_set(3) = 7
+      num_elem_per_set(4) = 4
+      num_elem_per_set(5) = 2
+      num_elem_per_set(6) = 5
+c     Uncomment following line to test NULL side sets
+c     num_elem_per_set(6) = 0
+
+      num_nodes_per_set(1) = 4
+      num_nodes_per_set(2) = 4
+      num_nodes_per_set(3) = 28
+      num_nodes_per_set(4) = 12
+      num_nodes_per_set(5) =  2 
+      num_nodes_per_set(6) = 18
+
+      elem_ind(1) = 1
+      elem_ind(2) = 3
+      elem_ind(3) = 5
+      elem_ind(4) = 12
+      elem_ind(5) = 16
+      elem_ind(6) = 18
+
+      node_ind(1) = 1
+      node_ind(2) = 5
+      node_ind(3) = 9
+      node_ind(4) = 37
+      node_ind(5) = 48
+      node_ind(6) = 50
+   
+      elem_list(1) = 3 
+      elem_list(2) = 3
+      elem_list(3) = 1 
+      elem_list(4) = 3
+      elem_list(5) = 4
+      elem_list(6) = 4
+      elem_list(7) = 4
+      elem_list(8) = 4
+      elem_list(9) = 4
+      elem_list(10) = 4
+      elem_list(11) = 4
+      elem_list(12) = 5
+      elem_list(13) = 5
+      elem_list(14) = 5
+      elem_list(15) = 5
+      elem_list(16) = 6
+      elem_list(17) = 7
+      elem_list(18) = 8
+      elem_list(19) = 8
+      elem_list(20) = 8
+      elem_list(21) = 8
+      elem_list(22) = 8
+
+c     side_list(1) = 1 
+c     side_list(2) = 2 
+c     side_list(3) = 3 
+c     side_list(4) = 4
+
+      call excn2s(exoid, num_elem_per_set, num_nodes_per_set, elem_ind,
+     1		node_ind, elem_list, node_list, side_list, ierr)
+      write (iout, '("after excn2s, error = ", i4)' ) ierr
+
+      num_df_per_set(1) = 4
+      num_df_per_set(2) = 4
+      num_df_per_set(3) = 0
+      num_df_per_set(4) = 0
+      num_df_per_set(5) = 0
+      num_df_per_set(6) = 0
+
+      df_ind(1) = 1
+      df_ind(2) = 5
+      df_ind(3) = 9
+      df_ind(4) = 9
+      df_ind(5) = 9
+      df_ind(6) = 9
+   
+      dist_fact(1) = 30.0 
+      dist_fact(2) = 30.1 
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3 
+      dist_fact(5) = 31.0 
+      dist_fact(6) = 31.1 
+      dist_fact(7) = 31.2
+      dist_fact(8) = 31.3 
+
+      call expcss (exoid, ids, num_elem_per_set, num_df_per_set, 
+     1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+     2             ierr)
+      write (iout, '("after expcss, error = ", i4)' ) ierr
+
+      prop_names(1) = "COLOR"
+      call expp(exoid, EXSSET, 30, prop_names(1), 100, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXSSET, 31, prop_names(1), 101, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+c
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "TESTWT1 fortran version"
+      qa_record(2,1) = "testwt1"
+      qa_record(3,1) = "03/16/94"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "07/07/93"
+      qa_record(4,2) = "16:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i4)' ) ierr
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i4)' ) ierr
+
+
+c write results variables parameters and names
+
+      num_glo_vars = 1
+  
+      var_names(1) = "glo vars"
+
+      call expvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvnm (exoid, "g", 1, var_names(1), ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+
+      num_nod_vars = 2
+
+      var_names(1) = "nod_var0"
+      var_names(2) = "nod_var1"
+
+      call expvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+   
+      num_ele_vars = 3
+
+      var_names(1) = "ele_var0"
+      var_names(2) = "ele_var1"
+      var_names(3) = "ele_var2"
+
+      call expvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+c
+c write element variable truth table
+c
+
+      k = 0
+
+      do 30 i = 1,num_elem_blk
+         do 20 j = 1,num_ele_vars
+            truth_tab(j,i) = 1
+20       continue
+30    continue
+
+      truth_tab(1,3) = 0
+
+c     call expvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+c     write (iout, '("after expvtt, error = ", i4)' ) ierr
+
+c
+c for each time step, write the analysis results;
+c the code below fills the arrays glob_var_vals, 
+c nodal_var_vals, and elem_var_vals with values for debugging purposes;
+c obviously the analysis code will populate these arrays
+c
+
+      whole_time_step = 1
+      num_time_steps = 10
+
+      do 110 i = 1, num_time_steps
+        time_value = real(i)/100.
+c
+c write time value
+c
+
+        call exptim (exoid, whole_time_step, time_value, ierr)
+        write (iout, '("after exptim, error = ", i4)' ) ierr
+
+c
+c write global variables
+c
+
+        do 50 j = 1, num_glo_vars
+          glob_var_vals(j) = real(j+1) * time_value
+50      continue
+
+        call expgv (exoid, whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+        write (iout, '("after expgv, error = ", i4)' ) ierr
+
+c
+c write nodal variables
+c
+
+        do 70 k = 1, num_nod_vars
+          do 60 j = 1, num_nodes
+
+            nodal_var_vals(j) = real(k) + (real(j) * time_value)
+
+60        continue
+
+          call expnv (exoid, whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+          write (iout, '("after expnv, error = ", i4)' ) ierr
+
+70      continue
+
+c
+c write element variables
+c
+
+        do 100 k = 1, num_ele_vars
+          do 90 j = 1, num_elem_blk
+            do 80 m = 1, num_elem_in_block(j)
+
+              elem_var_vals(m) = real(k+1) + real(j+1) + 
+     1                          (real(m)*time_value)
+c             write(iout,*)'elem_var_val(',m,'): ',elem_var_vals(m)
+
+80          continue
+
+	    if (k .eq. 1 .and. j .eq. 3) then
+		continue	! skip element block 3, variable 1
+	    else
+              call expev (exoid, whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+              write (iout, '("after expev, error = ", i4)' ) ierr
+            endif
+
+90        continue
+100     continue
+
+        whole_time_step = whole_time_step + 1
+
+c
+c update the data file; this should be done at the end of every time 
+c step to ensure that no data is lost if the analysis dies
+c
+        call exupda (exoid, ierr)
+        write (iout, '("after exupda, error = ", i4)' ) ierr
+
+110   continue
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i4)' ) ierr
+
+      stop
+      end
diff --git a/exodus/forbind/test/testwt2.f b/exodus/forbind/test/testwt2.f
new file mode 100644
index 0000000..2642742
--- /dev/null
+++ b/exodus/forbind/test/testwt2.f
@@ -0,0 +1,1465 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwt2
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines. It tests multiple simultaneous output files.
+c
+c     09/07/93	V.R. Yarberry - Revised for 2.00 API
+
+      include 'exodusII.inc'
+
+      integer iin, iout
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer exoid2, num_dim2, num_nodes2, num_elem2, num_elem_blk2
+      integer num_elem_in_block(10), num_node_sets
+      integer num_elem_in_block2(10), num_node_sets2
+      integer num_side_sets, num_nodes_per_elem(10), numattr(10)
+      integer num_side_sets2, num_nodes_per_elem2(10), numattr2(10)
+      integer i, j, k, m, elem_map(5), connect(10) 
+      integer elem_map2(5), connect2(10) 
+      integer node_list(100), elem_list(100), side_list(100)
+      integer node_list2(100), elem_list2(100), side_list2(100)
+      integer ebids(10),ids(10),num_nodes_per_set(10)
+      integer num_elem_per_set(10), num_df_per_set(10)
+      integer ebids2(10)
+      integer df_ind(10), node_ind(10), elem_ind(10)
+      integer num_qa_rec, num_info
+      integer num_qa_rec2,num_info2
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer num_glo_vars2, num_nod_vars2, num_ele_vars2
+      integer truth_tab(3,5)
+      integer whole_time_step, num_time_steps
+      integer cpu_word_size, io_word_size
+      integer prop_array(2)
+
+      real glob_var_vals(100), nodal_var_vals(100) 
+      real time_value, elem_var_vals(100)
+      real time_value2
+      real x(100), y(100), z(100)
+      real x2(100), y2(100), z2(100)
+      real attrib(100), dist_fact(100)
+      real attrib2(100), dist_fact2(100)
+
+      character*(MXLNLN) title
+      character*(MXLNLN) title2
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) coord_names2(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) cname2
+      character*(MXSTLN) var_names(3)
+      character*(MXSTLN) var_names2(3)
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXSTLN) qa_record2(4,2)
+      character*(MXLNLN) inform(3)
+      character*(MXLNLN) inform2(3)
+      character*(MXSTLN) prop_names(2)
+
+      data iin /5/, iout /6/
+
+c
+c  create EXODUS II files 
+c
+      cpu_word_size = 0
+      io_word_size = 4
+c
+c     first create a "regular" file that contains everything except
+c     history variable info
+c
+      exoid = excre ("test.exo",
+     1               EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test.exo,id: ",i4,", err=",i3)')
+     1		 exoid, ierr
+      write (iout,'("  cpu word size: ",i4," io word size: ",i4)')
+     1                  cpu_word_size, io_word_size
+      write (iout, '("after excre, error = ", i4)' ) ierr
+
+      exoid2= excre ("test2.exo",
+     1               EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test2.exo,id: ",i4,", err=",i3)')
+     1		 exoid2, ierr
+      write (iout, '("after excre (2), error = ", i4)' ) ierr
+
+c
+c  initialize file with parameters
+c
+
+      title = "This is test 2"
+      num_dim = 3
+      num_nodes = 26
+      num_elem = 5
+      num_elem_blk = 5
+      num_node_sets = 2
+      num_side_sets = 5
+
+      call expini (exoid, title, num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i4)' ) ierr
+      
+      title2 = "This is test 2"
+      num_dim2 = 3
+      num_nodes2 = 26
+      num_elem2 = 5
+      num_elem_blk2 = 5
+      num_node_sets2 = 2
+      num_side_sets2 = 5
+
+      call expini (exoid2, title2, num_dim2, num_nodes2, 
+     1             num_elem2, num_elem_blk2, num_node_sets2, 
+     2             num_side_sets2, ierr)
+
+      write (iout, '("after expini (2), error = ", i4)' ) ierr
+
+
+c
+c  write nodal coordinates values and names to database
+c
+c  Quad #1
+      x(1) = 0.0
+      x(2) = 1.0
+      x(3) = 1.0
+      x(4) = 0.0
+
+      y(1) = 0.0
+      y(2) = 0.0
+      y(3) = 1.0
+      y(4) = 1.0
+
+      z(1) = 0.0
+      z(2) = 0.0
+      z(3) = 0.0
+      z(4) = 0.0
+
+c  Quad #2
+      x(5) = 1.0
+      x(6) = 2.0
+      x(7) = 2.0
+      x(8) = 1.0
+
+      y(5) = 0.0
+      y(6) = 0.0
+      y(7) = 1.0
+      y(8) = 1.0
+
+      z(5) = 0.0
+      z(6) = 0.0
+      z(7) = 0.0
+      z(8) = 0.0
+
+c  Hex #1
+      x(9)  =  0.0
+      x(10) = 10.0
+      x(11) = 10.0
+      x(12) =  1.0
+      x(13) =  1.0
+      x(14) = 10.0
+      x(15) = 10.0
+      x(16) =  1.0
+
+      y(9)  =  0.0
+      y(10) =  0.0
+      y(11) =  0.0
+      y(12) =  0.0
+      y(13) = 10.0
+      y(14) = 10.0
+      y(15) = 10.0
+      y(16) = 10.0
+
+      z(9)  =  0.0
+      z(10) =  0.0
+      z(11) =-10.0
+      z(12) =-10.0
+      z(13) =  0.0
+      z(14) =  0.0
+      z(15) =-10.0
+      z(16) =-10.0
+
+c  Tetra #1
+      x(17) =  0.0
+      x(18) =  1.0
+      x(19) = 10.0
+      x(20) =  7.0
+
+      y(17) =  0.0
+      y(18) =  0.0
+      y(19) =  0.0
+      y(20) =  5.0
+
+      z(17) =  0.0
+      z(18) =  5.0
+      z(19) =  2.0
+      z(20) =  3.0
+
+c  Wedge #1
+      x(21) =  3.0
+      x(22) =  6.0
+      x(23) =  0.0
+      x(24) =  3.0
+      x(25) =  6.0
+      x(26) =  0.0
+
+      y(21) =  0.0
+      y(22) =  0.0
+      y(23) =  0.0
+      y(24) =  2.0
+      y(25) =  2.0
+      y(26) =  2.0
+
+      z(21) =  6.0
+      z(22) =  0.0
+      z(23) =  0.0
+      z(24) =  6.0
+      z(25) =  2.0
+      z(26) =  0.0
+
+      call expcor (exoid, x, y, z, ierr)
+      write (iout, '("after expcor, error = ", i4)' ) ierr
+
+c  Quad #1
+      x2(1) = 0.0
+      x2(2) = 1.0
+      x2(3) = 1.0
+      x2(4) = 0.0
+
+      y2(1) = 0.0
+      y2(2) = 0.0
+      y2(3) = 1.0
+      y2(4) = 1.0
+
+      z2(1) = 0.0
+      z2(2) = 0.0
+      z2(3) = 0.0
+      z2(4) = 0.0
+
+c  Quad #2
+      x2(5) = 1.0
+      x2(6) = 2.0
+      x2(7) = 2.0
+      x2(8) = 1.0
+
+      y2(5) = 0.0
+      y2(6) = 0.0
+      y2(7) = 1.0
+      y2(8) = 1.0
+
+      z2(5) = 0.0
+      z2(6) = 0.0
+      z2(7) = 0.0
+      z2(8) = 0.0
+
+c  Hex #1
+      x2(9)  =  0.0
+      x2(10) = 10.0
+      x2(11) = 10.0
+      x2(12) =  1.0
+      x2(13) =  1.0
+      x2(14) = 10.0
+      x2(15) = 10.0
+      x2(16) =  1.0
+
+      y2(9)  =  0.0
+      y2(10) =  0.0
+      y2(11) =  0.0
+      y2(12) =  0.0
+      y2(13) = 10.0
+      y2(14) = 10.0
+      y2(15) = 10.0
+      y2(16) = 10.0
+
+      z2(9)  =  0.0
+      z2(10) =  0.0
+      z2(11) =-10.0
+      z2(12) =-10.0
+      z2(13) =  0.0
+      z2(14) =  0.0
+      z2(15) =-10.0
+      z2(16) =-10.0
+
+c  Tetra #1
+      x2(17) =  0.0
+      x2(18) =  1.0
+      x2(19) = 10.0
+      x2(20) =  7.0
+
+      y2(17) =  0.0
+      y2(18) =  0.0
+      y2(19) =  0.0
+      y2(20) =  5.0
+
+      z2(17) =  0.0
+      z2(18) =  5.0
+      z2(19) =  2.0
+      z2(20) =  3.0
+
+c  Wedge #1
+      x2(21) =  3.0
+      x2(22) =  6.0
+      x2(23) =  0.0
+      x2(24) =  3.0
+      x2(25) =  6.0
+      x2(26) =  0.0
+
+      y2(21) =  0.0
+      y2(22) =  0.0
+      y2(23) =  0.0
+      y2(24) =  2.0
+      y2(25) =  2.0
+      y2(26) =  2.0
+
+      z2(21) =  6.0
+      z2(22) =  0.0
+      z2(23) =  0.0
+      z2(24) =  6.0
+      z2(25) =  2.0
+      z2(26) =  0.0
+
+
+      call expcor (exoid2, x2, y2, z2, ierr)
+      write (iout, '("after expcor (2), error = ", i4)' ) ierr
+
+      coord_names(1) = "xcoor"
+      coord_names(2) = "ycoor"
+      coord_names(3) = "zcoor"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i4)' ) ierr
+
+      coord_names2(1) = "xcoor"
+      coord_names2(2) = "ycoor"
+      coord_names2(3) = "zcoor"
+
+      call expcon (exoid2, coord_names2, ierr)
+      write (iout, '("after expcon (2), error = ", i4)' ) ierr
+
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      call expmap (exoid, elem_map, ierr)
+      write (iout, '("after expmap, error = ", i4)' ) ierr
+
+      do 12 i = 1, num_elem2
+         elem_map2(i) = i
+12    continue
+
+      call expmap (exoid2, elem_map2, ierr)
+      write (iout, '("after expmap (2), error = ", i4)' ) ierr
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 1
+      num_elem_in_block(2) = 1
+      num_elem_in_block(3) = 1
+      num_elem_in_block(4) = 1
+      num_elem_in_block(5) = 1
+
+      num_nodes_per_elem(1) = 4
+      num_nodes_per_elem(2) = 4
+      num_nodes_per_elem(3) = 8
+      num_nodes_per_elem(4) = 4
+      num_nodes_per_elem(5) = 6
+
+      ebids(1) = 10
+      ebids(2) = 11
+      ebids(3) = 12
+      ebids(4) = 13
+      ebids(5) = 14
+
+      numattr(1) = 1
+      numattr(2) = 1
+      numattr(3) = 1
+      numattr(4) = 1
+      numattr(5) = 1
+
+      cname = "quad"
+
+      call expelb (exoid,ebids(1),cname,num_elem_in_block(1),
+     1		num_nodes_per_elem(1),numattr(1),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      call expelb (exoid,ebids(2),cname,num_elem_in_block(2),
+     1		num_nodes_per_elem(2),numattr(2),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "hex"
+      call expelb (exoid,ebids(3),cname,num_elem_in_block(3),
+     1          num_nodes_per_elem(3),numattr(3),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "tetra"
+      call expelb (exoid,ebids(4),cname,num_elem_in_block(4),
+     1          num_nodes_per_elem(4),numattr(4),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      cname = "wedge"
+      call expelb (exoid,ebids(5),cname,num_elem_in_block(5),
+     1          num_nodes_per_elem(5),numattr(5),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      num_elem_in_block2(1) = 1
+      num_elem_in_block2(2) = 1
+      num_elem_in_block2(3) = 1
+      num_elem_in_block2(4) = 1
+      num_elem_in_block2(5) = 1
+
+      num_nodes_per_elem2(1) = 4
+      num_nodes_per_elem2(2) = 4
+      num_nodes_per_elem2(3) = 8
+      num_nodes_per_elem2(4) = 4
+      num_nodes_per_elem2(5) = 6
+
+      ebids2(1) = 10
+      ebids2(2) = 11
+      ebids2(3) = 12
+      ebids2(4) = 13
+      ebids2(5) = 14
+
+      numattr2(1) = 1
+      numattr2(2) = 1
+      numattr2(3) = 1
+      numattr2(4) = 1
+      numattr2(5) = 1
+
+      cname2 = "quad"
+
+      call expelb(exoid2,ebids2(1),cname2,num_elem_in_block2(1),
+     1		num_nodes_per_elem2(1),numattr2(1),ierr)
+      write (iout, '("after expelb (2), error = ", i4)' ) ierr
+
+      call expelb(exoid2,ebids2(2),cname2,num_elem_in_block2(2),
+     1		num_nodes_per_elem2(2),numattr2(2),ierr)
+      write (iout, '("after expelb (2), error = ", i4)' ) ierr
+
+      cname2 = "hex"
+      call expelb(exoid2,ebids2(3),cname2,num_elem_in_block2(3),
+     1          num_nodes_per_elem(3),numattr(3),ierr)
+      write (iout, '("after expelb (2), error = ", i4)' ) ierr
+
+      cname2 = "tetra"
+      call expelb(exoid2,ebids2(4),cname2,num_elem_in_block2(4),
+     1          num_nodes_per_elem2(4),numattr2(4),ierr)
+      write (iout, '("after expelb (2), error = ", i4)' ) ierr
+
+      cname2 = "wedge"
+      call expelb(exoid2,ebids2(5),cname2,num_elem_in_block2(5),
+     1          num_nodes_per_elem2(5),numattr2(5),ierr)
+      write (iout, '("after expelb (2), error = ", i4)' ) ierr
+
+
+c  write element block properties
+
+      prop_names(1) = "MATL"
+      prop_names(2) = "DENSITY"
+      call exppn(exoid,EXEBLK,2,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+
+      call expp(exoid, EXEBLK, ebids(1), "MATL", 10, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(2), "MATL", 20, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(3), "MATL", 30, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(4), "MATL", 40, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(5), "MATL", 50, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call exppn(exoid2,EXEBLK,2,prop_names,ierr)
+      write (iout, '("after exppn (2), error = ", i4)' ) ierr
+
+      call expp(exoid2, EXEBLK, ebids(1), "MATL", 100, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+      call expp(exoid2, EXEBLK, ebids(2), "MATL", 200, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+      call expp(exoid2, EXEBLK, ebids(3), "MATL", 300, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+      call expp(exoid2, EXEBLK, ebids(4), "MATL", 400, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+      call expp(exoid2, EXEBLK, ebids(5), "MATL", 500, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+
+
+c
+c write element connectivity
+c
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 5
+      connect(2) = 6 
+      connect(3) = 7 
+      connect(4) = 8
+
+      call expelc (exoid, ebids(2), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) =  9
+      connect(2) = 10
+      connect(3) = 11
+      connect(4) = 12
+      connect(5) = 13
+      connect(6) = 14
+      connect(7) = 15
+      connect(8) = 16
+
+      call expelc (exoid, ebids(3), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 17
+      connect(2) = 18
+      connect(3) = 19
+      connect(4) = 20
+
+      call expelc (exoid, ebids(4), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 21
+      connect(2) = 22
+      connect(3) = 23
+      connect(4) = 24
+      connect(5) = 25
+      connect(6) = 26
+
+      call expelc (exoid, ebids(5), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect2(1) = 1
+      connect2(2) = 2 
+      connect2(3) = 3 
+      connect2(4) = 4
+
+      call expelc (exoid2, ebids2(1), connect2, ierr)
+      write (iout, '("after expelc (2), error = ", i4)' ) ierr
+
+      connect2(1) = 5
+      connect2(2) = 6 
+      connect2(3) = 7 
+      connect2(4) = 8
+
+      call expelc (exoid2, ebids2(2), connect2, ierr)
+      write (iout, '("after expelc (2), error = ", i4)' ) ierr
+
+      connect2(1) =  9
+      connect2(2) = 10
+      connect2(3) = 11
+      connect2(4) = 12
+      connect2(5) = 13
+      connect2(6) = 14
+      connect2(7) = 15
+      connect2(8) = 16
+
+      call expelc (exoid2, ebids2(3), connect2, ierr)
+      write (iout, '("after expelc (2), error = ", i4)' ) ierr
+
+      connect2(1) = 17
+      connect2(2) = 18
+      connect2(3) = 19
+      connect2(4) = 20
+
+      call expelc (exoid2, ebids2(4), connect2, ierr)
+      write (iout, '("after expelc (2), error = ", i4)' ) ierr
+
+      connect2(1) = 21
+      connect2(2) = 22
+      connect2(3) = 23
+      connect2(4) = 24
+      connect2(5) = 25
+      connect2(6) = 26
+
+      call expelc (exoid2, ebids2(5), connect2, ierr)
+      write (iout, '("after expelc (2), error = ", i4)' ) ierr
+
+c
+c write element block attributes
+c
+
+      attrib(1) = 3.14159
+      call expeat (exoid, ebids(1), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      attrib(1) = 6.14159
+      call expeat (exoid, ebids(2), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(3), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(4), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      call expeat (exoid, ebids(5), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+
+      attrib2(1) = 3.
+      call expeat (exoid2, ebids2(1), attrib2, ierr)
+      write (iout, '("after expeat (2), error = ", i4)' ) ierr
+
+      attrib2(1) = 6.
+      call expeat (exoid2, ebids2(2), attrib2, ierr)
+      write (iout, '("after expeat (2), error = ", i4)' ) ierr
+
+      call expeat (exoid2, ebids2(3), attrib2, ierr)
+      write (iout, '("after expeat (2), error = ", i4)' ) ierr
+
+      call expeat (exoid2, ebids2(4), attrib2, ierr)
+      write (iout, '("after expeat (2), error = ", i4)' ) ierr
+
+      call expeat (exoid2, ebids(5), attrib2, ierr)
+      write (iout, '("after expeat (2), error = ", i4)' ) ierr
+
+
+c
+c write individual node sets
+c
+
+      call expnp (exoid, 20, 5, 5, ierr)
+      write (iout, '("after expnp, error = ", i4)' ) ierr
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0
+
+      call expns (exoid, 20, node_list, ierr)
+      write (iout, '("after expns, error = ", i4)' ) ierr
+      call expnsd (exoid, 20, dist_fact, ierr)
+      write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+      call expnp (exoid, 21, 3, 3, ierr)
+      write (iout, '("after expnp, error = ", i4)' ) ierr
+
+      node_list(1) = 200 
+      node_list(2) = 201 
+      node_list(3) = 202 
+   
+      dist_fact(1) = 1.1 
+      dist_fact(2) = 2.1 
+      dist_fact(3) = 3.1
+
+      call expns (exoid, 21, node_list, ierr)
+      write (iout, '("after expns, error = ", i4)' ) ierr
+      call expnsd (exoid, 21, dist_fact, ierr)
+      write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+      prop_names(1) = "FACE"
+      call expp(exoid, EXNSET, 20, prop_names(1), 4, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXNSET, 21, prop_names(1), 5, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      prop_array(1) = 1000
+      prop_array(2) = 2000
+
+      prop_names(1) = "VELOCITY"
+      call exppa(exoid, EXNSET, prop_names(1), prop_array, ierr)
+      write (iout, '("after exppa, error = ", i4)' ) ierr
+
+C**** file 2
+
+      call expnp (exoid2, 20, 5, 5, ierr)
+      write (iout, '("after expnp (2), error = ", i4)' ) ierr
+
+      node_list2(1) = 100 
+      node_list2(2) = 101 
+      node_list2(3) = 102 
+      node_list2(4) = 103 
+      node_list2(5) = 104 
+
+      dist_fact2(1) = 1.0 
+      dist_fact2(2) = 2.0 
+      dist_fact2(3) = 3.0
+      dist_fact2(4) = 4.0 
+      dist_fact2(5) = 5.0
+
+      call expns (exoid2, 20, node_list2, ierr)
+      write (iout, '("after expns (2), error = ", i4)' ) ierr
+      call expnsd (exoid2, 20, dist_fact2, ierr)
+      write (iout, '("after expnsd (2), error = ", i4)' ) ierr
+
+      call expnp (exoid2, 21, 3, 3, ierr)
+      write (iout, '("after expnp (2), error = ", i4)' ) ierr
+
+      node_list2(1) = 200 
+      node_list2(2) = 201 
+      node_list2(3) = 202 
+   
+      dist_fact2(1) = 1.1 
+      dist_fact2(2) = 2.1 
+      dist_fact2(3) = 3.1
+
+      call expns (exoid2, 21, node_list2, ierr)
+      write (iout, '("after expns (2), error = ", i4)' ) ierr
+      call expnsd (exoid2, 21, dist_fact2, ierr)
+      write (iout, '("after expnsd (2), error = ", i4)' ) ierr
+
+c
+c write concatenated node sets; this produces the same information as
+c the above code which writes individual node sets
+c
+
+      ids(1) = 20 
+      ids(2) = 21
+
+      num_nodes_per_set(1) = 5 
+      num_nodes_per_set(2) = 3
+
+      node_ind(1) = 1 
+      node_ind(2) = 6
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+      node_list(6) = 200 
+      node_list(7) = 201 
+      node_list(8) = 202
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0 
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0 
+      dist_fact(6) = 1.1 
+      dist_fact(7) = 2.1 
+      dist_fact(8) = 3.1
+
+c     call expcns (exoid, ids, num_nodes_per_set, node_ind, node_list, 
+c    1        dist_fact, ierr)
+c     write (iout, '("after expcns, error = ", i4)' ) ierr
+c
+
+      prop_names(1) = "FACE"
+      call expp(exoid2, EXNSET, 20, prop_names(1), 4, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+
+      prop_names(1) = "FACE"
+      call expp(exoid2, EXNSET, 21, prop_names(1), 5, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+
+      prop_array(1) = 1000
+      prop_array(2) = 2000
+
+      prop_names(1) = "VELOCITY"
+      call exppa(exoid2, EXNSET, prop_names(1), prop_array, ierr)
+      write (iout, '("after exppa (2), error = ", i4)' ) ierr
+
+c write individual side sets
+c
+
+c     side set #1 - quad
+
+      elem_list(1) = 2
+      elem_list(2) = 2
+
+      side_list(1) = 4
+      side_list(2) = 2
+
+      dist_fact(1) = 30.0
+      dist_fact(2) = 30.1
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+
+      call expsp (exoid, 30, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+
+      call expss (exoid, 30, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+
+      call expssd (exoid, 30, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i4)' ) ierr
+
+c     side set #2 - quad, spanning 2 elements
+
+      elem_list(1) = 1
+      elem_list(2) = 2
+
+      side_list(1) = 2
+      side_list(2) = 3
+
+      dist_fact(1) = 31.0
+      dist_fact(2) = 31.1
+      dist_fact(3) = 31.2
+      dist_fact(4) = 31.3
+
+      call expsp (exoid, 31, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i3)' ) ierr
+
+      call expss (exoid, 31, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i3)' ) ierr
+
+      call expssd (exoid, 31, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i3)' ) ierr
+
+c     side set #3 - hex
+
+      elem_list(1) = 3
+      elem_list(2) = 3
+      elem_list(3) = 3
+      elem_list(4) = 3
+      elem_list(5) = 3
+      elem_list(6) = 3
+      elem_list(7) = 3
+
+      side_list(1) = 5
+      side_list(2) = 3
+      side_list(3) = 3
+      side_list(4) = 2
+      side_list(5) = 4
+      side_list(6) = 1
+      side_list(7) = 6
+
+      call expsp (exoid, 32, 7, 0, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+
+      call expss (exoid, 32, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+
+c     side set #4 - tetras
+
+      elem_list(1) = 4
+      elem_list(2) = 4
+      elem_list(3) = 4
+      elem_list(4) = 4
+
+      side_list(1) = 1
+      side_list(2) = 2
+      side_list(3) = 3
+      side_list(4) = 4
+
+      call expsp (exoid, 33, 4, 0, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+
+      call expss (exoid, 33, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+
+c     side set #5 - wedges
+
+      elem_list(1) = 5
+      elem_list(2) = 5
+      elem_list(3) = 5
+      elem_list(4) = 5
+      elem_list(5) = 5
+
+      side_list(1) = 1
+      side_list(2) = 2
+      side_list(3) = 3
+      side_list(4) = 4
+      side_list(5) = 5
+
+      call expsp (exoid, 34, 5, 0, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+
+      call expss (exoid, 34, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+
+
+c     side set #1  - quad
+
+      elem_list2(1) = 2
+      elem_list2(2) = 2
+
+      side_list2(1) = 4
+      side_list2(2) = 2
+
+      dist_fact2(1) = 30.0 
+      dist_fact2(2) = 30.1 
+      dist_fact2(3) = 30.2
+      dist_fact2(4) = 30.3
+
+      call expsp (exoid2, 30, 2, 4, ierr)
+      write (iout, '("after expsp (2), error = ", i4)' ) ierr
+
+      call expss (exoid2, 30, elem_list2, side_list2, ierr)
+      write (iout, '("after expss (2), error = ", i4)' ) ierr
+
+      call expssd (exoid2, 30, dist_fact2, ierr)
+      write (iout, '("after expssd (2), error = ", i4)' ) ierr
+
+c     side set #2 - quad, spanning 2 elements
+
+      elem_list2(1) = 1
+      elem_list2(2) = 2
+
+      side_list2(1) = 2
+      side_list2(2) = 3
+
+      dist_fact2(1) = 31.0
+      dist_fact2(2) = 31.1
+      dist_fact2(3) = 31.2
+      dist_fact2(4) = 31.3
+
+      call expsp (exoid2, 31, 2, 4, ierr)
+      write (iout, '("after expsp (2), error = ", i3)' ) ierr
+
+      call expss (exoid2, 31, elem_list2, side_list2, ierr)
+      write (iout, '("after expss (2), error = ", i3)' ) ierr
+
+      call expssd (exoid2, 31, dist_fact2, ierr)
+      write (iout, '("after expssd (2), error = ", i3)' ) ierr
+
+c     side set #3 - hex
+
+      elem_list2(1) = 3
+      elem_list2(2) = 3
+      elem_list2(3) = 3
+      elem_list2(4) = 3
+      elem_list2(5) = 3
+      elem_list2(6) = 3
+      elem_list2(7) = 3
+
+      side_list2(1) = 5
+      side_list2(2) = 3
+      side_list2(3) = 3
+      side_list2(4) = 2
+      side_list2(5) = 4
+      side_list2(6) = 1
+      side_list2(7) = 6
+
+      call expsp (exoid2, 32, 7, 0, ierr)
+      write (iout, '("after expsp (2), error = ", i4)' ) ierr
+
+      call expss (exoid2, 32, elem_list2, side_list2, ierr)
+      write (iout, '("after expss (2), error = ", i4)' ) ierr
+
+c     side set #4 - tetras
+
+      elem_list2(1) = 4
+      elem_list2(2) = 4
+      elem_list2(3) = 4
+      elem_list2(4) = 4
+
+      side_list2(1) = 1
+      side_list2(2) = 2
+      side_list2(3) = 3
+      side_list2(4) = 4
+
+      call expsp (exoid2, 33, 4, 0, ierr)
+      write (iout, '("after expsp (2), error = ", i4)' ) ierr
+
+      call expss (exoid2, 33, elem_list2, side_list2, ierr)
+      write (iout, '("after expss (2), error = ", i4)' ) ierr
+
+c     side set #5 - wedges
+
+      elem_list2(1) = 5
+      elem_list2(2) = 5
+      elem_list2(3) = 5
+      elem_list2(4) = 5
+      elem_list2(5) = 5
+
+      side_list2(1) = 1
+      side_list2(2) = 2
+      side_list2(3) = 3
+      side_list2(4) = 4
+      side_list2(5) = 5
+
+      call expsp (exoid2, 34, 5, 0, ierr)
+      write (iout, '("after expsp (2), error = ", i4)' ) ierr
+
+      call expss (exoid2, 34, elem_list2, side_list2, ierr)
+      write (iout, '("after expss (2), error = ", i4)' ) ierr
+
+c
+c write concatenated side sets; this produces the same information as
+c the above code which writes individual side sets
+c
+      ids(1) = 30
+      ids(2) = 31
+      ids(3) = 32
+      ids(4) = 33
+      ids(5) = 34
+
+c     side set #1
+      node_list(1) = 8
+      node_list(2) = 5
+      node_list(3) = 6
+      node_list(4) = 7
+
+c     side set #2
+      node_list(5) = 2
+      node_list(6) = 3
+      node_list(7) = 7
+      node_list(8) = 8
+
+c     side set #3
+      node_list(9)  =  9
+      node_list(10) = 12
+      node_list(11) = 11
+      node_list(12) = 10
+
+      node_list(13) = 11
+      node_list(14) = 12
+      node_list(15) = 16
+      node_list(16) = 15
+
+      node_list(17) = 16
+      node_list(18) = 15
+      node_list(19) = 11
+      node_list(20) = 12
+
+      node_list(21) = 10
+      node_list(22) = 11
+      node_list(23) = 15
+      node_list(24) = 14
+
+      node_list(25) = 13
+      node_list(26) = 16
+      node_list(27) = 12
+      node_list(28) =  9
+
+      node_list(29) = 14
+      node_list(30) = 13
+      node_list(31) =  9
+      node_list(32) = 10
+
+      node_list(33) = 16
+      node_list(34) = 13
+      node_list(35) = 14
+      node_list(36) = 15
+
+c     side set #4
+      node_list(37) = 17
+      node_list(38) = 18
+      node_list(39) = 20
+
+      node_list(40) = 18
+      node_list(41) = 19
+      node_list(42) = 20
+
+      node_list(43) = 20
+      node_list(44) = 19
+      node_list(45) = 17
+
+      node_list(46) = 19
+      node_list(47) = 18
+      node_list(48) = 17
+
+c     side set #5
+      node_list(49) = 25
+      node_list(50) = 24
+      node_list(51) = 21
+      node_list(52) = 22
+
+      node_list(53) = 26
+      node_list(54) = 25
+      node_list(55) = 22
+      node_list(56) = 23
+
+      node_list(57) = 26
+      node_list(58) = 23
+      node_list(59) = 21
+      node_list(60) = 24
+
+      node_list(61) = 23
+      node_list(62) = 22
+      node_list(63) = 21
+
+      node_list(64) = 24
+      node_list(65) = 25
+      node_list(66) = 26
+
+      num_elem_per_set(1) = 2
+      num_elem_per_set(2) = 2
+      num_elem_per_set(3) = 7
+      num_elem_per_set(4) = 4
+      num_elem_per_set(5) = 5
+
+      num_nodes_per_set(1) = 4
+      num_nodes_per_set(2) = 4
+      num_nodes_per_set(3) = 28
+      num_nodes_per_set(4) = 12
+      num_nodes_per_set(5) = 20
+
+      elem_ind(1) = 1
+      elem_ind(2) = 3
+      elem_ind(3) = 5
+      elem_ind(4) = 12
+      elem_ind(5) = 16
+
+      node_ind(1) = 1
+      node_ind(2) = 5
+      node_ind(3) = 9
+      node_ind(4) = 37
+      node_ind(5) = 48
+
+      elem_list(1) = 3
+      elem_list(2) = 3
+      elem_list(3) = 1
+      elem_list(4) = 3
+      elem_list(5) = 4
+      elem_list(6) = 4
+      elem_list(7) = 4
+      elem_list(8) = 4
+      elem_list(9) = 4
+      elem_list(10) = 4
+      elem_list(11) = 4
+      elem_list(12) = 5
+      elem_list(13) = 5
+      elem_list(14) = 5
+      elem_list(15) = 5
+      elem_list(16) = 6
+      elem_list(17) = 6
+      elem_list(18) = 6
+      elem_list(19) = 6
+      elem_list(20) = 6
+
+c     side_list(1) = 1
+c     side_list(2) = 2
+c     side_list(3) = 3
+c     side_list(4) = 4
+
+
+c     call excn2s(exoid, num_elem_per_set, num_nodes_per_set, elem_ind,
+c    1          node_ind, elem_list, node_list, side_list, ierr)
+c     write (iout, '("after excn2s, error = ", i4)' ) ierr
+
+      num_df_per_set(1) = 4
+      num_df_per_set(2) = 4
+      num_df_per_set(3) = 0
+      num_df_per_set(4) = 0
+      num_df_per_set(5) = 0
+
+      df_ind(1) = 1
+      df_ind(2) = 5
+
+
+      dist_fact(1) = 30.0
+      dist_fact(2) = 30.1
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+      dist_fact(5) = 31.0
+      dist_fact(6) = 31.1
+      dist_fact(7) = 31.2
+      dist_fact(8) = 31.3
+
+c     call expcss (exoid, ids, num_elem_per_set, num_df_per_set,
+c    1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+c    2             ierr)
+c     write (iout, '("after expcss, error = ", i4)' ) ierr
+
+c     call expcss (exoid2, ids, num_elem_per_set, num_df_per_set,
+c    1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+c    2             ierr)
+c     write (iout, '("after expcss (2), error = ", i4)' ) ierr
+
+      prop_names(1) = "COLOR"
+      call expp(exoid, EXSSET, 30, prop_names(1), 100, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXSSET, 31, prop_names(1), 101, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+
+      prop_names(1) = "COLOR"
+      call expp(exoid2, EXSSET, 30, prop_names(1), 100, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+
+      call expp(exoid2, EXSSET, 31, prop_names(1), 101, ierr)
+      write (iout, '("after expp (2), error = ", i4)' ) ierr
+
+
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "TESTWT2 fortran version"
+      qa_record(2,1) = "testwt2"
+      qa_record(3,1) = "07/07/93"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "07/07/93"
+      qa_record(4,2) = "16:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i4)' ) ierr
+
+      num_qa_rec2 = 2
+
+      qa_record2(1,1) = "TESTWT2 fortran version"
+      qa_record2(2,1) = "testwt2"
+      qa_record2(3,1) = "07/07/93"
+      qa_record2(4,1) = "15:41:33"
+      qa_record2(1,2) = "FASTQ"
+      qa_record2(2,2) = "fastq"
+      qa_record2(3,2) = "07/07/93"
+      qa_record2(4,2) = "16:41:33"
+
+      call expqa (exoid2, num_qa_rec2, qa_record2, ierr)
+      write (iout, '("after expqa (2), error = ", i4)' ) ierr
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i4)' ) ierr
+
+      num_info2 = 3
+
+      inform2(1) = "This is the first information record."
+      inform2(2) = "This is the second information record."
+      inform2(3) = "This is the third information record."
+
+      call expinf (exoid2, num_info2, inform2, ierr)
+      write (iout, '("after expinf (2), error = ", i4)' ) ierr
+
+
+c write results variables parameters and names
+
+      num_glo_vars = 1
+  
+      var_names(1) = "glo_vars"
+
+      call expvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+      num_glo_vars2 = 1
+  
+      var_names2(1) = "glo_vars"
+
+      call expvp (exoid2, "g", num_glo_vars2, ierr)
+      write (iout, '("after expvp (2), error = ", i4)' ) ierr
+      call expvan (exoid2, "g", num_glo_vars2, var_names2, ierr)
+      write (iout, '("after expvan (2), error = ", i4)' ) ierr
+
+
+      num_nod_vars = 2
+
+      var_names(1) = "nod_var0"
+      var_names(2) = "nod_var1"
+
+      call expvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+      num_nod_vars2 = 2
+
+      var_names2(1) = "nod_var0"
+      var_names2(2) = "nod_var1"
+
+      call expvp (exoid2, "n", num_nod_vars2, ierr)
+      write (iout, '("after expvp (2), error = ", i4)' ) ierr
+      call expvan (exoid2, "n", num_nod_vars2, var_names2, ierr)
+      write (iout, '("after expvan (2), error = ", i4)' ) ierr
+
+   
+      num_ele_vars = 3
+
+      var_names(1) = "ele_var0"
+      var_names(2) = "ele_var1"
+      var_names(3) = "ele_var2"
+
+      call expvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+      num_ele_vars2 = 3
+
+      var_names2(1) = "ele_var0"
+      var_names2(2) = "ele_var1"
+      var_names2(3) = "ele_var2"
+
+      call expvp (exoid2, "e", num_ele_vars2, ierr)
+      write (iout, '("after expvp (2), error = ", i4)' ) ierr
+      call expvan (exoid2, "e", num_ele_vars2, var_names2, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+c
+c write element variable truth table
+c
+
+      k = 0
+
+      do 30 i = 1,num_elem_blk
+         do 20 j = 1,num_ele_vars
+            truth_tab(j,i) = 1
+20       continue
+30    continue
+
+      call exgebi (exoid, ebids, ierr)
+      write (iout, '("after exgebi, error = ", i4)' ) ierr
+      call exgebi (exoid2, ebids2, ierr)
+      write (iout, '("after exgebi (2), error = ", i4)' ) ierr
+      call expvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '("after expvtt, error = ", i4)' ) ierr
+      call expvtt (exoid2, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '("after expvtt, error = ", i4)' ) ierr
+
+c
+c for each time step, write the analysis results;
+c the code below fills the arrays glob_var_vals, 
+c nodal_var_vals, and elem_var_vals with values for debugging purposes;
+c obviously the analysis code will populate these arrays
+c
+
+      whole_time_step = 1
+      num_time_steps = 10
+
+      do 110 i = 1, num_time_steps
+        time_value = real(i)/100
+        time_value2 = real(i)/100
+c
+c write time value to regular file
+c
+
+        call exptim (exoid, whole_time_step, time_value, ierr)
+        write (iout, '("after exptim, error = ", i4)' ) ierr
+
+        call exptim (exoid2, whole_time_step, time_value2, ierr)
+        write (iout, '("after exptim (2), error = ", i4)' ) ierr
+
+c
+c write global variables
+c
+
+        do 50 j = 1, num_glo_vars
+          glob_var_vals(j) = real(j+1) * time_value
+50      continue
+
+        call expgv (exoid, whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+        write (iout, '("after expgv, error = ", i4)' ) ierr
+
+        call expgv (exoid2, whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+        write (iout, '("after expgv (2), error = ", i4)' ) ierr
+
+c
+c write nodal variables
+c
+
+        do 70 k = 1, num_nod_vars
+          do 60 j = 1, num_nodes
+
+            nodal_var_vals(j) = real(k) + (real(j) * time_value)
+
+60        continue
+
+          call expnv (exoid, whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+          write (iout, '("after expnv, error = ", i4)' ) ierr
+
+          call expnv (exoid2, whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+          write (iout, '("after expnv (2), error = ", i4)' ) ierr
+
+70      continue
+
+c
+c write element variables
+c
+
+        do 100 k = 1, num_ele_vars
+          do 90 j = 1, num_elem_blk
+            do 80 m = 1, num_elem_in_block(j)
+
+              elem_var_vals(m) = real(k+1) + real(j+1) + 
+     1                          (real(m)*time_value)
+
+80          continue
+
+            call expev (exoid, whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+            write (iout, '("after expev, error = ", i4)' ) ierr
+            call expev (exoid2, whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+            write (iout, '("after expev (2), error = ", i4)' ) ierr
+
+90        continue
+100     continue
+
+        whole_time_step = whole_time_step + 1
+
+c
+c update the data file; this should be done at the end of every time 
+c step to ensure that no data is lost if the analysis dies
+c
+        call exupda (exoid, ierr)
+        write (iout, '("after exupda, error = ", i4)' ) ierr
+        call exupda (exoid2, ierr)
+        write (iout, '("after exupda (2), error = ", i4)' ) ierr
+
+110   continue
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i4)' ) ierr
+
+      call exclos (exoid2, ierr)
+      write (iout, '("after exclos (2), error = ", i4)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testwt3.f b/exodus/forbind/test/testwt3.f
new file mode 100644
index 0000000..1539b15
--- /dev/null
+++ b/exodus/forbind/test/testwt3.f
@@ -0,0 +1,627 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwt3
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines. This test writes GENISIS (geometry)
+c data to the history file.
+c
+c     08/10/93	V.R. Yarberry - Updated for use with 2.01 API
+
+      include 'exodus_app.inc'
+
+      integer iin, iout
+      integer exoid, exoidh, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_elem_in_block(2), num_node_sets
+      integer num_side_sets, error
+      integer i, j, k, m, elem_map(2), connect(4) 
+      integer node_list(10), elem_list(10)
+      integer ebids(2),ids(2), num_nodes_per_set(2), num_elem_per_set(1)
+      integer node_ind(2), elem_ind(1), num_qa_rec, num_info
+      integer num_his_vars, num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,2)
+      integer hist_time_step, whole_time_step, num_time_steps
+      integer cpu_word_size, io_word_size
+
+      real hist_var_vals(10), glob_var_vals(10), nodal_var_vals(8) 
+      real time_value, elem_var_vals(20)
+      real x(8), y(8), dummy(1)
+      real attrib(1), dist_fact(8)
+
+      character*(MXLNLN) title
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) var_names(3)
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXLNLN) inform(3)
+
+      logical whole
+
+      data iin /5/, iout /6/
+
+c
+c  create EXODUS II files 
+c
+      cpu_word_size = 4
+      io_word_size = 4
+c
+c     first create a "regular" file that contains everything except
+c     history variable info
+c
+      exoid = excre ("test.exo",
+     1               "r", EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test.exo, id: ", i3)') exoid
+      write (iout,'("after excre, error = ", i3)') ierr
+
+c
+c     create a "history" file if you will output history variables
+c
+      exoidh = excre ("testh.exo",
+     1               "h", EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for testh.exo, id: ", i3)') exoidh
+      write (iout,'("after excre, error = ", i3)') ierr
+
+c
+c  initialize file with parameters
+c
+
+      title = "This is test 3 - genisis data in history file"
+      num_dim = 2
+      num_nodes = 8
+      num_elem = 2
+      num_elem_blk = 2
+      num_node_sets = 2
+      num_side_sets = 1
+
+      call expini (exoid, title, num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i3)' ) ierr
+
+      call expini (exoidh, title, num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini (h), error = ", i3)' ) ierr
+
+c
+c  write nodal coordinates values and names to database
+c
+
+      x(1) = 0.0 
+      x(2) = 1.0 
+      x(3) = 1.0 
+      x(4) = 0.0 
+      x(5) = 1.0 
+      x(6) = 2.0 
+      x(7) = 2.0 
+      x(8) = 1.0
+      y(1) = 0.0 
+      y(2) = 0.0 
+      y(3) = 1.0 
+      y(4) = 1.0 
+      y(5) = 0.0 
+      y(6) = 0.0 
+      y(7) = 1.0 
+      y(8) = 1.0
+
+      call expcor (exoid, x, y, dummy, ierr)
+      write (iout, '("after expcor, error = ", i3)' ) ierr
+
+      call expcor (exoidh, x, y, dummy, ierr)
+      write (iout, '("after expcor (h), error = ", i3)' ) ierr
+
+      coord_names(1) = "xcoorjun"
+      coord_names(2) = "ycoorjun"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i3)' ) ierr
+
+      call expcon (exoidh, coord_names, ierr)
+      write (iout, '("after expcon (h), error = ", i3)' ) ierr
+
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      call expmap (exoid, elem_map, ierr)
+      write (iout, '("after expmap, error = ", i3)' ) ierr
+
+      call expmap (exoidh, elem_map, ierr)
+      write (iout, '("after expmap (h), error = ", i3)' ) ierr
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 1
+      num_elem_in_block(2) = 1
+
+      ebids(1) = 10
+      ebids(2) = 11
+
+      cname = "quadjunk"
+
+      call expelb (exoid, ebids(1), cname, num_elem_in_block(1),
+     1		 4,1,ierr)
+      write (iout, '("after expelb, error = ", i3)' ) ierr
+
+      call expelb (exoid, ebids(2), cname, num_elem_in_block(2), 
+     1		4,1,ierr)
+      write (iout, '("after expelb, error = ", i3)' ) ierr
+
+      call expelb (exoidh, ebids(1), cname, num_elem_in_block(1), 
+     1		4,1,ierr)
+      write (iout, '("after expelb (h), error = ", i3)' ) ierr
+
+      call expelb (exoidh, ebids(2), cname, num_elem_in_block(2),
+     1		 4,1,ierr)
+      write (iout, '("after expelbi(h), error = ", i3)' ) ierr
+
+c
+c write element connectivity
+c
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i3)' ) ierr
+
+      call expelc (exoidh, ebids(1), connect, ierr)
+      write (iout, '("after expelci (h), error = ", i3)' ) ierr
+
+      connect(1) = 5
+      connect(2) = 6 
+      connect(3) = 7 
+      connect(4) = 8
+
+      call expelc (exoid, ebids(2), connect, ierr)
+      write (iout, '("after expelc, error = ", i3)' ) ierr
+
+      call expelc (exoidh, ebids(2), connect, ierr)
+      write (iout, '("after expelc (h), error = ", i3)' ) ierr
+
+c
+c write element block attributes
+c
+
+      attrib(1) = 3.14159
+      call expeat (exoid, ebids(1), attrib, ierr)
+      write (iout, '("after expeat, error = ", i3)' ) ierr
+
+      call expeat (exoidh, ebids(1), attrib, ierr)
+      write (iout, '("after expeat (h), error = ", i3)' ) ierr
+
+      attrib(1) = 6.14159
+      call expeat (exoid, ebids(2), attrib, ierr)
+      write (iout, '("after expeat, error = ", i3)' ) ierr
+
+      call expeat (exoidh, ebids(2), attrib, ierr)
+      write (iout, '("after expeat (h), error = ", i3)' ) ierr
+
+c
+c write individual node sets
+c
+
+      call expnp (exoid, 20, 5, ierr)
+      write (iout, '("after expnp, error = ", i3)' ) ierr
+
+      call expnp (exoidh, 20, 5, ierr)
+      write (iout, '("after expnp (h), error = ", i3)' ) ierr
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0
+
+      call expns (exoid, 20, node_list, dist_fact, ierr)
+      write (iout, '("after expns, error = ", i3)' ) ierr
+
+      call expns (exoidh, 20, node_list, dist_fact, ierr)
+      write (iout, '("after expns (h), error = ", i3)' ) ierr
+
+      call expnp (exoid, 21, 3, ierr)
+      write (iout, '("after expnp, error = ", i3)' ) ierr
+
+      call expnp (exoidh, 21, 3, ierr)
+      write (iout, '("after expnp (h), error = ", i3)' ) ierr
+
+      node_list(1) = 200 
+      node_list(2) = 201 
+      node_list(3) = 202 
+   
+      dist_fact(1) = 1.1 
+      dist_fact(2) = 2.1 
+      dist_fact(3) = 3.1
+
+      call expns (exoid, 21, node_list, dist_fact, ierr)
+      write (iout, '("after expns, error = ", i3)' ) ierr
+
+      call expns (exoidh, 21, node_list, dist_fact, ierr)
+      write (iout, '("after expns (h), error = ", i3)' ) ierr
+
+c
+c write concatenated node sets; this produces the same information as
+c the above code which writes individual node sets
+c
+
+c     ids(1) = 20 
+c     ids(2) = 21
+
+c     num_nodes_per_set(1) = 5 
+c     num_nodes_per_set(2) = 3
+
+c     node_ind(1) = 1 
+c     node_ind(2) = 6
+
+c     node_list(1) = 100 
+c     node_list(2) = 101 
+c     node_list(3) = 102 
+c     node_list(4) = 103 
+c     node_list(5) = 104 
+c     node_list(6) = 200 
+c     node_list(7) = 201 
+c     node_list(8) = 202
+
+c     dist_fact(1) = 1.0 
+c     dist_fact(2) = 2.0 
+c     dist_fact(3) = 3.0 
+c     dist_fact(4) = 4.0 
+c     dist_fact(5) = 5.0 
+c     dist_fact(6) = 1.1 
+c     dist_fact(7) = 2.1 
+c     dist_fact(8) = 3.1
+
+c     call expcns (exoid, ids, num_nodes_per_set, node_ind, node_list, 
+c    1        dist_fact, ierr)
+c     write (iout, '("after expcns, error = ", i3)' ) ierr
+
+c
+c write individual side sets
+c
+
+      call expsp (exoid, 30, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i3)' ) ierr
+
+      call expsp (exoidh, 30, 2, 4, ierr)
+      write (iout, '("after expsp (h), error = ", i3)' ) ierr
+
+      elem_list(1) = 1
+      elem_list(2) = 2
+
+      node_list(1) = 1 
+      node_list(2) = 2 
+      node_list(3) = 3 
+      node_list(4) = 4
+
+      dist_fact(1) = 0.0 
+      dist_fact(2) = 0.0 
+      dist_fact(3) = 0.0
+      dist_fact(4) = 0.0
+
+      call expss (exoid, 30, elem_list, node_list, ierr)
+      write (iout, '("after expss, error = ", i3)' ) ierr
+
+      call expssd (exoid, 30, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i3)' ) ierr
+
+      call expss (exoidh, 30, elem_list, node_list, ierr)
+      write (iout, '("after expss (h), error = ", i3)' ) ierr
+
+      call expssd (exoidh, 30, dist_fact, ierr)
+      write (iout, '("after expssd (h), error = ", i3)' ) ierr
+
+c
+c write concatenated side sets; this produces the same information as
+c the above code which writes individual side sets
+c
+
+c      ids(1) = 30
+
+c      num_elem_per_set(1) = 2
+
+c      num_nodes_per_set(1) = 4
+
+c      elem_ind(1) = 1
+
+c      node_ind(1) = 1
+   
+c      elem_list(1) = 1 
+c      elem_list(2) = 2
+
+c      node_list(1) = 1 
+c      node_list(2) = 2 
+c      node_list(3) = 3 
+c      node_list(4) = 4
+
+c      dist_fact(1) = 0.0 
+c      dist_fact(2) = 0.0 
+c      dist_fact(3) = 0.0
+c      dist_fact(4) = 0.0 
+
+c      call expcss (exoid, ids, num_elem_per_set, num_nodes_per_set, 
+c     1             elem_ind, node_ind, elem_list, node_list, dist_fact,
+c     2             ierr)
+c      write (iout, '("after expcss, error = ", i3)' ) ierr
+
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "PRONTO2D"
+      qa_record(2,1) = "pronto2d"
+      qa_record(3,1) = "3/10/92"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "2/10/92"
+      qa_record(4,2) = "11:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i3)' ) ierr
+
+      call expqa (exoidh, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa (h), error = ", i3)' ) ierr
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i3)' ) ierr
+
+      call expinf (exoidh, num_info, inform, ierr)
+      write (iout, '("after expinf (h), error = ", i3)' ) ierr
+
+
+c write results variables parameters and names
+
+      num_his_vars = 1
+
+      var_names(1) = "his_vars"
+
+      call expvp (exoidh, "h", num_his_vars, ierr)
+      write (iout, '("after expvp, error = ", i3)' ) ierr
+      call expvan (exoidh, "h", num_his_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i3)' ) ierr
+
+
+      num_glo_vars = 1
+  
+      var_names(1) = "glo_vars"
+
+      call expvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '("after expvp, error = ", i3)' ) ierr
+      call expvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i3)' ) ierr
+
+
+      num_nod_vars = 2
+
+      var_names(1) = "nod_var0"
+      var_names(2) = "nod_var1"
+
+      call expvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '("after expvp, error = ", i3)' ) ierr
+      call expvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i3)' ) ierr
+
+   
+      num_ele_vars = 3
+
+      var_names(1) = "ele_var0"
+      var_names(2) = "ele_var1"
+      var_names(3) = "ele_var2"
+
+      call expvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '("after expvp, error = ", i3)' ) ierr
+      call expvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i3)' ) ierr
+
+c
+c write element variable truth table
+c
+
+      k = 0
+
+      do 30 i = 1,num_elem_blk
+         do 20 j = 1,num_ele_vars
+            truth_tab(j,i) = 1
+20       continue
+30    continue
+
+      call exgebi (exoid, ebids, ierr)
+      write (iout, '("after exgebi, error = ", i3)' ) ierr
+      call expvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ebids,
+     &             ierr)
+      write (iout, '("after expvtt, error = ", i3)' ) ierr
+
+c
+c for each time step, write the analysis results;
+c the code below fills the arrays hist_var_vals, glob_var_vals, 
+c nodal_var_vals, and elem_var_vals with values for debugging purposes;
+c obviously the analysis code will populate these arrays
+c
+
+      whole = .true.
+      hist_time_step = 1
+      whole_time_step = 1
+      num_time_steps = 10
+
+      do 110 i = 1, num_time_steps
+         time_value = real(i)/100
+
+c
+c if history time step
+c
+
+c
+c write time value to history file
+c
+
+         call exptim (exoidh, hist_time_step, time_value, ierr)
+         write (iout, '("after exptim, error = ", i3)' ) ierr
+
+c
+c write history variables to history file
+c
+
+         do 40 j = 1, num_his_vars
+            hist_var_vals(j) = real(j+1) * time_value
+40       continue
+
+         call exphv (exoidh, hist_time_step, num_his_vars, 
+     1               hist_var_vals, ierr)
+         write (iout, '("after exphv, error = ", i3)' ) ierr
+
+         hist_time_step = hist_time_step + 1
+c
+c update the history file
+c
+
+         call exupda (exoidh, ierr)
+         write (iout, '("after exupda, error = ", i3)' ) ierr
+
+c
+c if whole time step
+c
+
+         if (whole) then
+
+c
+c write time value to regular file
+c
+
+            call exptim (exoid, whole_time_step, time_value, ierr)
+            write (iout, '("after exptim, error = ", i3)' ) ierr
+
+c
+c write global variables
+c
+
+            do 50 j = 1, num_glo_vars
+               glob_var_vals(j) = real(j+1) * time_value
+50          continue
+
+            call expgv (exoid, whole_time_step, num_glo_vars, 
+     1                  glob_var_vals, ierr)
+            write (iout, '("after expgv, error = ", i3)' ) ierr
+
+c
+c write nodal variables
+c
+
+            do 70 k = 1, num_nod_vars
+               do 60 j = 1, num_nodes
+
+                  nodal_var_vals(j) = real(k) + (real(j) * time_value)
+
+60             continue
+
+               call expnv (exoid, whole_time_step, k, num_nodes, 
+     1                     nodal_var_vals, ierr)
+               write (iout, '("after expnv, error = ", i3)' ) ierr
+
+70          continue
+
+c
+c write element variables
+c
+
+            do 100 k = 1, num_ele_vars
+               do 90 j = 1, num_elem_blk
+                  do 80 m = 1, num_elem_in_block(j)
+
+                     elem_var_vals(m) = real(k+1) + real(j+1) + 
+     1                                  (real(m)*time_value)
+
+80                continue
+
+                  call expev (exoid, whole_time_step, k, ebids(j), 
+     1                        num_elem_in_block(j), elem_var_vals, ierr)
+                  write (iout, '("after expev, error = ", i3)' ) ierr
+
+90             continue
+100         continue
+
+            whole_time_step = whole_time_step + 1
+
+c
+c update the data file; this should be done at the end of every time 
+c step to ensure that no data is lost if the analysis dies
+c
+            call exupda (exoid, ierr)
+            write (iout, '("after exupda, error = ", i3)' ) ierr
+
+         endif
+
+110   continue
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i3)' ) ierr
+
+      call exclos (exoidh, ierr)
+      write (iout, '("after exclos, error = ", i3)' ) ierr
+
+      stop
+      end
+
diff --git a/exodus/forbind/test/testwt_nsid.f b/exodus/forbind/test/testwt_nsid.f
new file mode 100644
index 0000000..9ba7691
--- /dev/null
+++ b/exodus/forbind/test/testwt_nsid.f
@@ -0,0 +1,436 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwt
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines.
+c
+      include 'exodusII.inc'
+
+      integer iin, iout
+      integer exoid, num_dim,num_nodes,elem_map(5),num_elem,num_elem_blk
+      integer num_elem_in_block(10), num_nodes_per_elem(10),numattr(10)
+      integer num_node_sets, num_side_sets
+      integer i, connect(37), nnpe(10)
+      integer ebids(10)
+      integer num_qa_rec, num_info
+      integer cpu_word_size, io_word_size
+
+      real x(100), y(100), z(100)
+
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXLNLN) inform(3)
+
+      data iin /5/, iout /6/
+
+      call exopts (EXABRT, ierr)
+      write (iout,'("after exopts, error = ", i4)') ierr
+      cpu_word_size = 0
+      io_word_size = 0
+c
+c  create EXODUS II files 
+c
+      exoid = excre ("test-nsided.exo",
+     1	 	     EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test-nsided.exo, id: ", i4)') exoid
+      write (iout,'("  cpu word size: ",i4," io word size: ",i4)')
+     1                  cpu_word_size, io_word_size
+      write (iout,'("after excre, error = ", i4)') ierr
+c
+c  initialize file with parameters
+c
+      num_dim = 3
+      num_nodes = 33
+      num_elem = 7
+      num_elem_blk = 1
+      num_node_sets = 0
+      num_side_sets = 0
+
+      call expini (exoid, "This is a test", num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i4)' ) ierr
+
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c  write nodal coordinates values and names to database
+c
+c  Quad #1
+      x(1) = 0.0 
+      x(2) = 1.0 
+      x(3) = 1.0 
+      x(4) = 0.0 
+
+      y(1) = 0.0 
+      y(2) = 0.0 
+      y(3) = 1.0 
+      y(4) = 1.0 
+
+      z(1) = 0.0
+      z(2) = 0.0
+      z(3) = 0.0
+      z(4) = 0.0
+
+c  Quad #2
+      x(5) = 1.0 
+      x(6) = 2.0 
+      x(7) = 2.0 
+      x(8) = 1.0
+
+      y(5) = 0.0 
+      y(6) = 0.0 
+      y(7) = 1.0 
+      y(8) = 1.0
+
+      z(5) = 0.0
+      z(6) = 0.0
+      z(7) = 0.0
+      z(8) = 0.0
+
+c  Hex #1
+      x(9)  =  0.0
+      x(10) = 10.0
+      x(11) = 10.0
+      x(12) =  1.0
+      x(13) =  1.0
+      x(14) = 10.0
+      x(15) = 10.0
+      x(16) =  1.0
+
+      y(9)  =  0.0
+      y(10) =  0.0
+      y(11) =  0.0
+      y(12) =  0.0
+      y(13) = 10.0
+      y(14) = 10.0
+      y(15) = 10.0
+      y(16) = 10.0
+
+      z(9)  =  0.0
+      z(10) =  0.0
+      z(11) =-10.0
+      z(12) =-10.0
+      z(13) =  0.0
+      z(14) =  0.0
+      z(15) =-10.0
+      z(16) =-10.0
+
+c  Tetra #1
+      x(17) =  0.0
+      x(18) =  1.0
+      x(19) = 10.0
+      x(20) =  7.0
+
+      y(17) =  0.0
+      y(18) =  0.0
+      y(19) =  0.0
+      y(20) =  5.0
+
+      z(17) =  0.0
+      z(18) =  5.0
+      z(19) =  2.0
+      z(20) =  3.0
+
+c  Wedge #1
+      x(21) =  3.0
+      x(22) =  6.0
+      x(23) =  0.0
+      x(24) =  3.0
+      x(25) =  6.0
+      x(26) =  0.0
+
+      y(21) =  0.0
+      y(22) =  0.0
+      y(23) =  0.0
+      y(24) =  2.0
+      y(25) =  2.0
+      y(26) =  2.0
+
+      z(21) =  6.0
+      z(22) =  0.0
+      z(23) =  0.0
+      z(24) =  6.0
+      z(25) =  2.0
+      z(26) =  0.0
+
+C Tetra #2 
+      x(27) =  2.7
+      x(28) =  6.0
+      x(29) =  5.7
+      x(30) =  3.7
+
+      y(27) =  1.7
+      y(28) =  1.7
+      y(29) =  1.7
+      y(30) =  0.0
+
+      z(27) =  2.7
+      z(28) =  3.3
+      z(29) =  1.7
+      z(30) =  2.3
+
+C 3d Tri 
+      x(31) =  0.0
+      x(32) = 10.0
+      x(33) = 10.0
+
+      y(31) =  0.0
+      y(32) =  0.0
+      y(33) = 10.0
+
+      z(31) =  0.0
+      z(32) =  0.0
+      z(33) = 10.0
+
+      call expcor (exoid, x, y, z, ierr)
+      write (iout, '("after expcor, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      coord_names(1) = "xcoor"
+      coord_names(2) = "ycoor"
+      coord_names(3) = "zcoor"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i4)' ) ierr
+      call exupda(exoid,ierr)
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      call expmap (exoid, elem_map, ierr)
+      write (iout, '("after expmap, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 7
+
+      num_nodes_per_elem(1) = 37 ! This is total nodes per block
+
+      ebids(1) = 10
+
+      numattr(1) = 0
+
+      cname = "nsided"
+
+      call expelb (exoid,ebids(1),cname,num_elem_in_block(1),
+     1		num_nodes_per_elem(1),numattr(1),ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c
+c write element connectivity
+c
+      connect( 1) = 1
+      connect( 2) = 2 
+      connect( 3) = 3 
+      connect( 4) = 4
+      nnpe(1) = 4
+
+      connect( 5) = 5
+      connect( 6) = 6 
+      connect( 7) = 7 
+      connect( 8) = 8
+      nnpe(2) = 4
+
+      connect( 9) =  9
+      connect(10) = 10
+      connect(11) = 11 
+      connect(12) = 12
+      connect(13) = 13
+      connect(14) = 14
+      connect(15) = 15
+      connect(16) = 16
+      nnpe(3) = 8
+
+      connect(17) = 17
+      connect(18) = 18
+      connect(19) = 19 
+      connect(20) = 20
+      nnpe(4) = 4
+
+      connect(21) = 21
+      connect(22) = 22
+      connect(23) = 23
+      connect(24) = 24
+      connect(25) = 25
+      connect(26) = 26
+      nnpe(5) = 6
+
+      connect(27) = 17
+      connect(28) = 18
+      connect(29) = 19
+      connect(30) = 20
+      connect(31) = 27
+      connect(32) = 28
+      connect(33) = 30
+      connect(34) = 29
+      nnpe(6) = 8
+
+      connect(35) = 31
+      connect(36) = 32
+      connect(37) = 33;
+      nnpe(7) = 3
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+      call expecpp(exoid, EXEBLK, ebids(1), nnpe, ierr)
+      write (iout, '("after expecpp, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+c
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "TESTWT fortran version"
+      qa_record(2,1) = "testwt"
+      qa_record(3,1) = "07/07/93"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "07/07/93"
+      qa_record(4,2) = "16:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i4)' ) ierr
+      if (ierr .ne. 0) then
+         call exclos(exoid,ierr)
+         call exit (0)
+      endif
+
+c ... Define and write some coordinate frames
+      call putfrm(exoid)
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i4)' ) ierr
+
+      stop
+      end
+
+      subroutine putfrm(exoid)
+      implicit none
+      include 'exodusII.inc'
+
+      integer exoid, ierr, i
+      integer numfrm;   ! Assumed to be 3 for remaining dimensions
+      integer cfids(3), tags(3)
+      real    coord(27)
+
+      numfrm = 3
+      
+      cfids(1) =   1
+      cfids(2) =  11
+      cfids(3) = 111
+
+      tags(1) = EXCFREC
+      tags(2) = EXCFCYL
+      tags(3) = EXCFSPH
+
+! NOTE: These values may not be sensical; just used for testing.
+      do i=0,2
+        COORD(9*i+1) = i+0.1
+        COORD(9*i+2) = i+0.2
+        COORD(9*i+3) = i+0.3
+        COORD(9*i+4) = i+0.4
+        COORD(9*i+5) = i+0.5
+        COORD(9*i+6) = i+0.6
+        COORD(9*i+7) = i+0.7
+        COORD(9*i+8) = i+0.8
+        COORD(9*i+9) = i+0.9
+      end do
+      
+      call expfrm(exoid, numfrm, cfids, coord, tags, ierr);
+      write (6,'("after expfrm, error = ", i4)') ierr
+
+      return
+      end
diff --git a/exodus/forbind/test/testwtd.f b/exodus/forbind/test/testwtd.f
new file mode 100644
index 0000000..1398a51
--- /dev/null
+++ b/exodus/forbind/test/testwtd.f
@@ -0,0 +1,572 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwtd
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines using double precision reals.
+c
+
+c	history - 
+c	Original L.A. Schoof
+c	02/25/93 V.R. Yarberry - Added error checks for file creation.
+c	03/04/93 V.R. Yarberry - Fixed bug in expvtt test, ebids was not passed 
+c	08/31/93 VRY - updated to match API version 2.00
+c
+      include 'exodusII.inc'
+
+      integer iin, iout
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer num_elem_in_block(2), num_node_sets
+      integer num_side_sets
+      integer i, j, k, m, elem_map(2), connect(4) 
+      integer node_list(10), elem_list(10), side_list(10)
+      integer ebids(2),ids(2), num_nodes_per_set(2), num_elem_per_set(2)
+      integer num_df_per_set(2)
+      integer df_ind(2), node_ind(2), elem_ind(2), num_qa_rec, num_info
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer truth_tab(3,2)
+      integer whole_time_step, num_time_steps
+      integer cpu_word_size, io_word_size
+      integer prop_array(2)
+
+      real*8 glob_var_vals(10), nodal_var_vals(8) 
+      real*8 time_value, elem_var_vals(20)
+      real*8 x(8), y(8), dummy(1)
+      real*8 attrib(1), dist_fact(8)
+
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) var_names(3)
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXLNLN) inform(3)
+      character*(MXSTLN) prop_names(2)
+
+      logical whole
+
+      data iin /5/, iout /6/
+
+      cpu_word_size = 8
+      io_word_size = 8
+c
+c  create EXODUS II files 
+c
+      exoid = excre ("test.exo",
+     1	 	     EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test.exo,id: ",i4,", err=",i3)')
+     1           exoid, ierr
+      write (iout,'("  cpu word size: ",i4," io word size: ",i4)')
+     1                  cpu_word_size, io_word_size
+      write (iout,'("after excre, error = ", i4)') ierr
+c
+c  initialize file with parameters
+c
+
+      num_dim = 2
+      num_nodes = 8
+      num_elem = 2
+      num_elem_blk = 2
+      num_node_sets = 2
+      num_side_sets = 2
+
+      call expini (exoid, "This is a test", num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i4)' ) ierr
+
+c
+c  write nodal coordinates values and names to database
+c
+
+      x(1) = 0.0 
+      x(2) = 1.0 
+      x(3) = 1.0 
+      x(4) = 0.0 
+      x(5) = 1.0 
+      x(6) = 2.0 
+      x(7) = 2.0 
+      x(8) = 1.0
+      y(1) = 0.0 
+      y(2) = 0.0 
+      y(3) = 1.0 
+      y(4) = 1.0 
+      y(5) = 0.0 
+      y(6) = 0.0 
+      y(7) = 1.0 
+      y(8) = 1.0
+
+      call expcor (exoid, x, y, dummy, ierr)
+      write (iout, '("after expcor, error = ", i4)' ) ierr
+
+      coord_names(1) = "xcoor"
+      coord_names(2) = "ycoor"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i4)' ) ierr
+
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      call expmap (exoid, elem_map, ierr)
+      write (iout, '("after expmap, error = ", i4)' ) ierr
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 1
+      num_elem_in_block(2) = 1
+
+      ebids(1) = 10
+      ebids(2) = 11
+
+      cname = "quad"
+
+      call expelb (exoid,ebids(1),cname,num_elem_in_block(1),4,1,ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      call expelb (exoid,ebids(2),cname,num_elem_in_block(2),4,1,ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+c  write element block properties
+
+      prop_names(1) = "MATL"
+      prop_names(2) = "DENSITY"
+      call exppn(exoid,EXEBLK,2,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+
+      call expp(exoid, EXEBLK, ebids(1), "MATL", 10, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(2), "MATL", 20, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+c
+c write element connectivity
+c
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 5
+      connect(2) = 6 
+      connect(3) = 7 
+      connect(4) = 8
+
+      call expelc (exoid, ebids(2), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+c
+c write element block attributes
+c
+
+      attrib(1) = 3.14159
+      call expeat (exoid, ebids(1), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      attrib(1) = 6.14159
+      call expeat (exoid, ebids(2), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+c
+c write individual node sets
+c
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0
+
+c     call expnp (exoid, 20, 5, 5, ierr)
+c     write (iout, '("after expnp, error = ", i4)' ) ierr
+c     call expns (exoid, 20, node_list, ierr)
+c     write (iout, '("after expns, error = ", i4)' ) ierr
+c     call expnsd (exoid, 20, dist_fact, ierr)
+c     write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+      node_list(1) = 200 
+      node_list(2) = 201 
+      node_list(3) = 202 
+   
+      dist_fact(1) = 1.1 
+      dist_fact(2) = 2.1 
+      dist_fact(3) = 3.1
+
+c     call expnp (exoid, 21, 3, 3, ierr)
+c     write (iout, '("after expnp, error = ", i4)' ) ierr
+c     call expns (exoid, 21, node_list, ierr)
+c     write (iout, '("after expns, error = ", i4)' ) ierr
+c     call expnsd (exoid, 21, dist_fact, ierr)
+c     write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+c
+c write concatenated node sets; this produces the same information as
+c the above code which writes individual node sets
+c
+
+      ids(1) = 20 
+      ids(2) = 21
+
+      num_nodes_per_set(1) = 5 
+      num_nodes_per_set(2) = 3
+
+      num_df_per_set(1) = 5 
+      num_df_per_set(2) = 3
+
+      node_ind(1) = 1 
+      node_ind(2) = 6
+
+      df_ind(1) = 1 
+      df_ind(2) = 6
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+      node_list(6) = 200 
+      node_list(7) = 201 
+      node_list(8) = 202
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0 
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0 
+      dist_fact(6) = 1.1 
+      dist_fact(7) = 2.1 
+      dist_fact(8) = 3.1
+
+      call expcns (exoid, ids, num_nodes_per_set, num_df_per_set,
+     1        node_ind, df_ind, node_list, dist_fact, ierr)
+      write (iout, '("after expcns, error = ", i4)' ) ierr
+
+c     write node set properties
+
+      prop_names(1) = "FACE"
+      call expp(exoid, EXNSET, 20, prop_names(1), 4, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXNSET, 21, prop_names(1), 5, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      prop_array(1) = 1000
+      prop_array(2) = 2000
+
+      prop_names(1) = "VELOCITY"
+      call exppa(exoid, EXNSET, prop_names(1), prop_array, ierr)
+      write (iout, '("after exppa, error = ", i4)' ) ierr
+
+c
+c write individual side sets
+c
+
+      elem_list(1) = 11
+      elem_list(2) = 12
+
+      side_list(1) = 1 
+      side_list(2) = 2 
+
+      dist_fact(1) = 30.0 
+      dist_fact(2) = 30.1 
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+
+c     call expsp (exoid, 30, 2, 4, ierr)
+c     write (iout, '("after expsp, error = ", i4)' ) ierr
+
+c     call expss (exoid, 30, elem_list, side_list, ierr)
+c     write (iout, '("after expss, error = ", i4)' ) ierr
+
+c     call expssd (exoid, 30, dist_fact, ierr)
+c     write (iout, '("after expssd, error = ", i4)' ) ierr
+
+      elem_list(1) = 13
+      elem_list(2) = 14
+
+      side_list(1) = 3
+      side_list(2) = 4
+
+      dist_fact(1) = 31.0
+      dist_fact(2) = 31.1
+      dist_fact(3) = 31.2
+      dist_fact(4) = 31.3
+
+c     call expsp (exoid, 31, 2, 4, ierr)
+c     write (iout, '("after expsp, error = ", i4)' ) ierr
+
+c     call expss (exoid, 31, elem_list, side_list, ierr)
+c     write (iout, '("after expss, error = ", i4)' ) ierr
+
+c     call expssd (exoid, 31, dist_fact, ierr)
+c     write (iout, '("after expssd, error = ", i4)' ) ierr
+
+c write concatenated side sets; this produces the same information as
+c the above code which writes individual side sets
+c
+
+      ids(1) = 30
+      ids(2) = 31
+
+      num_elem_per_set(1) = 2
+      num_elem_per_set(2) = 2
+
+      num_df_per_set(1) = 4
+      num_df_per_set(2) = 4
+
+      elem_ind(1) = 1
+      elem_ind(2) = 3
+
+      df_ind(1) = 1
+      df_ind(2) = 5
+  
+      elem_list(1) = 11
+      elem_list(2) = 12
+      elem_list(3) = 13
+      elem_list(4) = 14
+
+      side_list(1) = 1
+      side_list(2) = 2
+      side_list(3) = 3
+      side_list(4) = 4
+
+      dist_fact(1) = 30.0
+      dist_fact(2) = 30.1
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+      dist_fact(5) = 31.0
+      dist_fact(6) = 31.1
+      dist_fact(7) = 31.2
+      dist_fact(8) = 31.3
+
+      call expcss (exoid, ids, num_elem_per_set, num_df_per_set,
+     1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+     2             ierr)
+      write (iout, '("after expcss, error = ", i4)' ) ierr
+
+      prop_names(1) = "COLOR"
+      call expp(exoid, EXSSET, 30, prop_names(1), 100, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXSSET, 31, prop_names(1), 101, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+c
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "TESTWTD fortran version"
+      qa_record(2,1) = "testwtd"
+      qa_record(3,1) = "07/07/93"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "07/07/93"
+      qa_record(4,2) = "16:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i4)' ) ierr
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i4)' ) ierr
+
+
+c write results variables parameters and names
+
+      num_glo_vars = 1
+  
+      var_names(1) = "glo_vars"
+
+      call expvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+
+      num_nod_vars = 2
+
+      var_names(1) = "nod_var0"
+      var_names(2) = "nod_var1"
+
+      call expvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+   
+      num_ele_vars = 3
+
+      var_names(1) = "ele_var0"
+      var_names(2) = "ele_var1"
+      var_names(3) = "ele_var2"
+
+      call expvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+c
+c write element variable truth table
+c
+
+      k = 0
+
+      do 30 i = 1,num_elem_blk
+         do 20 j = 1,num_ele_vars
+            truth_tab(j,i) = 1
+20       continue
+30    continue
+      call expvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '("after expvtt, error = ", i4)' ) ierr
+
+c
+c for each time step, write the analysis results;
+c the code below fills the arrays hist_var_vals, glob_var_vals, 
+c nodal_var_vals, and elem_var_vals with values for debugging purposes;
+c obviously the analysis code will populate these arrays
+c
+
+      whole = .true.
+      hist_time_step = 1
+      whole_time_step = 1
+      num_time_steps = 10
+
+      do 110 i = 1, num_time_steps
+        time_value = dble(i)/100
+c
+c write time value
+c
+
+        call exptim (exoid, whole_time_step, time_value, ierr)
+        write (iout, '("after exptim, error = ", i4)' ) ierr
+
+c
+c write global variables
+c
+
+        do 50 j = 1, num_glo_vars
+          glob_var_vals(j) = real(j+1) * time_value
+50      continue
+
+        call expgv (exoid, whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+        write (iout, '("after expgv, error = ", i4)' ) ierr
+
+c
+c write nodal variables
+c
+
+        do 70 k = 1, num_nod_vars
+          do 60 j = 1, num_nodes
+
+            nodal_var_vals(j) = real(k) + (real(j) * time_value)
+
+60        continue
+
+          call expnv (exoid, whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+          write (iout, '("after expnv, error = ", i4)' ) ierr
+
+70      continue
+
+c
+c write element variables
+c
+
+        do 100 k = 1, num_ele_vars
+          do 90 j = 1, num_elem_blk
+            do 80 m = 1, num_elem_in_block(j)
+
+              elem_var_vals(m) = real(k+1) + real(j+1) + 
+     1                          (real(m)*time_value)
+c             write(iout,*)'elem_var_val(',m,'): ',elem_var_vals(m)
+
+80          continue
+
+            call expev (exoid, whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+            write (iout, '("after expev, error = ", i4)' ) ierr
+
+90        continue
+100     continue
+
+        whole_time_step = whole_time_step + 1
+
+c
+c update the data file; this should be done at the end of every time 
+c step to ensure that no data is lost if the analysis dies
+c
+        call exupda (exoid, ierr)
+        write (iout, '("after exupda, error = ", i4)' ) ierr
+
+110   continue
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i4)' ) ierr
+
+      stop
+      end
diff --git a/exodus/forbind/test/testwtm.f b/exodus/forbind/test/testwtm.f
new file mode 100644
index 0000000..42cb10f
--- /dev/null
+++ b/exodus/forbind/test/testwtm.f
@@ -0,0 +1,979 @@
+C    Copyright (c) 2014, Sandia Corporation.
+C    Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
+C    the U.S. Government retains certain rights in this software.
+C    
+C    Redistribution and use in source and binary forms, with or without
+C    modification, are permitted provided that the following conditions are
+C    met:
+C    
+C        * Redistributions of source code must retain the above copyright
+C          notice, this list of conditions and the following disclaimer.
+C    
+C        * Redistributions in binary form must reproduce the above
+C          copyright notice, this list of conditions and the following
+C          disclaimer in the documentation and/or other materials provided
+C          with the distribution.
+C    
+C        * Neither the name of Sandia Corporation nor the names of its
+C          contributors may be used to endorse or promote products derived
+C          from this software without specific prior written permission.
+C    
+C    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C    
+
+      program testwtm
+c
+c This is a test program for the Fortran binding of the EXODUS II
+c database write routines. It tests multiple simultaneous output files.
+c
+c     09/07/93	V.R. Yarberry - Revised for 2.00 API
+
+      include 'exodusII.inc'
+
+      integer iin, iout
+      integer exoid, num_dim, num_nodes, num_elem, num_elem_blk
+      integer exoidm(10),num_dim2,num_nodes2,num_elem2,num_elem_blk2
+      integer num_elem_in_block(2), num_node_sets
+      integer num_elem_in_block2(2), num_node_sets2
+      integer num_side_sets
+      integer num_side_sets2
+      integer nexofiles
+      integer i, j, k, m, elem_map(2), connect(4) 
+      integer elem_map2(2), connect2(4) 
+      integer node_list(10), elem_list(10), side_list(10)
+      integer node_list2(10), elem_list2(10), side_list2(10)
+      integer ebids(2),ids(2), num_nodes_per_set(2), num_elem_per_set(2)
+      integer ebids2(2)
+      integer num_df_per_set(2)
+      integer df_ind(2), node_ind(2), elem_ind(2), num_qa_rec, num_info
+      integer num_qa_rec2,num_info2
+      integer num_glo_vars, num_nod_vars, num_ele_vars
+      integer num_glo_vars2, num_nod_vars2, num_ele_vars2
+      integer truth_tab(3,2)
+      integer whole_time_step, num_time_steps
+      integer cpu_word_size, io_word_size
+      integer prop_array(2)
+
+      real glob_var_vals(10), nodal_var_vals(8) 
+      real time_value, elem_var_vals(20)
+      real time_value2
+      real x(8), y(8), dummy(1)
+      real x2(8), y2(8)
+      real attrib(1), dist_fact(8)
+      real attrib2(1), dist_fact2(8)
+
+      character*(MXLNLN) title
+      character*(MXLNLN) title2
+      character*(MXSTLN) coord_names(3)
+      character*(MXSTLN) coord_names2(3)
+      character*(MXSTLN) cname
+      character*(MXSTLN) cname2
+      character*(MXSTLN) var_names(3)
+      character*(MXSTLN) var_names2(3)
+      character*(MXSTLN) qa_record(4,2)
+      character*(MXSTLN) qa_record2(4,2)
+      character*(MXLNLN) inform(3)
+      character*(MXLNLN) inform2(3)
+      character*(MXSTLN) prop_names(2)
+      character*(MXSTLN) exofname
+
+      data iin /5/, iout /6/, nexofiles /5/
+
+c
+c  create EXODUS II files 
+c
+      cpu_word_size = 0
+      io_word_size = 4
+c
+      exoid = excre ("test.exo",
+     1               EXCLOB, cpu_word_size, io_word_size, ierr)
+      write (iout,'("after excre for test.exo,id: ",i4,", err=",i3)')
+     1           exoid, ierr
+      write (iout,'("  cpu word size: ",i4," io word size: ",i4)')
+     1                  cpu_word_size, io_word_size
+      write (iout, '("after excre, error = ", i4)' ) ierr
+
+      do 1000 i=1,nexofiles
+        write(exofname,'("test",i1,".exo")')i
+        exoidm(i)= excre (exofname, 
+     1               EXCLOB, cpu_word_size, io_word_size, ierr)
+        write (iout,
+     1    '("after excre for test",i1,".exo,id: ",i4,", err=",i3)')
+     2	  i, exoidm(i), ierr
+        write (iout, '("after excre (",i1,"), error = ", i4)' )
+     1		i, ierr
+1000  continue
+
+c
+c  initialize file with parameters
+c
+
+      title = "This is test m"
+      num_dim = 2
+      num_nodes = 8
+      num_elem = 2
+      num_elem_blk = 2
+      num_node_sets = 2
+      num_side_sets = 2
+
+      call expini (exoid, title, num_dim, num_nodes, 
+     1             num_elem, num_elem_blk, num_node_sets, 
+     2             num_side_sets, ierr)
+
+      write (iout, '("after expini, error = ", i4)' ) ierr
+      
+      title2 = "This is test m"
+      num_dim2 = 2
+      num_nodes2 = 8
+      num_elem2 = 2
+      num_elem_blk2 = 2
+      num_node_sets2 = 2
+      num_side_sets2 = 2
+
+      do 1001 i=1,nexofiles
+        call expini (exoidm(i), title2, num_dim2, num_nodes2, 
+     1             num_elem2, num_elem_blk2, num_node_sets2, 
+     2             num_side_sets2, ierr)
+
+        write (iout, '("after expini (",i1,"), error = ", i4)' )
+     1		i, ierr
+1001  continue
+
+
+c
+c  write nodal coordinates values and names to database
+c
+
+      x(1) = 0.0 
+      x(2) = 1.0 
+      x(3) = 1.0 
+      x(4) = 0.0 
+      x(5) = 1.0 
+      x(6) = 2.0 
+      x(7) = 2.0 
+      x(8) = 1.0
+      y(1) = 0.0 
+      y(2) = 0.0 
+      y(3) = 1.0 
+      y(4) = 1.0 
+      y(5) = 0.0 
+      y(6) = 0.0 
+      y(7) = 1.0 
+      y(8) = 1.0
+
+      call expcor (exoid, x, y, dummy, ierr)
+      write (iout, '("after expcor, error = ", i4)' ) ierr
+
+      x2(1) = 0.0 
+      x2(2) = 1.0 
+      x2(3) = 1.0 
+      x2(4) = 0.0 
+      x2(5) = 1.0 
+      x2(6) = 2.0 
+      x2(7) = 2.0 
+      x2(8) = 1.0
+      y2(1) = 0.0 
+      y2(2) = 0.0 
+      y2(3) = 1.0 
+      y2(4) = 1.0 
+      y2(5) = 0.0 
+      y2(6) = 0.0 
+      y2(7) = 1.0 
+      y2(8) = 1.0
+
+      do 1002 i=1,nexofiles
+        call expcor (exoidm(i), x2, y2, dummy, ierr)
+        write (iout, '("after expcor (",i1,"), error = ", i4)')
+     1		i, ierr
+1002  continue
+
+      coord_names(1) = "xcoor"
+      coord_names(2) = "ycoor"
+
+      call expcon (exoid, coord_names, ierr)
+      write (iout, '("after expcon, error = ", i4)' ) ierr
+
+      coord_names2(1) = "xcoor"
+      coord_names2(2) = "ycoor"
+
+      do 1003 i=1,nexofiles
+        call expcon (exoidm(i), coord_names2, ierr)
+        write (iout, '("after expcon (",i1,"), error = ", i4)')
+     1		i, ierr
+1003  continue
+
+
+c
+c write element order map
+c
+
+      do 10 i = 1, num_elem
+         elem_map(i) = i
+10    continue
+
+      call expmap (exoid, elem_map, ierr)
+      write (iout, '("after expmap, error = ", i4)' ) ierr
+
+      do 12 i = 1, num_elem2
+         elem_map2(i) = i
+12    continue
+
+      do 1004 i=1,nexofiles
+        call expmap (exoidm(i), elem_map2, ierr)
+        write (iout, '("after expmap (",i1,"), error = ", i4)')
+     1		i, ierr
+1004  continue
+
+c
+c write element block parameters
+c
+
+      num_elem_in_block(1) = 1
+      num_elem_in_block(2) = 1
+
+      ebids(1) = 10
+      ebids(2) = 11
+
+      cname = "quad"
+
+      call expelb (exoid,ebids(1),cname,num_elem_in_block(1)
+     1		,4,1,ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      call expelb (exoid,ebids(2),cname,num_elem_in_block(2),
+     1		 4,1,ierr)
+      write (iout, '("after expelb, error = ", i4)' ) ierr
+
+      num_elem_in_block2(1) = 1
+      num_elem_in_block2(2) = 1
+
+      ebids2(1) = 10
+      ebids2(2) = 11
+
+      cname2 = "quad2"
+
+      do 1005 i=1,nexofiles
+        call expelb(exoidm(i),ebids2(1),cname2,num_elem_in_block2(1),
+     1		4,1,ierr)
+        write (iout, '("after expelb (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expelb(exoidm(i),ebids2(2),cname2,num_elem_in_block2(2),
+     1		4,1,ierr)
+        write (iout, '("after expelb (",i1,"), error = ", i4)')
+     1		i, ierr
+1005  continue
+
+c  write element block properties
+
+      prop_names(1) = "MATL"
+      prop_names(2) = "DENSITY"
+      call exppn(exoid,EXEBLK,2,prop_names,ierr)
+      write (iout, '("after exppn, error = ", i4)' ) ierr
+
+      call expp(exoid, EXEBLK, ebids(1), "MATL", 10, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+      call expp(exoid, EXEBLK, ebids(2), "MATL", 20, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      do 1006 i=1,nexofiles
+        call exppn(exoidm(i),EXEBLK,2,prop_names,ierr)
+        write (iout, '("after exppn (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expp(exoidm(i), EXEBLK, ebids(1), "MATL", 10, ierr)
+        write (iout, '("after expp (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expp(exoidm(i), EXEBLK, ebids(2), "MATL", 20, ierr)
+        write (iout, '("after expp (",i1,"), error = ", i4)')
+     1		i, ierr
+1006  continue
+
+c
+c write element connectivity
+c
+
+      connect(1) = 1
+      connect(2) = 2 
+      connect(3) = 3 
+      connect(4) = 4
+
+      call expelc (exoid, ebids(1), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect(1) = 5
+      connect(2) = 6 
+      connect(3) = 7 
+      connect(4) = 8
+
+      call expelc (exoid, ebids(2), connect, ierr)
+      write (iout, '("after expelc, error = ", i4)' ) ierr
+
+      connect2(1) = 1
+      connect2(2) = 2 
+      connect2(3) = 3 
+      connect2(4) = 4
+
+      do 1007 i=1,nexofiles
+        call expelc (exoidm(i), ebids2(1), connect2, ierr)
+        write (iout, '("after expelc (",i1,"), error = ", i4)')
+     1		i, ierr
+1007  continue
+
+      connect2(1) = 5
+      connect2(2) = 6 
+      connect2(3) = 7 
+      connect2(4) = 8
+
+      do 1008 i=1,nexofiles
+        call expelc (exoidm(i), ebids2(2), connect2, ierr)
+        write (iout, '("after expelc (",i1,"), error = ", i4)')
+     1		i, ierr
+1008  continue
+
+c
+c write element block attributes
+c
+
+      attrib(1) = 3.14159
+      call expeat (exoid, ebids(1), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      attrib(1) = 6.14159
+      call expeat (exoid, ebids(2), attrib, ierr)
+      write (iout, '("after expeat, error = ", i4)' ) ierr
+
+      attrib2(1) = 3.
+      do 1009 i=1,nexofiles
+        call expeat (exoidm(i), ebids2(1), attrib2, ierr)
+        write (iout, '("after expeat (",i1,"), error = ", i4)')
+     1		i, ierr
+1009  continue
+
+      attrib2(1) = 6.
+      do 1010 i=1,nexofiles
+        call expeat (exoidm(i), ebids2(2), attrib2, ierr)
+        write (iout, '("after expeat (",i1,"), error = ", i4)')
+     1		i, ierr
+1010  continue
+
+c
+c write individual node sets
+c
+
+      call expnp (exoid, 20, 5, 5, ierr)
+      write (iout, '("after expnp, error = ", i4)' ) ierr
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0
+
+      call expns (exoid, 20, node_list, ierr)
+      write (iout, '("after expns, error = ", i4)' ) ierr
+      call expnsd (exoid, 20, dist_fact, ierr)
+      write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+      call expnp (exoid, 21, 3, 3, ierr)
+      write (iout, '("after expnp, error = ", i4)' ) ierr
+
+      node_list(1) = 200 
+      node_list(2) = 201 
+      node_list(3) = 202 
+   
+      dist_fact(1) = 1.1 
+      dist_fact(2) = 2.1 
+      dist_fact(3) = 3.1
+
+      call expns (exoid, 21, node_list, ierr)
+      write (iout, '("after expns, error = ", i4)' ) ierr
+      call expnsd (exoid, 21, dist_fact, ierr)
+      write (iout, '("after expnsd, error = ", i4)' ) ierr
+
+      prop_names(1) = "FACE"
+      call expp(exoid, EXNSET, 20, prop_names(1), 4, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXNSET, 21, prop_names(1), 5, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      prop_array(1) = 1000
+      prop_array(2) = 2000
+
+      prop_names(1) = "VELOCITY"
+      call exppa(exoid, EXNSET, prop_names(1), prop_array, ierr)
+      write (iout, '("after exppa, error = ", i4)' ) ierr
+
+C**** file 2
+
+      node_list2(1) = 2100 
+      node_list2(2) = 2101 
+      node_list2(3) = 2102 
+      node_list2(4) = 2103 
+      node_list2(5) = 2104 
+
+      dist_fact2(1) = 21.0 
+      dist_fact2(2) = 22.0 
+      dist_fact2(3) = 23.0
+      dist_fact2(4) = 24.0 
+      dist_fact2(5) = 25.0
+
+      do 1011 i=1,nexofiles
+        call expnp (exoidm(i), 20, 5, 5, ierr)
+        write (iout, '("after expnp (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expns (exoidm(i), 20, node_list, ierr)
+        write (iout, '("after expns (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expnsd (exoidm(i), 20, dist_fact, ierr)
+        write (iout, '("after expnsd (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expnp (exoidm(i), 21, 3, 3, ierr)
+        write (iout, '("after expnp (",i1,"), error = ", i4)')
+     1		i, ierr
+1011  continue
+
+      node_list2(1) = 2200 
+      node_list2(2) = 2201 
+      node_list2(3) = 2202 
+   
+      dist_fact2(1) = 21.1 
+      dist_fact2(2) = 22.1 
+      dist_fact2(3) = 23.1
+
+      do 1012 i=1,nexofiles
+        call expns (exoidm(i), 21, node_list, ierr)
+        write (iout, '("after expns (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expnsd (exoidm(i), 21, dist_fact, ierr)
+        write (iout, '("after expnsd (",i1,"), error = ", i4)')
+     1		i, ierr
+1012  continue
+
+c
+c write concatenated node sets; this produces the same information as
+c the above code which writes individual node sets
+c
+
+      ids(1) = 20 
+      ids(2) = 21
+
+      num_nodes_per_set(1) = 5 
+      num_nodes_per_set(2) = 3
+
+      node_ind(1) = 1 
+      node_ind(2) = 6
+
+      node_list(1) = 100 
+      node_list(2) = 101 
+      node_list(3) = 102 
+      node_list(4) = 103 
+      node_list(5) = 104 
+      node_list(6) = 200 
+      node_list(7) = 201 
+      node_list(8) = 202
+
+      dist_fact(1) = 1.0 
+      dist_fact(2) = 2.0 
+      dist_fact(3) = 3.0 
+      dist_fact(4) = 4.0 
+      dist_fact(5) = 5.0 
+      dist_fact(6) = 1.1 
+      dist_fact(7) = 2.1 
+      dist_fact(8) = 3.1
+
+c     call expcns (exoid, ids, num_nodes_per_set, node_ind, node_list, 
+c    1        dist_fact, ierr)
+c     write (iout, '("after expcns, error = ", i4)' ) ierr
+c
+
+      do 1013 i=1,nexofiles
+        prop_names(1) = "FACE"
+        call expp(exoidm(i), EXNSET, 20, prop_names(1), 4, ierr)
+        write (iout, '("after expp (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expp(exoidm(i), EXNSET, 21, prop_names(1), 5, ierr)
+        write (iout, '("after expp (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        prop_array(1) = 1000
+        prop_array(2) = 2000
+
+        prop_names(1) = "VELOCITY"
+        call exppa(exoidm(i), EXNSET, prop_names(1), prop_array, ierr)
+        write (iout, '("after exppa (",i1,"), error = ", i4)')
+     1		i, ierr
+1013  continue
+
+c write individual side sets
+c
+
+      elem_list(1) = 11
+      elem_list(2) = 12
+
+      node_list(1) = 1 
+      node_list(2) = 2 
+      node_list(3) = 3 
+      node_list(4) = 4
+
+      dist_fact(1) = 30.0
+      dist_fact(2) = 30.1
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+
+      call expsp (exoid, 30, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i4)' ) ierr
+
+      call expss (exoid, 30, elem_list, node_list, ierr)
+      write (iout, '("after expss, error = ", i4)' ) ierr
+
+      call expssd (exoid, 30, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i4)' ) ierr
+
+      elem_list(1) = 13
+      elem_list(2) = 14
+
+      side_list(1) = 3
+      side_list(2) = 4
+
+      dist_fact(1) = 31.0
+      dist_fact(2) = 31.1
+      dist_fact(3) = 31.2
+      dist_fact(4) = 31.3
+
+      call expsp (exoid, 31, 2, 4, ierr)
+      write (iout, '("after expsp, error = ", i3)' ) ierr
+
+      call expss (exoid, 31, elem_list, side_list, ierr)
+      write (iout, '("after expss, error = ", i3)' ) ierr
+
+      call expssd (exoid, 31, dist_fact, ierr)
+      write (iout, '("after expssd, error = ", i3)' ) ierr
+
+
+      elem_list2(1) = 11
+      elem_list2(2) = 12
+
+      node_list2(1) = 1 
+      node_list2(2) = 2 
+      node_list2(3) = 3 
+      node_list2(4) = 4
+
+      dist_fact2(1) = 1.1 
+      dist_fact2(2) = 2.1 
+      dist_fact2(3) = 3.1
+      dist_fact2(4) = 4.1
+
+      do 1014 i=1,nexofiles
+        call expsp (exoidm(i), 30, 2, 4, ierr)
+        write (iout, '("after expsp (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expss (exoidm(i), 30, elem_list2, node_list2, ierr)
+        write (iout, '("after expss (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expssd (exoidm(i), 30, dist_fact2, ierr)
+        write (iout, '("after expssd (",i1,"), error = ", i4)')
+     1		i, ierr
+1014  continue
+
+      elem_list2(1) = 13
+      elem_list2(2) = 14
+
+      side_list2(1) = 3
+      side_list2(2) = 4
+
+      dist_fact2(1) = 31.0
+      dist_fact2(2) = 31.1
+      dist_fact2(3) = 31.2
+      dist_fact2(4) = 31.3
+
+      do 1015 i=1,nexofiles
+        call expsp (exoidm(i), 31, 2, 4, ierr)
+        write (iout, '("after expsp (",i1,"), error = ", i3)')
+     1		i, ierr
+
+        call expss (exoidm(i), 31, elem_list2, side_list2, ierr)
+        write (iout, '("after expss (",i1,"), error = ", i3)')
+     1		i, ierr
+
+        call expssd (exoidm(i), 31, dist_fact2, ierr)
+        write (iout, '("after expssd (",i1,"), error = ", i3)')
+     1		i, ierr
+1015  continue
+
+c
+c write concatenated side sets; this produces the same information as
+c the above code which writes individual side sets
+c
+
+      ids(1) = 30
+      ids(2) = 31
+
+      num_elem_per_set(1) = 2
+      num_elem_per_set(2) = 2
+
+      num_df_per_set(1) = 4
+      num_df_per_set(2) = 4
+
+      elem_ind(1) = 1
+      elem_ind(2) = 3
+
+      df_ind(1) = 1
+      df_ind(2) = 5
+
+      elem_list(1) = 11
+      elem_list(2) = 12
+      elem_list(3) = 13
+      elem_list(4) = 14
+
+      side_list(1) = 1
+      side_list(2) = 2
+      side_list(3) = 3
+      side_list(4) = 4
+
+      dist_fact(1) = 30.0
+      dist_fact(2) = 30.1
+      dist_fact(3) = 30.2
+      dist_fact(4) = 30.3
+      dist_fact(5) = 31.0
+      dist_fact(6) = 31.1
+      dist_fact(7) = 31.2
+      dist_fact(8) = 31.3
+
+c     call expcss (exoid, ids, num_elem_per_set, num_df_per_set,
+c    1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+c    2             ierr)
+c     write (iout, '("after expcss, error = ", i4)' ) ierr
+
+c     call expcss (exoidm(i), ids, num_elem_per_set, num_df_per_set,
+c    1             elem_ind, df_ind, elem_list, side_list, dist_fact,
+c    2             ierr)
+c     write (iout, '("after expcss (",i1,"), error = ", i4)' ) ierr
+
+      prop_names(1) = "COLOR"
+      call expp(exoid, EXSSET, 30, prop_names(1), 100, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+      call expp(exoid, EXSSET, 31, prop_names(1), 101, ierr)
+      write (iout, '("after expp, error = ", i4)' ) ierr
+
+
+      do 1016 i=1,nexofiles
+        prop_names(1) = "COLOR"
+        call expp(exoidm(i), EXSSET, 30, prop_names(1), 100, ierr)
+        write (iout, '("after expp (",i1,"), error = ", i4)')
+     1		i, ierr
+
+        call expp(exoidm(i), EXSSET, 31, prop_names(1), 101, ierr)
+        write (iout, '("after expp (",i1,"), error = ", i4)')
+     1		i, ierr
+1016  continue
+
+
+c
+c write QA records
+c
+
+      num_qa_rec = 2
+
+      qa_record(1,1) = "TESTWTM fortran version"
+      qa_record(2,1) = "testwtm"
+      qa_record(3,1) = "07/07/93"
+      qa_record(4,1) = "15:41:33"
+      qa_record(1,2) = "FASTQ"
+      qa_record(2,2) = "fastq"
+      qa_record(3,2) = "07/07/93"
+      qa_record(4,2) = "16:41:33"
+
+      call expqa (exoid, num_qa_rec, qa_record, ierr)
+      write (iout, '("after expqa, error = ", i4)' ) ierr
+
+      num_qa_rec2 = 2
+
+      qa_record2(1,1) = "TESTWTM fortran version"
+      qa_record2(2,1) = "testwtm"
+      qa_record2(3,1) = "07/07/93"
+      qa_record2(4,1) = "15:41:33"
+      qa_record2(1,2) = "FASTQ"
+      qa_record2(2,2) = "fastq"
+      qa_record2(3,2) = "07/07/93"
+      qa_record2(4,2) = "16:41:33"
+
+      do 1017 i=1,nexofiles
+        call expqa (exoidm(i), num_qa_rec2, qa_record2, ierr)
+        write (iout, '("after expqa (",i1,"), error = ", i4)')
+     1		i, ierr
+1017  continue
+
+
+c
+c write information records
+c
+
+      num_info = 3
+
+      inform(1) = "This is the first information record."
+      inform(2) = "This is the second information record."
+      inform(3) = "This is the third information record."
+
+      call expinf (exoid, num_info, inform, ierr)
+      write (iout, '("after expinf, error = ", i4)' ) ierr
+
+      num_info2 = 3
+
+      inform2(1) = "This is the first info record."
+      inform2(2) = "This is the second info record."
+      inform2(3) = "This is the third info record."
+
+      do 1018 i=1,nexofiles
+        call expinf (exoidm(i), num_info2, inform2, ierr)
+        write (iout, '("after expinf (",i1,"), error = ", i4)')
+     1		i, ierr
+1018  continue
+
+c write results variables parameters and names
+
+      num_glo_vars = 1
+  
+      var_names(1) = "glo_vars"
+
+      call expvp (exoid, "g", num_glo_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "g", num_glo_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+      num_glo_vars2 = 1
+  
+      var_names2(1) = "glovars2"
+
+      do 1019 i=1,nexofiles
+        call expvp (exoidm(i), "g", num_glo_vars2, ierr)
+        write (iout, '("after expvp (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expvan (exoidm(i), "g", num_glo_vars2, var_names2, ierr)
+        write (iout, '("after expvan (",i1,"), error = ", i4)')
+     1		i, ierr
+1019  continue
+
+      num_nod_vars = 2
+
+      var_names(1) = "nod_var0"
+      var_names(2) = "nod_var1"
+
+      call expvp (exoid, "n", num_nod_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "n", num_nod_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+      num_nod_vars2 = 2
+
+      var_names2(1) = "nodvar20"
+      var_names2(2) = "nodvar21"
+
+      do 1020 i=1,nexofiles
+        call expvp (exoidm(i), "n", num_nod_vars2, ierr)
+        write (iout, '("after expvp (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expvan (exoidm(i), "n", num_nod_vars2, var_names2, ierr)
+        write (iout, '("after expvan (",i1,"), error = ", i4)')
+     1		i, ierr
+1020  continue
+   
+      num_ele_vars = 3
+
+      var_names(1) = "ele_var0"
+      var_names(2) = "ele_var1"
+      var_names(3) = "ele_var2"
+
+      call expvp (exoid, "e", num_ele_vars, ierr)
+      write (iout, '("after expvp, error = ", i4)' ) ierr
+      call expvan (exoid, "e", num_ele_vars, var_names, ierr)
+      write (iout, '("after expvan, error = ", i4)' ) ierr
+
+      num_ele_vars2 = 3
+
+      var_names2(1) = "elevar20"
+      var_names2(2) = "elevar21"
+      var_names2(3) = "elevar22"
+
+      do 1021 i=1,nexofiles
+        call expvp (exoidm(i), "e", num_ele_vars2, ierr)
+        write (iout, '("after expvp (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expvan (exoidm(i), "e", num_ele_vars2, var_names2, ierr)
+        write (iout, '("after expvan (",i1,"), error = ", i4)')
+     1		i, ierr
+1021  continue
+c
+c write element variable truth table
+c
+
+      k = 0
+
+      do 30 i = 1,num_elem_blk
+         do 20 j = 1,num_ele_vars
+            truth_tab(j,i) = 1
+20       continue
+30    continue
+
+      call exgebi (exoid, ebids, ierr)
+      write (iout, '("after exgebi, error = ", i4)' ) ierr
+      call expvtt (exoid, num_elem_blk, num_ele_vars, truth_tab, ierr)
+      write (iout, '("after expvtt, error = ", i4)' ) ierr
+
+      do 1022 i=1,nexofiles
+        call exgebi (exoidm(i), ebids2, ierr)
+        write (iout, '("after exgebi (",i1,"), error = ", i4)')
+     1		i, ierr
+        call expvtt (exoidm(i),num_elem_blk,num_ele_vars,truth_tab,ierr)
+        write (iout, '("after expvtt (",i1,"), error = ", i4)')
+     1		i, ierr
+1022  continue
+c
+c for each time step, write the analysis results;
+c the code below fills the arrays glob_var_vals, 
+c nodal_var_vals, and elem_var_vals with values for debugging purposes;
+c obviously the analysis code will populate these arrays
+c
+
+      whole_time_step = 1
+      num_time_steps = 10
+
+      do 110 iii = 1, num_time_steps
+        time_value = real(iii)/100
+        time_value2 = real(iii)/100
+c
+c write time value to regular file
+c
+
+        call exptim (exoid, whole_time_step, time_value, ierr)
+        write (iout, '("after exptim, error = ", i4)' ) ierr
+
+        do 1023 i=1,nexofiles
+          call exptim (exoidm(i), whole_time_step, time_value2, ierr)
+          write (iout, '("after exptim (",i1,"), error = ", i4)')
+     1		i, ierr
+1023    continue
+
+c
+c write global variables
+c
+
+        do 50 j = 1, num_glo_vars
+          glob_var_vals(j) = real(j+1) * time_value
+50      continue
+
+        call expgv (exoid, whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+        write (iout, '("after expgv, error = ", i4)' ) ierr
+
+        do 1024 i=1,nexofiles
+          call expgv (exoidm(i), whole_time_step, num_glo_vars, 
+     1              glob_var_vals, ierr)
+          write (iout, '("after expgv (",i1,"), error = ", i4)')
+     1		i, ierr
+1024    continue
+
+c
+c write nodal variables
+c
+
+        do 70 k = 1, num_nod_vars
+          do 60 j = 1, num_nodes
+
+            nodal_var_vals(j) = real(k) + (real(j) * time_value)
+
+60        continue
+
+          call expnv (exoid, whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+          write (iout, '("after expnv, error = ", i4)' ) ierr
+
+          do 1025 i=1,nexofiles
+            call expnv (exoidm(i), whole_time_step, k, num_nodes, 
+     1                nodal_var_vals, ierr)
+            write (iout, '("after expnv (",i1,"), error = ", i4)')
+     1		i, ierr
+1025      continue
+
+70      continue
+
+c
+c write element variables
+c
+
+        do 100 k = 1, num_ele_vars
+          do 90 j = 1, num_elem_blk
+            do 80 m = 1, num_elem_in_block(j)
+
+              elem_var_vals(m) = real(k+1) + real(j+1) + 
+     1                          (real(m)*time_value)
+
+80          continue
+
+            call expev (exoid, whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+            write (iout, '("after expev, error = ", i4)' ) ierr
+            do 1026 i=1,nexofiles
+              call expev (exoidm(i), whole_time_step, k, ebids(j), 
+     1                  num_elem_in_block(j), elem_var_vals, ierr)
+              write (iout, '("after expev (",i1,"), error = ", i4)')
+     1		i, ierr
+1026        continue
+
+90        continue
+100     continue
+
+        whole_time_step = whole_time_step + 1
+
+c
+c update the data file; this should be done at the end of every time 
+c step to ensure that no data is lost if the analysis dies
+c
+        call exupda (exoid, ierr)
+        write (iout, '("after exupda, error = ", i4)' ) ierr
+        do 1027 i=1,nexofiles
+          call exupda (exoidm(i), ierr)
+          write (iout, '("after exupda (",i1,"), error = ", i4)')
+     1		i, ierr
+1027    continue
+
+110   continue
+
+c
+c close the EXODUS files
+c
+      call exclos (exoid, ierr)
+      write (iout, '("after exclos, error = ", i4)' ) ierr
+
+      do 1028 i=1,nexofiles
+        call exclos (exoidm(i), ierr)
+        write (iout, '("after exclos (",i1,"), error = ", i4)')
+     1		i, ierr
+1028  continue
+
+      stop
+      end
+
diff --git a/nemesis/CMakeLists.txt b/nemesis/CMakeLists.txt
new file mode 100644
index 0000000..3560d63
--- /dev/null
+++ b/nemesis/CMakeLists.txt
@@ -0,0 +1,87 @@
+cmake_minimum_required(VERSION 2.6)
+SET(NEMESIS_VERSION_MAJOR "5")
+SET(NEMESIS_VERSION_MINOR "15")
+SET(NEMESIS_VERSION_PATCH "0")
+SET(NEMESIS_VERSION "${NEMESIS_VERSION_MAJOR}.${NEMESIS_VERSION_MINOR}")
+SET(NEMESIS_VERSION_FULL "${NEMESIS_VERSION}.${NEMESIS_VERSION_PATCH}")
+
+SET(NEMESIS_BUILD_SHARED_LIBS "${BUILD_SHARED_LIBS}")
+SET(HEADERS "ne_nemesisI.h")
+
+
+find_path( NETCDF_INCLUDE_DIR netcdf.h
+   $ENV{ACCESS}/inc
+   $ENV{NETCDF_DIR}/inc
+   $ENV{NETCDF_DIR}/include
+   $ENV{NETCDF_DIR}/libsrc
+   )   
+
+find_library( NETCDF_LIBRARY netcdf
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  )
+
+find_program (NETCDF_NCDUMP ncdump
+   $ENV{ACCESS}/bin
+   $ENV{NETCDF_DIR}/bin
+   $ENV{NETCDF_DIR}/ncdump
+   )
+
+find_library( EXODUS_LIBRARY exodus
+  ../exodusii/cbind/
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  )
+
+# Hack for HDF5
+find_library( HDF5_LIBRARY hdf5
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  /usr/local/hdf5/lib
+  )
+
+find_library( HDF5HL_LIBRARY hdf5_hl
+  $ENV{ACCESS}/lib/shared
+  $ENV{ACCESS}/lib
+  $ENV{NETCDF_DIR}/lib
+  $ENV{NETCDF_DIR}/libsrc/.libs
+  /usr/local/hdf5/lib
+  )
+
+find_library(Z_LIBRARY z
+  /usr/local/zlib/lib
+  )
+
+find_library(MATH_LIBRARY
+             NAMES m
+             PATHS /usr/lib64
+                   /usr/lib
+)
+
+INCLUDE_DIRECTORIES(
+  "${CMAKE_CURRENT_SOURCE_DIR}"
+  "${CMAKE_CURRENT_BINARY_DIR}"
+  "${CMAKE_CURRENT_SOURCE_DIR}/../exodusii/cbind/include/"
+  "${CMAKE_CURRENT_BINARY_DIR}/../exodusii/cbind/include/"
+  "${NETCDF_INCLUDE_DIR}")
+
+SET(SOURCES
+nemesis_wrapper.c
+)
+
+ADD_LIBRARY(nemesis ${SOURCES})
+TARGET_LINK_LIBRARIES(nemesis ${EXODUS_LIBRARY} ${NETCDF_LIBRARY} ${HDF5HL_LIBRARY} ${HDF5_LIBRARY} ${Z_LIBRARY} ${MATH_LIBRARY})
+
+ADD_EXECUTABLE(ne_test ne_ctest_wrap.c)
+TARGET_LINK_LIBRARIES( ne_test nemesis ${EXODUS_LIBRARY} ${NETCDF_LIBRARY} ${HDF5HL_LIBRARY} ${HDF5_LIBRARY} ${Z_LIBRARY} ${MATH_LIBRARY})
+ 
+INSTALL(TARGETS nemesis
+  RUNTIME DESTINATION lib COMPONENT Runtime
+  LIBRARY DESTINATION lib COMPONENT Runtime
+  ARCHIVE DESTINATION lib COMPONENT Development)
+INSTALL(FILES ${HEADERS} DESTINATION include COMPONENT Development)
+
diff --git a/nemesis/COPYRIGHT b/nemesis/COPYRIGHT
new file mode 100644
index 0000000..07f206f
--- /dev/null
+++ b/nemesis/COPYRIGHT
@@ -0,0 +1,32 @@
+Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+retains certain rights in this software.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.  
+
+    * Neither the name of Sandia Corporation nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/nemesis/Imakefile b/nemesis/Imakefile
new file mode 100644
index 0000000..6435610
--- /dev/null
+++ b/nemesis/Imakefile
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+XCOMM $Id: Imakefile,v 1.15 2008/01/24 19:43:41 gdsjaar Exp $
+XCOMM Imakefile for Nemesis libraries
+/* Building Nemesis libraries for installation
+ * % accmkmf
+ * % make Makefiles
+ * % make all
+ * % make install
+ *
+ * Building Nemesis libraries for debugging
+ * % accmkmf
+ * % make Makefiles
+ * % make DEBUG=-g
+ *
+ */
+
+#define IHaveSubdirs
+
+#define PassDebugFlags	"DEBUG=$(DEBUG)" \
+	                "CDEBUGFLAGS=$(CDEBUGFLAGS)" \
+	                "CXXDEBUGFLAGS=$(CXXDEBUGFLAGS)" \
+			"F90DEBUGFLAGS=$(F90DEBUGFLAGS)" \
+			"F77DEBUGFLAGS=$(F77DEBUGFLAGS)"
+
+#define ExtraOptions "CCOPTIONS=$(CCOPTIONS)"
+
+#ifndef BuildSharedExodusLibrary
+#define BuildSharedExodusLibrary NO
+#endif
+
+#define DoNormalLib YES
+#define DoSharedLib BuildSharedExodusLibrary
+#define LibName nemesis
+SOREV = 4
+#define SoRev SOREV
+
+#ifdef PARALLEL
+CCOPTIONS  = ParallelCCOptions
+F77OPTIONS = ParallelF77Options
+LIBDIR     = $(PLIBDIR)
+#endif
+
+DEFINES = $(PICFLAGS)
+SUBDIRS = forbind
+
+INCLIST = ne_nemesisI.h ne_nemesisI_int.h
+
+SRCS = 	nemesis_wrapper.c
+
+OBJS = ${SRCS:.c=.o}
+
+REQUIREDLIBS = -L$(SHLIBDIR) $(EXOIIV2C) $(NETCDF) 
+LIBS = $(NETCDF) $(EXOIIV2C)
+
+#include <Library.tmpl>
+
+#if Build64BitAccess == YES
+AllTarget(libnemesis.a libnemIf.a libnemIf32.a)
+#else
+AllTarget(libnemesis.a libnemIf.a)
+#endif
+
+InstallIncludeList(makeincludes,$(INCLIST),$(INCDIR))
+InstallIncludeList(install,$(INCLIST),$(INCDIR))
+
+/* Directory for nemesis c library */
+NormalLibraryTarget(nemesis,$(OBJS))
+
+/* Directory for nemesis fortran wrappers */
+NamedTargetSubdirs(libnemIf.a,forbind,"making nemIf ",PassDebugFlags ExtraOptions,libnemIf.a)
+
+#if Build64BitAccess == YES
+NamedTargetSubdirs(libnemIf32.a,forbind,"making nemIf32 ",PassDebugFlags ExtraOptions,libnemIf32.a)
+#endif
+
+InstallLibrary(nemesis,$(LIBDIR))
+InstallLibraryAlias(nemesis,nemIc,$(LIBDIR))
+InstallLibrary(nemIf,$(LIBDIR))
+
+#if Build64BitAccess == YES
+InstallLibrary(nemIf32,$(LIBDIR))
+#endif
+
+#if Parallel
+InstallParallelLibrary(nemesis,$(PLIBDIR))
+InstallParallelLibrary(nemIf,$(PLIBDIR))
+
+#if Build64BitAccess == YES
+InstallParallelLibrary(nemIf32,$(PLIBDIR))
+#endif
+
+#endif
+
+
+CTESTLIBS = $(EXOIIV2C) $(NETCDF) -lm
+FTESTLIBS = $(EXOIIV2FOR) $(EXOIIV2C) $(NETCDF) -lm
+
+test: libnemesis.a libnemIf.a ne_ctest_wrap.c forbind/ne_ftest.F
+	$(CC) -c $(CFLAGS) ne_ctest_wrap.c
+	$(CC) $(LDOPTIONS) -o ne_ctest_wrap ne_ctest_wrap.o libnemesis.a $(LIBPATH) $(CTESTLIBS)
+	$(FC) -c $(FFLAGS) $(STD_DEFINES) -I./forbind forbind/ne_ftest.F
+	$(FC) $(LDOPTIONS) -o ne_ftest ne_ftest.o libnemIf.a $(LIBPATH) $(FTESTLIBS)
+
+ExtraStuffToClean(ne_ctest_wrap ne_ftest ne_test.exoII  ne_test.nemI)
+
+$(OBJS): ne_nemesisI.h
+
+DependTarget()
+LibraryObjectRule()
diff --git a/nemesis/Makefile.standalone b/nemesis/Makefile.standalone
new file mode 100644
index 0000000..3e44075
--- /dev/null
+++ b/nemesis/Makefile.standalone
@@ -0,0 +1,247 @@
+# Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+#========================================================================
+# A platform must define:
+#
+# BITS either 32 or 64 depending on a 32-bit or 64-bit build
+# CC == the C compiler
+# FC == the Fortran compiler
+# CCOPTIONS == non-optimization related flags for C compiling on this platform
+# F77OPTIONS == non-optimization related flags for Fortran compiling on this platform
+# OS_TYPE == See listing in forbind/src/Imakefile
+# RANLIB == ranlib or 'true' if no ranlib
+# AR == command to build an archive library.
+#
+#========================================================================
+
+SYSTEM := $(shell uname)
+
+#========================================================================
+#       Linux
+#========================================================================
+ifeq ($(SYSTEM),Linux)
+BITS = 32
+RANLIB = ranlib
+OS_TYPE = linux
+
+AR        = ar -rcv
+
+ifeq ($(COMPILER),Portland)
+CC       = pgcc
+FC       = pgf77
+CCOPTIONS  = -Mframe
+F77OPTIONS = -fast
+endif
+
+ifeq ($(COMPILER),Intel)
+CC       = icc
+CCOPTIONS  = -Xc 
+endif
+
+ifeq ($(COMPILER),GNU)
+CC	= gcc
+FC      = g77
+CCOPTIONS  = -O2 -Wall -Wno-deprecated
+F77OPTIONS = -O2
+endif
+
+endif
+
+#========================================================================
+#       SUN
+#========================================================================
+ifeq ($(SYSTEM),SunOS)
+RANLIB = ranlib
+OS_TYPE = sunos
+
+AR        = CC -xar -o
+
+ifeq ($(COMPILER),GNU)
+BITS    = 32
+CC	= gcc
+FC      = g77
+CCOPTIONS = -Wall
+else
+BITS      = 32
+CC        = cc
+FC        = f77
+CCOPTIONS  = -xtarget=ultra2 -xarch=v9 -g -ftrap=common -Xc
+F77OPTIONS = -xtarget=ultra2 -xarch=v9 -g -ftrap=common -errtags=INVOKE -C 
+endif
+endif
+
+#========================================================================
+#       SGI
+#========================================================================
+ifeq ($(SYSTEM),IRIX64)
+
+DO32=FALSE
+
+RANLIB = true
+OS_TYPE = irix
+AR        = ar -rcv 
+CC        = cc
+FC        = f77
+
+ifeq ($(DO32),TRUE)
+BITS = 32
+CCOPTIONS  = -n32 -LANG:std 
+F77OPTIONS = -n32
+F77PREC    =  
+
+else
+BITS = 64
+CCOPTIONS  = -64 -LANG:std 
+F77OPTIONS = -64
+F77PREC    =  -DBuild64 -r8 -i8
+endif
+endif
+
+#========================================================================
+#       IBM
+#========================================================================
+ifeq ($(SYSTEM),AIX)
+BITS = 64
+RANLIB = ranlib
+OS_TYPE = aix
+
+AR        = ar -rcv -X64
+CC        = xlc
+FC        = xlf
+CCOPTIONS  = -q64 -w 
+F77OPTIONS = -q64 -w 
+F77PREC = -WF,-DBuild64 -qintsize=8 -qrealsize=8
+SYSLIB	  = -lm
+endif
+
+#========================================================================
+
+#========================================================================
+#       TFLOP
+#========================================================================
+ifeq ($(SYSTEM),TFLOP)
+BITS = 32
+RANLIB = ranlib
+OS_TYPE = osf
+
+AR        = xar -rcv 
+CC        = icc
+FC        = if77
+CCOPTIONS  = -DPUMAGON -cougar
+F77OPTIONS = -cougar
+endif
+
+#========================================================================
+
+#========================================================================
+#       OSF (DEC Alpha)
+#========================================================================
+ifeq ($(SYSTEM),OSF1)
+BITS = 32
+RANLIB = ranlib
+OS_TYPE = osf
+
+AR        = ar -crsv
+CC        = cc
+FC        = f77
+CCOPTIONS  = -std strict_ansi -ptr $(shell pwd)/OSF1/cxx_repository -noimplicit_include -ttimestamp 
+endif
+#========================================================================
+
+OPTIMIZE_FLAG = -O
+STD_DEFINES = -DVERBOSE
+
+CFLAGS = $(OPTIMIZE_FLAG) $(CCOPTIONS) $(STD_DEFINES) $(EXODUS_INC) $(NETCDF_INC)
+FFLAGS = $(OPTIMIZE_FLAG) $(F77OPTIONS) $(F77PREC) $(EXODUS_INC)
+
+NETCDF_INC = -I$(ACCESS)/inc
+EXODUS_INC = -I$(ACCESS)/inc
+
+NETCDF_LIB_DIR = ${ACCESS}/lib
+NETCDF_LIB = -L$(NETCDF_LIB_DIR) -lnetcdf
+
+EXODUS_LIB_DIR = ${ACCESS}/lib
+EXODUS_LIB = -L$(EXODUS_LIB_DIR) -lexodus
+EXODUS_FLIB = -L$(EXODUS_LIB_DIR) -lexoIIv2for
+
+EXT_LIBS = $(EXODUS_LIB) $(NETCDF_LIB)
+EXT_FLIBS = $(EXODUS_FLIB)
+
+SUBDIRS = forbind
+
+SRCS = nemesis_wrapper.c
+
+OBJS = ${SRCS:.c=.o}
+
+all:: libnemesis.a libnemIf.a 
+
+libnemesis.a: $(OBJS)
+	$(AR) $@ $?
+	$(RANLIB) $@
+
+libnemIf.a:
+	(cd forbind &&  $(MAKE) $(MFLAGS) -f Makefile.standalone "BITS=$(BITS)" "AR=$(AR)"  "CC=$(CC)" "CFLAGS=$(CFLAGS)" "FC=$(FC)" "FFLAGS=$(FFLAGS)" "RANLIB=$(RANLIB)" "SYSTEM=$(SYSTEM)" "OS_TYPE=$(OS_TYPE)" libnemIf.a)
+	cp forbind/libnemIf.a .
+
+check: test
+test:: ne_test.c libnemesis.a 
+	$(CC) -c $(CFLAGS) ne_test.c
+	$(CC) $(CFLAGS) -o ne_ctest ne_test.o libnemesis.a $(EXT_LIBS) -lm
+	./ne_ctest
+
+test:: forbind/ne_test.f libnemIf.a
+	$(FC) -c $(FFLAGS) -I./forbind forbind/ne_test.f
+	$(FC) $(FFLAGS) -o ne_ftest ne_test.o libnemIf.a libnemesis.a $(EXT_FLIBS) $(EXT_LIBS) -lm
+	./ne_ftest
+
+clean::
+	rm -f *.CKP *.ln *.BAK *.bak *.o *.M *.mod core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut   "#"*
+
+clean::
+	rm -f ne_ctest ne_ftest ne_test.exoII  ne_test.nemI
+
+clean::
+	@for flag in $(MAKEFLAGS) ''; do \
+	case "$$flag" in *=*) ;; *[ik]*) set +e;; esac; done; \
+	for i in $(SUBDIRS) ;\
+	do \
+	if test -d $$i; then \
+	echo "cleaning" "in $(CURRENT_DIR)/$$i..."; \
+	(cd $$i &&  $(MAKE) -f Makefile.standalone $(MFLAGS) 	 clean); \
+	fi; \
+	done
+
+.SUFFIXES: .c
+.c.o:
+	$(CC) -c -I. $(CFLAGS) $*.c
diff --git a/nemesis/README b/nemesis/README
new file mode 100644
index 0000000..31029c8
--- /dev/null
+++ b/nemesis/README
@@ -0,0 +1,27 @@
+The Nemesis library is licensed under the terms of the BSD License.
+
+Legal stuff (copyright, licensing restrictions, etc.) can be found in
+the file COPYRIGHT which contains:
+
+1. The Sandia Corporation Copyright Notice.
+2. The BSD License text.
+
+We appreciate feedback from users of this package.  Please send
+comments, suggestions, and bug reports to Greg Sjaardema <gdsjaar at sandia.gov>.
+Please identify the version of the package.
+
+========================================================================
+
+NEMESIS is an enhancement to the EXODUSII finite element database
+model used to store and retrieve data for unstructured parallel finite
+element analyses. NEMESIS adds data structures which facilitate the
+partitioning of a scalar (standard serial) EXODUSII file onto parallel
+disk systems found on many parallel computers. Since the NEMESIS
+application programming interface (API) can be used to append
+information to an existing EXODUSII database, any existing software
+that reads EXODUSII files can be used on files which contain NEMESIS
+information. The NEMESIS information is written and read via C or C++
+callable functions which compromise the NEMESIS I API.
+
+The exodusII package is available at http://sourceforge.net/projects/exodusii
+
diff --git a/nemesis/forbind/Imakefile b/nemesis/forbind/Imakefile
new file mode 100644
index 0000000..61662ae
--- /dev/null
+++ b/nemesis/forbind/Imakefile
@@ -0,0 +1,73 @@
+# Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+/* Use local include/XXX.h files instead of installed *.h files  */
+ALTINC = IncRef-I../
+
+F77CPPFLAGS = F77CppFlags 
+
+SRCS = ne_jack.c
+SRCSF = addrwrpn.F
+
+OBJS = ${SRCS:.c=.o} ${SRCSF:.F=.o}
+LibraryTargetSubdirsCopy(libnemIf.a,$(OBJS),../)
+CleanupCapF(addrwrpn.f)
+
+#if Build64BitAccess == YES     
+/* Need to compile ne_jack.c without the -DBuild64 option
+ * real* -> float* (actually void* since it handles both float* and double*)
+ */
+ne_jack32.o: ne_jack.c
+	$(CC) -o ne_jack32.o -c $(CFLAGS) -DDEFAULT_REAL_INT ne_jack.c
+
+all:: libnemIf32.a
+libnemIf32.a: ne_jack32.o
+	$(AR) $@ $?
+	$(_NULLCMD_)
+	$(_NULLCMD_)
+	$(CP) $@ ../
+#endif
+
+/*
+ * 32-bit build:
+ *   Compile ne_jack.c and put in libexoIIv2for.a archive.
+ *
+ * 64-bit build: (using 8-byte integer/real)
+ *   Compile addrwrap.F                (contains main api name 'func'; calls 'func4' name)
+ *   Compile ne_jack.c with -DBuild64 (adds 4_ to function names)
+ *   -- put above two object files into libnemIf.a
+ *
+ */
+
+DependTarget()
+
diff --git a/nemesis/forbind/Makefile.standalone b/nemesis/forbind/Makefile.standalone
new file mode 100644
index 0000000..952438b
--- /dev/null
+++ b/nemesis/forbind/Makefile.standalone
@@ -0,0 +1,68 @@
+# Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+# retains certain rights in this software.
+# 
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+# 
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+# 
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.  
+# 
+#     * Neither the name of Sandia Corporation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+# 
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# 
+
+INCLUDES = -I..
+F77EXTRAOPTIONS = -I..
+
+SRCS = ne_jack.c
+
+SRCSF = addrwrpn.F
+
+OBJS = ${SRCS:.c=.o} ${SRCSF:.F=.o}
+
+ne_jack.c: ne_jack.src fortc1.sed fortc2.sed common.m4 $(OS_TYPE).m4
+	   ./fortc -P $(BITS) -L . -O $(OS_TYPE) ne_jack.src > $@
+
+all:: libnemIf.a
+libnemIf.a: $(OBJS)
+	$(AR) $@ $?
+	$(RANLIB) $@
+	cp libnemIf.a ..
+
+clean::
+	rm -f *.c addrwrpn.f
+
+clean::
+	rm -f *.CKP *.ln *.BAK *.bak *.o *.M *.mod core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut   "#"*
+
+.SUFFIXES: .c .F .f
+.c.o:
+	$(CC) -c -I.. $(CFLAGS) $*.c
+.f.o:
+	$(FC) -c $(FFLAGS) $*.f
+.F.o:
+	$(FC) -c -I.. $(DEFINES) $(FFLAGS) $*.F
+
+# ----------------------------------------------------------------------
+# dependencies generated by makedepend or sfmakedepend
+
diff --git a/nemesis/forbind/addrwrpn.F b/nemesis/forbind/addrwrpn.F
new file mode 100644
index 0000000..ed6dddc
--- /dev/null
+++ b/nemesis/forbind/addrwrpn.F
@@ -0,0 +1,1211 @@
+C Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+C retains certain rights in this software.
+C 
+C Redistribution and use in source and binary forms, with or without
+C modification, are permitted provided that the following conditions are
+C met:
+C 
+C     * Redistributions of source code must retain the above copyright
+C       notice, this list of conditions and the following disclaimer.
+C 
+C     * Redistributions in binary form must reproduce the above
+C       copyright notice, this list of conditions and the following
+C       disclaimer in the documentation and/or other materials provided
+C       with the distribution.  
+C 
+C     * Neither the name of Sandia Corporation nor the names of its
+C       contributors may be used to endorse or promote products derived
+C       from this software without specific prior written permission.
+C 
+C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C 
+
+      subroutine adrdumn
+      end
+      
+#ifdef Build64  
+C-----------------------------------------------------------------------
+C
+C   Get initial information from nemesis file
+C
+      subroutine negii (idne, nproc, nproc_in_f, ftype, ierr)
+      implicit none
+      integer idne 
+      integer nproc 
+      integer nproc_in_f 
+      character*(*) ftype 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 nproc4 
+      integer*4 nproc_in_f4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negii4 (idne4, nproc4, nproc_in_f4, ftype, ierr4)
+      nproc = nproc4
+      nproc_in_f = nproc_in_f4
+      ierr = ierr4
+C       
+      end
+      
+C-----------------------------------------------------------------------
+C
+C   Write initial information from nemesis file
+C
+      subroutine nepii (idne, nproc, nproc_in_f, ftype, ierr)
+      implicit none
+      integer idne 
+      integer nproc 
+      integer nproc_in_f 
+      character*(*) ftype 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 nproc4 
+      integer*4 nproc_in_f4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      nproc4 = nproc
+      nproc_in_f4 = nproc_in_f
+      call nepii4 (idne4, nproc4, nproc_in_f4, ftype, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read initial global information
+C
+      subroutine negig (idne, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr)
+      implicit none
+      integer idne 
+      integer nnodes_g 
+      integer nelems_g 
+      integer nelem_blks_g 
+      integer nnode_sets_g 
+      integer nside_sets_g 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negig4 (idne4, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write initial global information
+C
+      subroutine nepig (idne, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr)
+      implicit none
+      integer idne 
+      integer nnodes_g 
+      integer nelems_g 
+      integer nelem_blks_g 
+      integer nnode_sets_g 
+      integer nside_sets_g 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepig4 (idne4, nnodes_g, nelems_g, nelem_blks_g,
+     $  nnode_sets_g, nside_sets_g, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read load balance parameters
+C
+      subroutine neglbp (idne, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor, ierr)
+      implicit none
+      integer idne 
+      integer nint_nodes 
+      integer nbor_nodes 
+      integer next_nodes 
+      integer nint_elems 
+      integer nbor_elems 
+      integer nnode_cmaps 
+      integer nelem_cmaps 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call neglbp4 (idne4, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write load balance parameters
+C
+      subroutine neplbp (idne, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor, ierr)
+      implicit none
+      integer idne 
+      integer nint_nodes 
+      integer nbor_nodes 
+      integer next_nodes 
+      integer nint_elems 
+      integer nbor_elems 
+      integer nnode_cmaps 
+      integer nelem_cmaps 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call neplbp4 (idne4, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write concatenated load balance parameters
+C
+      subroutine neplbpc (idne, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps, ierr)
+      implicit none
+      integer idne 
+      integer nint_nodes(*) 
+      integer nbor_nodes(*) 
+      integer next_nodes(*) 
+      integer nint_elems(*) 
+      integer nbor_elems(*) 
+      integer nnode_cmaps(*) 
+      integer nelem_cmaps(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call neplbpc4 (idne4, nint_nodes, nbor_nodes, next_nodes,
+     $  nint_elems, nbor_elems, nnode_cmaps, nelem_cmaps,
+     $  ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read global node set parameters
+C
+      subroutine negnspg (idne, ns_ids_glob, ns_n_cnt_glob,
+     $  ns_df_cnt_glob, ierr)
+      implicit none
+      integer idne 
+      integer ns_ids_glob(*) 
+      integer ns_n_cnt_glob(*) 
+      integer ns_df_cnt_glob(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnspg4 (idne4, ns_ids_glob, ns_n_cnt_glob,
+     $  ns_df_cnt_glob, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write global node set parameters
+C
+      subroutine nepnspg (idne, global_ids, global_n_cnts,
+     $  global_df_cnts, ierr)
+      integer idne 
+      integer global_ids(*) 
+      integer global_n_cnts(*) 
+      integer global_df_cnts(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnspg4 (idne4, global_ids, global_n_cnts,
+     $  global_df_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read global side set parameters
+C
+      subroutine negsspg (idne, ss_ids_glob, ss_n_cnt_glob,
+     $  ss_df_cnt_glob, ierr)
+      implicit none
+      integer idne 
+      integer ss_ids_glob(*) 
+      integer ss_n_cnt_glob(*) 
+      integer ss_df_cnt_glob(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negsspg4 (idne4, ss_ids_glob, ss_n_cnt_glob,
+     $  ss_df_cnt_glob, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write global side set parameters
+C
+      subroutine nepsspg (idne, global_ids, global_el_cnts,
+     $  global_df_cnts, ierr)
+      implicit none
+      integer idne 
+      integer global_ids(*) 
+      integer global_el_cnts(*) 
+      integer global_df_cnts(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepsspg4 (idne4, global_ids, global_el_cnts,
+     $  global_df_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read global element block information
+C
+      subroutine negebig (idne, el_blk_ids, el_blk_cnts, ierr)
+      implicit none
+      integer idne 
+      integer el_blk_ids(*) 
+      integer el_blk_cnts(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negebig4 (idne4, el_blk_ids, el_blk_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write global element block information
+C
+      subroutine nepebig (idne, el_blk_ids, el_blk_cnts, ierr)
+      implicit none
+      integer idne 
+      integer el_blk_ids(*) 
+      integer el_blk_cnts(*) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepebig4 (idne4, el_blk_ids, el_blk_cnts, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read side set element list and side set side list
+C
+      subroutine negnss (idne, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr)
+      implicit none
+      integer idne 
+      integer ss_id 
+      integer start_side_num 
+      integer num_sides 
+      integer ss_elem_list(num_sides) 
+      integer ss_side_list(num_sides) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnss4 (idne4, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write side set element list and side set side list
+C
+      subroutine nepnss (idne, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr)
+      implicit none
+      integer idne 
+      integer ss_id 
+      integer start_side_num 
+      integer num_sides 
+      integer ss_elem_list(num_sides) 
+      integer ss_side_list(num_sides) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnss4 (idne4, ss_id, start_side_num, num_sides,
+     $  ss_elem_list, ss_side_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read side set distribution factor
+C
+      subroutine negnssd (idne, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr)
+      implicit none
+      integer idne 
+      integer ss_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ss_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnssd4 (idne4, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write side set distribution factor
+C
+      subroutine nepnssd (idne, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr)
+      implicit none
+      integer idne 
+      integer ss_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ss_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnssd4 (idne4, ss_id, start_num, num_df_to_get,
+     $  ss_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read node set list for a single node set
+C
+      subroutine negnns (idne, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr)
+      implicit none
+      integer idne 
+      integer ns_id 
+      integer start_node_num 
+      integer num_node 
+      integer ns_node_list(num_node) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnns4 (idne4, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write node set list for a single node set
+C
+      subroutine nepnns (idne, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr)
+      implicit none
+      integer idne 
+      integer ns_id 
+      integer start_node_num 
+      integer num_node 
+      integer ns_node_list(num_node) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnns4 (idne4, ns_id, start_node_num, num_node,
+     $  ns_node_list, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read node set distribution factor
+C
+      subroutine negnnsd (idne, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr)
+      implicit none
+      integer idne 
+      integer ns_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ns_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnnsd4 (idne4, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write node set distribution factor
+C
+      subroutine nepnnsd (idne, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr)
+      implicit none
+      integer idne 
+      integer ns_id 
+      integer start_num 
+      integer num_df_to_get 
+      real ns_df(num_df_to_get) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnnsd4 (idne4, ns_id, start_num, num_df_to_get,
+     $  ns_df, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read coordinates of the nodes
+C
+      subroutine negcor (idne, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr)
+      implicit none
+      integer idne 
+      integer start_node_num 
+      integer num_nodes 
+      real x_coor(num_nodes) 
+      real y_coor(num_nodes) 
+      real z_coor(num_nodes) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negcor4 (idne4, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write coordinates of the nodes
+C
+      subroutine nepcor (idne, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr)
+      implicit none
+      integer idne 
+      integer start_node_num 
+      integer num_nodes 
+      real x_coor(num_nodes) 
+      real y_coor(num_nodes) 
+      real z_coor(num_nodes) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepcor4 (idne4, start_node_num, num_nodes, x_coor,
+     $  y_coor, z_coor, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read an element blocks connectivity list
+C
+      subroutine negnec (idne, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr)
+      implicit none
+      integer idne 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      integer connect(num_elems) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnec4 (idne4, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write an element blocks connectivity list
+C
+      subroutine nepnec (idne, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr)
+      implicit none
+      integer idne 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      integer connect(num_elems) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnec4 (idne4, elem_blk_id, start_elem_num,
+     $  num_elems, connect, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read an element blocks attributes
+C
+      subroutine negneat (idne, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr)
+      implicit none
+      integer idne 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      real attrib(num_elems) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negneat4 (idne4, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write an element blocks attributes
+C
+      subroutine nepneat (idne, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr)
+      implicit none
+      integer idne 
+      integer elem_blk_id 
+      integer start_elem_num 
+      integer num_elems 
+      real attrib(num_elems) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepneat4 (idne4, elem_blk_id, start_elem_num,
+     $  num_elems, attrib, ierr4)
+      ierr = ierr4
+C
+      end
+C
+C-----------------------------------------------------------------------
+C  Read the element type for a specific element block
+C
+      subroutine negelt (idne, elem_blk_id, elem_type, ierr)
+      implicit none
+      integer idne 
+      integer elem_blk_id 
+      character*(*) elem_type 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negelt4 (idne4, elem_blk_id, elem_type, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read a variable for an element block
+C
+      subroutine negnev (idne, time_step, elem_var_index,
+     $  elem_blk_id, num_elem_this_blk, start_elem_num,
+     $  num_elem, elem_var_vals, ierr)
+      implicit none
+      integer idne 
+      integer time_step 
+      integer elem_var_index 
+      integer elem_blk_id 
+      integer num_elem_this_blk 
+      integer start_elem_num 
+      integer num_elem 
+      real elem_var_vals(num_elem) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 time_step4 
+      integer*4 elem_var_index4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      time_step4 = time_step
+      elem_var_index4 = elem_var_index
+      call negnev4 (idne4, time_step4, elem_var_index4,
+     $  elem_blk_id, num_elem_this_blk, start_elem_num,
+     $  num_elem, elem_var_vals, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write a variable slab for an element block
+C
+      subroutine nepevs (idne, time_step, elem_var_index,
+     $  elem_blk_id, start_pos, num_vals, elem_var_vals,
+     $  ierr)
+      implicit none
+      integer idne 
+      integer time_step 
+      integer elem_var_index 
+      integer elem_blk_id 
+      integer start_pos 
+      integer num_vals 
+      real elem_var_vals(num_vals) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 time_step4 
+      integer*4 elem_var_index4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      time_step4 = time_step
+      elem_var_index4 = elem_var_index
+      call nepevs4 (idne4, time_step4, elem_var_index4,
+     $  elem_blk_id, start_pos, num_vals, elem_var_vals,
+     $  ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the values of a single nodal variable for a single time step
+C
+      subroutine negnnv (idne, time_step, nodal_var_index,
+     $  start_node_num, num_nodes, nodal_vars, ierr)
+      implicit none
+      integer idne 
+      integer time_step 
+      integer nodal_var_index 
+      integer start_node_num 
+      integer num_nodes 
+      real nodal_vars(num_nodes) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 time_step4 
+      integer*4 nodal_var_index4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      time_step4 = time_step
+      nodal_var_index4 = nodal_var_index
+      call negnnv4 (idne4, time_step4, nodal_var_index4,
+     $  start_node_num, num_nodes, nodal_vars, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write nodal variable slab
+C
+      subroutine nepnvs (idne, time_step, nodal_var_index,
+     $  start_pos, num_vals, nodal_var_vals, ierr)
+      implicit none
+      integer idne 
+      integer time_step 
+      integer nodal_var_index 
+      integer start_pos 
+      integer num_vals 
+      real nodal_var_vals(num_vals) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 time_step4 
+      integer*4 nodal_var_index4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      time_step4 = time_step
+      nodal_var_index4 = nodal_var_index
+      call nepnvs4 (idne4, time_step4, nodal_var_index4,
+     $  start_pos, num_vals, nodal_var_vals, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the element numbering map
+C
+      subroutine negnenm (idne, starte, num_ent, elem_map, ierr)
+      implicit none
+      integer idne 
+      integer starte 
+      integer num_ent 
+      integer elem_map(num_ent) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnenm4 (idne4, starte, num_ent, elem_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the element numbering map
+C
+      subroutine nepnenm (idne, starte, num_ent, elem_map, ierr)
+      implicit none
+      integer idne 
+      integer starte 
+      integer num_ent 
+      integer elem_map(num_ent) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnenm4 (idne4, starte, num_ent, elem_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the node numbering map
+C
+      subroutine negnnnm (idne, startn, num_ent, node_map, ierr)
+      implicit none
+      integer idne 
+      integer startn 
+      integer num_ent 
+      integer node_map(num_ent) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call negnnnm4 (idne4, startn, num_ent, node_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the node numbering map
+C
+      subroutine nepnnnm (idne, startn, num_ent, node_map, ierr)
+      implicit none
+      integer idne 
+      integer startn 
+      integer num_ent 
+      integer node_map(num_ent) 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepnnnm4 (idne4, startn, num_ent, node_map, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the node map for a processor
+C
+      subroutine negnm (idne, node_mapi, node_mapb, node_mape,
+     $  processor, ierr)
+      implicit none
+      integer idne 
+      integer node_mapi(*) 
+      integer node_mapb(*) 
+      integer node_mape(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call negnm4 (idne4, node_mapi, node_mapb, node_mape,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write a node map for a processor
+C
+      subroutine nepnm (idne, node_mapi, node_mapb, node_mape,
+     $  processor, ierr)
+      implicit none
+      integer idne 
+      integer node_mapi(*) 
+      integer node_mapb(*) 
+      integer node_mape(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call nepnm4 (idne4, node_mapi, node_mapb, node_mape,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the element map for a processor
+C
+      subroutine negem (idne, elem_mapi, elem_mapb, processor, ierr)
+      implicit none
+      integer idne 
+      integer elem_mapi(*) 
+      integer elem_mapb(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call negem4 (idne4, elem_mapi, elem_mapb, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the element map for a processor
+C
+      subroutine nepem (idne, elem_mapi, elem_mapb, processor, ierr)
+      implicit none
+      integer idne 
+      integer elem_mapi(*) 
+      integer elem_mapb(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call nepem4 (idne4, elem_mapi, elem_mapb, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the communications map parameters for a single processor
+C
+      subroutine negcmp (idne, ncmap_ids, ncmap_node_cnts,
+     $  ecmap_ids, ecmap_elem_cnts, processor, ierr)
+      implicit none
+      integer idne 
+      integer ncmap_ids(*) 
+      integer ncmap_node_cnts(*) 
+      integer ecmap_ids(*) 
+      integer ecmap_elem_cnts(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call negcmp4 (idne4, ncmap_ids, ncmap_node_cnts,
+     $  ecmap_ids, ecmap_elem_cnts, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the communications map parameters for a single processor
+C
+      subroutine nepcmp (idne, nmap_ids, nmap_node_cnts, emap_ids,
+     $  emap_elem_cnts, processor, ierr)
+      implicit none
+      integer idne 
+      integer nmap_ids(*) 
+      integer nmap_node_cnts(*) 
+      integer emap_ids(*) 
+      integer emap_elem_cnts(*) 
+      integer processor 
+      integer ierr
+
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call nepcmp4 (idne4, nmap_ids, nmap_node_cnts, emap_ids,
+     $  emap_elem_cnts, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the communications map parameters for all processors
+C
+      subroutine nepcmpc (idne, nmap_ids, nmap_node_cnts,
+     $  nproc_ptrs, emap_ids, emap_elem_cnts, eproc_ptrs, ierr)
+      implicit none
+      integer idne 
+      integer nmap_ids(*) 
+      integer nmap_node_cnts(*) 
+      integer nproc_ptrs(*) 
+      integer emap_ids(*) 
+      integer emap_elem_cnts(*) 
+      integer eproc_ptrs(*) 
+      integer ierr
+      
+      integer*4 idne4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      call nepcmpc4 (idne4, nmap_ids, nmap_node_cnts,
+     $  nproc_ptrs, emap_ids, emap_elem_cnts, eproc_ptrs, ierr4)
+      ierr = ierr4
+      
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the nodal communications map for a single processor
+C
+      subroutine negncm (idne, map_id, node_ids, proc_ids,
+     $  processor, ierr)
+      implicit none
+      integer idne 
+      integer map_id 
+      integer node_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call negncm4 (idne4, map_id, node_ids, proc_ids,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the nodal communications map for a single processor
+C
+      subroutine nepncm (idne, map_id, node_ids, proc_ids,
+     $  processor, ierr)
+      implicit none
+      integer idne 
+      integer map_id 
+      integer node_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+C
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call nepncm4 (idne4, map_id, node_ids, proc_ids,
+     $  processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Read the elemental communications map for a single processor
+C
+      subroutine negecm (idne, map_id, elem_ids, side_ids,
+     $  proc_ids, processor, ierr)
+      implicit none
+      integer idne 
+      integer map_id 
+      integer elem_ids(*) 
+      integer side_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+C
+      idne4 = idne
+      processor4 = processor
+      call negecm4 (idne4, map_id, elem_ids, side_ids,
+     $  proc_ids, processor4, ierr4)
+      ierr = ierr4
+C
+      end
+      
+C-----------------------------------------------------------------------
+C
+C  Write the elemental communications map for a single processor
+C
+      subroutine nepecm (idne, map_id, elem_ids, side_ids,
+     $  proc_ids, processor, ierr)
+      implicit none
+      integer idne 
+      integer map_id 
+      integer elem_ids(*) 
+      integer side_ids(*) 
+      integer proc_ids(*) 
+      integer processor 
+      integer ierr
+
+      integer*4 idne4 
+      integer*4 processor4 
+      integer*4 ierr4
+
+      idne4 = idne
+      processor4 = processor
+      call nepecm4 (idne4, map_id, elem_ids, side_ids,
+     $  proc_ids, processor4, ierr4)
+      ierr = ierr4
+
+         end
+C-----------------------------------------------------------------------
+#endif 
diff --git a/nemesis/forbind/ne_ftest.F b/nemesis/forbind/ne_ftest.F
new file mode 100644
index 0000000..08c3330
--- /dev/null
+++ b/nemesis/forbind/ne_ftest.F
@@ -0,0 +1,928 @@
+C Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+C retains certain rights in this software.
+C 
+C Redistribution and use in source and binary forms, with or without
+C modification, are permitted provided that the following conditions are
+C met:
+C 
+C     * Redistributions of source code must retain the above copyright
+C       notice, this list of conditions and the following disclaimer.
+C 
+C     * Redistributions in binary form must reproduce the above
+C       copyright notice, this list of conditions and the following
+C       disclaimer in the documentation and/or other materials provided
+C       with the distribution.  
+C 
+C     * Neither the name of Sandia Corporation nor the names of its
+C       contributors may be used to endorse or promote products derived
+C       from this software without specific prior written permission.
+C 
+C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C 
+C=================================================================
+C
+C This is just a simple test program to test the fortran interface
+C for the NEMESIS I library.
+C
+C This file was created by translating ne_test.c into fortran.
+C
+C=================================================================
+
+C=================================================================
+      PROGRAM NETEST
+C=================================================================
+      INCLUDE 'exodusII.inc'
+      INCLUDE 'ne_test.inc'
+
+C local variables
+      INTEGER NEID, IO_WS, CPU_WS, T_PASS, T_FAIL, DBG_FLAG, IERR
+      CHARACTER FNAME*256, YO*6
+      REAL VERSION
+
+      YO = 'NETEST'
+      IO_WS = 0
+      CPU_WS = 0
+      T_PASS = 0
+      T_FAIL = 0
+      DBG_FLAG = 0
+
+C now let's get going...
+
+C I don't care about input arguements, so the file name will be ne_test.nemI
+      FNAME = 'ne_test.nemI'
+C and set the debug flag to 0
+      DBG_FLAG = 0
+
+      PRINT*, '******************Output Tests*****************'
+C create the exodus II file
+      PRINT*, 'creating ExodusII file...'
+      NEID = EXCRE(FNAME, EXCLOB, CPU_WS, IO_WS, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to create test file', FNAME, '!'
+        GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of initial information
+      PRINT*, 'testing init info output...'
+      CALL NEPII(NEID, NPROC, NPROCF, 'S', IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of initial global information
+      PRINT*, 'testing global init info output...'
+      CALL NEPIG(NEID, NNG, NEG, NEBG, NNSG, NSSG, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the global element block IDs
+      PRINT*, 'testing global element block ID output...'
+      CALL NETPEBI(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the global node-set info
+      PRINT*, 'testing global node-set params output...'
+      CALL NETPNSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the global side-set info
+      PRINT*, 'testing global side-set params output...'
+      CALL NETPSSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the concatenated load-balance parameters
+      PRINT*, 'testing concatenated load balance info output...'
+      CALL NETPLBPC(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the node map
+      PRINT*, 'testing node map output...'
+      CALL NETPNM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the element map
+      PRINT*, 'testing element map output...'
+      CALL NETPEM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test the output of the concatenated communication map params
+      PRINT*, 'testing concatenated communication map params output...'
+      CALL NETPCMPC(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+      
+C Test nodal communication map output
+      PRINT*, 'testing nodal communication map output...'
+      CALL NETPNCM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test elemental communication map output
+      PRINT*, 'testing elemental communication map output...'
+      CALL NETPECM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Close the ExodusII/Nemesis test file
+      PRINT*, 'closing ExodusII file...'
+      CALL EXCLOS(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to close test file', FNAME, '!'
+          GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C=================================================================
+C                       INPUT TEST SECTION
+C=================================================================
+
+      PRINT*, '******************Input Tests******************'
+
+C Re-open the ExodusII/NemesisI file 
+      PRINT*, 'reopening ExodusII file...'
+      NEID =  EXOPEN(FNAME, EXREAD, CPU_WS, IO_WS, VERSION, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to open test file', FNAME, '!'
+          GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of of the initial information
+      PRINT*, 'testing init info input...'
+      CALL NETGII(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of initial global information
+      PRINT*, 'testing global init info input...'
+      CALL NETGIG(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of global element block IDs
+      PRINT*, 'testing global element block IDs input...'
+      CALL NETGEBI(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of global node-set params
+      PRINT*, 'testing global node-set params input...'
+      CALL NETGNSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of global side-set params
+      PRINT*, 'testing global side-set params input...'
+      CALL NETGSSP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of load-balance params
+      PRINT*, 'testing load-balance params input...'
+      CALL NETGLBP(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of the node map
+      PRINT*, 'testing node map input...'
+      CALL NETGNM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of the element map
+      PRINT*, 'testing element map input...'
+      CALL NETGEM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of nodal communication maps
+      PRINT*, 'testing nodal communication map input...'
+      CALL NETGNCM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Test read of elemental communication maps
+      PRINT*, 'testing elemental communication map input...'
+      CALL NETGECM(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        IF (DBG_FLAG.EQ.1) THEN
+          GOTO 100
+        END IF
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+C Close the ExodusII/Nemesis test file
+      PRINT*, 'closing ExodusII file...'
+      CALL EXCLOS(NEID, IERR)
+      IF (IERR.NE.0) THEN
+        PRINT*, '...FAILED'
+        T_FAIL = T_FAIL + 1
+        PRINT*, YO, ': ERROR, unable to close test file', FNAME, '!'
+          GOTO 100
+      ELSE
+        PRINT*, '...successful'
+        T_PASS = T_PASS + 1
+      END IF
+
+      PRINT*, 'Tests Passed: ', T_PASS
+      PRINT*, 'Tests Failed: ', T_FAIL
+
+  100 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETPEBI(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER I, EBLK_IDS(NEBG)
+      INTEGER EBLK_CNTS(NEBG)
+
+      DO 110 I=1,NEBG
+        EBLK_IDS(I) = I
+        EBLK_CNTS(I) = 10
+  110 CONTINUE
+
+      CALL NEPEBIG(NEID, EBLK_IDS, EBLK_CNTS, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE NETPNSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER I, GLBL_IDS(NNSG), GLBL_NC(NNSG), GLBL_DFC(NNSG)
+
+      DO 120 I = 1,NNSG
+        GLBL_IDS(I) = 2 * I
+        GLBL_NC(I) = 3 * I
+        GLBL_DFC(I) = 1
+  120 CONTINUE
+
+      CALL NEPNSPG(NEID, GLBL_IDS, GLBL_NC, GLBL_DFC, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE NETPSSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER I, GLBL_IDS(NSSG), GLBL_ELC(NSSG), GLBL_DFC(NSSG)
+
+      DO 130 I = 1,NSSG
+        GLBL_IDS(I) = 3 * I
+        GLBL_ELC(I) = 2 * I
+        GLBL_DFC(I) = 1
+  130 CONTINUE
+
+      CALL NEPSSPG(NEID, GLBL_IDS, GLBL_ELC, GLBL_DFC, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE NETPLBPC(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, NUM_IN(NPROCF), NUM_BN(NPROCF), NUM_EN(NPROCF),
+     1 NUM_IE(NPROCF), NUM_BE(NPROCF), NUM_NCM(NPROCF), NUM_ECM(NPROCF)
+
+      DO 140 IPROC = 1,NPROCF
+        NUM_IN(IPROC) = NINTN
+        NUM_BN(IPROC) = NBORN
+        NUM_EN(IPROC) = NEXTN
+
+        NUM_IE(IPROC) = NINTE
+        NUM_BE(IPROC) = NBORE
+
+        NUM_NCM(IPROC) = NNCMAP
+        NUM_ECM(IPROC) = NECMAP
+  140 CONTINUE
+
+      CALL NEPLBPC(NEID, NUM_IN, NUM_BN, NUM_EN, NUM_IE, NUM_BE,
+     1 NUM_NCM, NUM_ECM, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE NETPNM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, J, NMAPI(NINTN), NMAPB(NBORN), NMAPE(NEXTN)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 J = 1,NINTN
+          NMAPI(J) = I
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORN
+          NMAPB(J) = I
+          I = I + 1
+  160   CONTINUE
+        DO 170 J = 1,NEXTN
+          NMAPE(J) = I
+          I = I + 1
+  170   CONTINUE
+
+        I = 0
+
+        CALL NEPNM(NEID, NMAPI, NMAPB, NMAPE, IPROC, IERR)
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETPEM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, J, EMAPI(NINTE), EMAPB(NBORE)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 J = 1,NINTE
+          EMAPI(J) = I
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORE
+          EMAPB(J) = I
+          I = I + 1
+  160   CONTINUE
+
+        I = 0
+
+        CALL NEPEM(NEID, EMAPI, EMAPB, IPROC, IERR)
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETPCMPC(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, NCNTR, ECNTR, NMAPIDS(NNCXNPF),
+     1 NMAPCNT(NNCXNPF), NMAPPROC(NPROCF+1), EMAPIDS(NECXNPF),
+     1 EMAPCNT(NECXNPF), EMAPPROC(NPROCF+1)
+
+      NMAPPROC(1) = 0
+      EMAPPROC(1) = 0
+      NCNTR = 1
+      ECNTR = 1
+      DO 200 IPROC = 1,NPROCF
+        DO 150 I = 1,NNCMAP
+          NMAPIDS(NCNTR) = I
+          NMAPCNT(NCNTR) = NCNTCM
+          NCNTR = NCNTR + 1
+  150   CONTINUE
+        DO 160 I = 1,NECMAP
+          EMAPIDS(ECNTR) = 2*I
+          EMAPCNT(ECNTR) = ECNTCM
+          ECNTR = ECNTR + 1
+  160   CONTINUE
+
+      NMAPPROC(IPROC+1) = NMAPPROC(IPROC) + NNCMAP
+      EMAPPROC(IPROC+1) = EMAPPROC(IPROC) + NECMAP
+
+  200 CONTINUE
+
+      CALL NEPCMPC(NEID, NMAPIDS, NMAPCNT, NMAPPROC, EMAPIDS, EMAPCNT, 
+     1 EMAPPROC, IERR)
+
+      END
+
+C=================================================================
+      SUBROUTINE NETPNCM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, NMAPIDS(NNCMAP), NIDS(NCNTCM), PIDS(NCNTCM)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 I = 1,NNCMAP
+          NMAPIDS(I) = I
+  150   CONTINUE
+        DO 160 I = 1,NCNTCM
+          NIDS(I) = 2*I
+          PIDS(I) = 3*I
+  160   CONTINUE
+
+        DO 170 I=1,NNCMAP
+          CALL NEPNCM(NEID, NMAPIDS(I), NIDS, PIDS, IPROC, IERR)
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETPECM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, EMAPIDS(NECMAP), EIDS(ECNTCM), PIDS(ECNTCM),
+     1 SIDS(ECNTCM)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        DO 150 I = 1,NECMAP
+          EMAPIDS(I) = 2*I
+  150   CONTINUE
+        DO 160 I = 1,ECNTCM
+          EIDS(I) = 2*I
+          SIDS(I) = 3*I
+          PIDS(I) = 4*I
+  160   CONTINUE
+
+        DO 170 I=1,NECMAP
+          CALL NEPECM(NEID, EMAPIDS(I), EIDS, SIDS, PIDS, IPROC, IERR)
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGII(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER NP, NPF
+      CHARACTER FTYPE*2
+
+      CALL NEGII(NEID, NP, NPF, FTYPE, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      IF (NP.NE.NPROC) IERR = -1
+      IF (NPF.NE.NPROCF) IERR = -1
+      IF (NP.NE.NPROC) IERR = -1
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGIG(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER NUMNG, NUMEG, NUMEBG, NUMNSG, NUMSSG
+
+      CALL NEGIG(NEID, NUMNG, NUMEG, NUMEBG, NUMNSG, NUMSSG, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      IF (NUMNG.NE.NNG) IERR = -1
+      IF (NUMEG.NE.NEG) IERR = -1
+      IF (NUMEBG.NE.NEBG) IERR = -1
+      IF (NUMNSG.NE.NNSG) IERR = -1
+      IF (NUMSSG.NE.NSSG) IERR = -1
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGEBI(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER I, EBLK_IDS(NEBG)
+      INTEGER EBLK_CNTS(NEBG)
+
+      CALL NEGEBIG(NEID, EBLK_IDS, EBLK_CNTS, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      DO 150 I=1,NEBG
+        IF (EBLK_IDS(I).NE.I) IERR = -1
+        IF (EBLK_CNTS(I) .NE. 10) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGNSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER I, GLBL_IDS(NNSG), GLBL_NC(NNSG), GLBL_DFC(NNSG)
+
+      CALL NEGNSPG(NEID, GLBL_IDS, GLBL_NC, GLBL_DFC, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      DO 150 I=1,NNSG
+        IF (GLBL_IDS(I).NE.(2*I)) IERR = -1
+        IF (GLBL_NC(I).NE.(3*I)) IERR = -1
+        IF (GLBL_DFC(I).NE.1) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGSSP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER I, GLBL_IDS(NSSG), GLBL_EC(NSSG), GLBL_DFC(NSSG)
+
+      CALL NEGSSPG(NEID, GLBL_IDS, GLBL_EC, GLBL_DFC, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+      DO 150 I=1,NNSG
+        IF (GLBL_IDS(I).NE.(3*I)) IERR = -1
+        IF (GLBL_EC(I).NE.(2*I)) IERR = -1
+        IF (GLBL_DFC(I).NE.1) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGLBP(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, NUM_IN, NUM_BN, NUM_EN, NUM_IE, NUM_BE,
+     *  NUM_NCM, NUM_ECM
+
+      DO 150 IPROC = 0,(NPROCF-1)
+        CALL NEGLBP(NEID, NUM_IN, NUM_BN, NUM_EN, NUM_IE, NUM_BE,
+     1   NUM_NCM, NUM_ECM, IPROC, IERR)
+
+      IF (IERR.NE.0) GOTO 210
+
+        IF(NUM_IN.NE.NINTN) IERR = -1
+        IF(NUM_BN.NE.NBORN) IERR = -1
+        IF(NUM_EN.NE.NEXTN) IERR = -1
+        IF(NUM_IE.NE.NINTE) IERR = -1
+        IF(NUM_BE.NE.NBORE) IERR = -1
+        IF(NUM_NCM.NE.NNCMAP) IERR = -1
+        IF(NUM_ECM.NE.NECMAP) IERR = -1
+  150 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGNM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, J, NMAPI(NINTN), NMAPB(NBORN), NMAPE(NEXTN)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+
+        CALL NEGNM(NEID, NMAPI, NMAPB, NMAPE, IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 150 J = 1,NINTN
+          IF (NMAPI(J).NE.I) ERR = -1
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORN
+          IF (NMAPB(J).NE.I) ERR = -1
+          I = I + 1
+  160   CONTINUE
+        DO 170 J = 1,NEXTN
+          IF (NMAPE(J).NE.I) ERR = -1
+          I = I + 1
+  170   CONTINUE
+
+        I = 0
+
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGEM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, J, EMAPI(NINTE), EMAPB(NBORE)
+
+      I = 0
+      DO 200 IPROC = 0,(NPROCF-1)
+        CALL NEGEM(NEID, EMAPI, EMAPB, IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 150 J = 1,NINTE
+          IF (EMAPI(J).NE.I) ERR = -1
+          I = I + 1
+  150   CONTINUE
+        DO 160 J = 1,NBORE
+          IF (EMAPB(J).NE.I) ERR = -1
+          I = I + 1
+  160   CONTINUE
+
+        I = 0
+
+        IF (IERR.NE.0) GOTO 210
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGNCM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, J, NMAPIDS(NNCMAP), NMAPCNT(NNCMAP),
+     1 NIDS(NCNTCM), PIDS(NCNTCM), EMAPIDS(NECMAP), EMAPCNT(NECMAP)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        CALL NEGCMP(NEID, NMAPIDS, NMAPCNT, EMAPIDS, EMAPCNT,
+     1   IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 170 I = 1,NNCMAP
+          CALL NEGNCM(NEID, NMAPIDS(I), NIDS, PIDS, IPROC, IERR)
+
+          IF (IERR.NE.0) GOTO 210
+
+          IF (NMAPIDS(I).NE.I) IERR = -1
+          DO 160 J = 1,NCNTCM
+            IF (NIDS(J).NE.2*J) IERR = -1
+            IF (PIDS(J).NE.3*J) IERR = -1
+  160     CONTINUE
+
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
+C=================================================================
+      SUBROUTINE NETGECM(NEID, IERR)
+C=================================================================
+
+      INCLUDE 'ne_test.inc'
+
+      INTEGER IPROC, I, EMAPIDS(NECMAP), EMAPCNT(NECMAP), EIDS(ECNTCM),
+     1 PIDS(ECNTCM), SIDS(ECNTCM), NMAPIDS(NNCMAP), NMAPCNT(NNCMAP)
+
+      DO 200 IPROC = 0,(NPROCF-1)
+        CALL NEGCMP(NEID, NMAPIDS, NMAPCNT, EMAPIDS, EMAPCNT,
+     1   IPROC, IERR)
+
+        IF (IERR.NE.0) GOTO 210
+
+        DO 170 I = 1,NECMAP
+          CALL NEGECM(NEID, EMAPIDS(I), EIDS, SIDS, PIDS, IPROC, IERR)
+
+          IF (IERR.NE.0) GOTO 210
+
+          IF (EMAPIDS(I).NE.(2*I)) IERR = -1
+          DO 160 J = 1,ECNTCM
+            IF (EIDS(J).NE.2*J) IERR = -1
+            IF (SIDS(J).NE.3*J) IERR = -1
+            IF (PIDS(J).NE.4*J) IERR = -1
+  160     CONTINUE
+
+          IF (IERR.NE.0) GOTO 210
+  170   CONTINUE
+
+  200 CONTINUE
+
+  210 CONTINUE
+      END
+
diff --git a/nemesis/forbind/ne_jack.c b/nemesis/forbind/ne_jack.c
new file mode 100644
index 0000000..a31d895
--- /dev/null
+++ b/nemesis/forbind/ne_jack.c
@@ -0,0 +1,1438 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*====================================================================
+ * ------------------------
+ * | CVS File Information |
+ * ------------------------
+ *
+ * $RCSfile: ne_jack.src,v $
+ *
+ * $Author: gdsjaar $
+ *
+ * $Date: 2007/10/31 21:39:17 $
+ *
+ * $Revision: 1.14 $
+ *
+ *====================================================================*/
+/*
+ * OVERVIEW
+ *
+ * This file contains jacket routines written in C for interfacing Fortran
+ * NemesisI function calls to the actual C binding for NemsisI.  This code
+ * is written explicitly for DARWIN.  In general, these functions handle
+ * character-string parameter conventions, convert between
+ * column-major-order arrays and row-major-order arrays, and map between
+ * array indices beginning at one and array indices beginning at zero.
+ *
+ */
+
+/* LINTLIBRARY */
+#include        <ctype.h>
+#include        <string.h>
+#include        <stdio.h>
+#include        <stdlib.h>
+#include        "netcdf.h"
+#include        "exodusII.h"
+#include        "exodusII_int.h"
+
+/*
+ * The Build64 is for the "normal" SEACAS build which uses compiler
+ * options to change reals and integers into 8-byte quantities.  The
+ * routines in addrwrap.F are used to down-convert the 8-byte integers
+ * into 4-byte integers which then call through to the routines in
+ * this file which have a '4' or '4_' appended to the routine name.
+ * These routines then call through to the C API routines.
+ *
+ * If DEFAULT_REAL_INT is defined, then the build is to build a
+ * fortran library interface that takes 4-byte ints and either 4-byte
+ * or 8-byte floating point (real/double) variables. In this case, the
+ * addrwrap routines are not built and a fortran client will call the
+ * routines in this file directly.
+ *
+ */
+#if defined(Build64) && !defined(DEFAULT_REAL_INT)
+/* 64-bit */
+typedef double real;
+typedef ex_entity_id entity_id;
+#ifdef ADDC_
+#define F2C(name) name##4_
+#else
+#define F2C(name) name##4
+#endif
+
+#else
+/* 32-bit */
+typedef float real;
+typedef int entity_id;
+#ifdef ADDC_
+#define F2C(name) name##_
+#else
+#define F2C(name) name
+#endif
+#endif
+
+
+
+extern int ncopts;   /* default is (NC_FATAL | NC_VERBOSE) */
+extern int exerrval; /* global int that contains a Exodus-specific error code */
+
+/* blank fill C string to make FORTRAN string */
+static void
+ex_fcdcpy (char *fstring, size_t fslen, char *sstring)
+                                /* output string to be blank-filled */
+                                /* length of output string */
+                                /* input string, null-terminated */
+{
+  size_t i, len = strlen(sstring);
+  
+  for (i = 0; i < len; i++)
+    *(fstring + i) = *(sstring + i);
+  for (i = len; i < fslen; i++)
+    *(fstring + i) = ' ';
+}
+
+/* copy function used to copy strings and strip trailing blanks */
+static void
+ex_fstrncpy (char *target, char *source, size_t maxlen)
+                                /* space to be copied into */
+                                /* string to be copied */
+                                /* maximum length of *source */
+{
+    while (maxlen-- && *source != '\0')
+        *target++ = *source++;
+    while (*(--target) == ' '); /* strip blanks */
+    *(++target) = '\0';         /* insert new EOS marker */
+}
+
+/* Above are utility functions used below                                   */
+/* ======================================================================== */
+/* Below are the nemesis API functions                                      */
+/*
+ * Adding a new function:
+ * +  Protect the name with the f2c (uppercase) macro which will add/not add '4' and or '_'
+ *    depending on the compilation mode.
+ *
+ * +  float/double arguments are declared as 'real' which will be replaced with float or double.
+ *
+ * +  If there are any character arguments 'X', then add an int* argument 'Xlen' at end of argument list
+ *    This will contain the length of the passed in character argument.
+ *
+ * +  Look at existing functions for guidance...
+ */
+
+/*
+ *  Get initial information from nemesis file
+ */
+void
+F2C(negii)(int	*idne,	
+	   int	*nproc,
+	   int	*nproc_in_f,
+	   char	*ftype,
+	   int  *ierr, 
+	   size_t ftypelen)
+{
+  size_t slen = 1;
+  char *file_type;
+
+  /* WARNING: ftypelen SHOULD be 1, but may not be depending on how
+              the Fortran programmer passed it. It is best at
+              this time to hard code it per NEPII spec. */
+  if (ftypelen != 1) {
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,"Warning: file type string length is %d in file id %d\n",
+            ftypelen, *idne);
+    ex_err("negii",errmsg,EX_MSG);
+#endif
+    slen = ftypelen;
+  }
+
+  file_type = (char *) malloc((slen+1)*sizeof(char));
+
+  if ((*ierr = ex_get_init_info(*idne, nproc, nproc_in_f, file_type)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to get initial information from file id %d",
+	    *idne);
+    ex_err("negii",errmsg,EX_MSG);
+  }
+
+  if (*ierr == 0)
+    ex_fcdcpy (ftype, slen, file_type);
+
+  free(file_type);
+}
+
+/*
+ *  Write initial information from nemesis file
+ */
+void
+F2C(nepii)(int	*idne,
+	   int	*nproc,
+	   int	*nproc_in_f,
+	   char	*ftype,
+	   int  *ierr,
+	   size_t ftypelen)
+{
+
+  char errmsg[MAX_ERR_LENGTH];
+
+  size_t slen = 1;
+  char *file_type;
+
+  /* WARNING: ftypelen SHOULD be 1, but may not be depending on how
+              the Fortran programmer passed it. It is best at
+              this time to hard code it per NEPII spec. */
+  if (ftypelen != 1) {
+    slen = ftypelen;
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    sprintf(errmsg,"Warning: file type string length is %d in file id %d\n",
+            ftypelen, *idne);
+    ex_err("nepii",errmsg,EX_MSG);
+#endif
+  }
+
+  file_type = (char *) malloc((slen+1)*sizeof(char));
+
+  ex_fstrncpy (file_type, ftype, slen);
+
+  if ((*ierr = ex_put_init_info(*idne, *nproc, *nproc_in_f, file_type)) != 0)
+  {
+    sprintf(errmsg,
+	    "Error: failed to put initial information in file id %d",
+	    *idne);
+    ex_err("nepii",errmsg,EX_MSG);
+  }
+
+  free(file_type);
+}
+
+/*
+ * Read initial global information
+ */
+void
+F2C(negig)(int	*idne,
+	   void_int	*nnodes_g,
+	   void_int	*nelems_g,
+	   void_int	*nelem_blks_g,
+	   void_int	*nnode_sets_g,
+	   void_int	*nside_sets_g,
+	   int	*ierr)
+{
+  if ((*ierr = ex_get_init_global(*idne, nnodes_g, nelems_g, nelem_blks_g,
+                                  nnode_sets_g, nside_sets_g)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read initial global information from file id %d",
+	    *idne);
+    ex_err("negig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write initial global information
+ */
+void
+F2C(nepig)(int	*idne,
+	   void_int	*nnodes_g,
+	   void_int	*nelems_g,
+	   void_int	*nelem_blks_g,
+	   void_int	*nnode_sets_g,
+	   void_int	*nside_sets_g,
+	   int	*ierr)
+{
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    int64_t *n_nnodes_g = (int64_t*)nnodes_g;
+    int64_t *n_nelems_g = (int64_t*)nelems_g;
+    int64_t *n_nelem_blks_g = (int64_t*)nelem_blks_g;
+    int64_t *n_nnode_sets_g = (int64_t*)nnode_sets_g;
+    int64_t *n_nside_sets_g = (int64_t*)nside_sets_g;
+    *ierr =  ex_put_init_global(*idne, *n_nnodes_g, *n_nelems_g, *n_nelem_blks_g,
+				*n_nnode_sets_g, *n_nside_sets_g);
+  } else {
+    int *n_nnodes_g = (int*)nnodes_g;
+    int *n_nelems_g = (int*)nelems_g;
+    int *n_nelem_blks_g = (int*)nelem_blks_g;
+    int *n_nnode_sets_g = (int*)nnode_sets_g;
+    int *n_nside_sets_g = (int*)nside_sets_g;
+    *ierr =  ex_put_init_global(*idne, *n_nnodes_g, *n_nelems_g, *n_nelem_blks_g,
+				*n_nnode_sets_g, *n_nside_sets_g);
+  }
+
+  if (*ierr != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store initial global information in file id %d",
+	    *idne);
+    ex_err("nepig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read load balance parameters
+ */
+void
+F2C(neglbp)(int	*idne,
+	    void_int	*nint_nodes,
+	    void_int	*nbor_nodes,
+	    void_int	*next_nodes,
+	    void_int	*nint_elems,
+	    void_int	*nbor_elems,
+	    void_int	*nnode_cmaps,
+	    void_int	*nelem_cmaps,
+	    int	*processor,
+	    int	*ierr)
+{
+  if ((*ierr = ex_get_loadbal_param(*idne, nint_nodes, nbor_nodes,
+                                    next_nodes, nint_elems, nbor_elems,
+                                    nnode_cmaps, nelem_cmaps, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read load balance parameters from file id %d",
+	    *idne);
+    ex_err("neglbp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write load balance parameters
+ */
+void
+F2C(neplbp)(int	*idne,
+	    void_int	*nint_nodes,
+	    void_int	*nbor_nodes,
+	    void_int	*next_nodes,
+	    void_int	*nint_elems,
+	    void_int	*nbor_elems,
+	    void_int	*nnode_cmaps,
+	    void_int	*nelem_cmaps,
+	    int	*processor,
+	    int	*ierr)	
+{
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    int64_t *n_nint_nodes = (int64_t*)nint_nodes;
+    int64_t *n_nbor_nodes = (int64_t*)nbor_nodes;
+    int64_t *n_next_nodes = (int64_t*)next_nodes;
+    int64_t *n_nint_elems = (int64_t*)nint_elems;
+    int64_t *n_nbor_elems = (int64_t*)nbor_elems;
+    int64_t *n_nnode_cmaps = (int64_t*)nnode_cmaps;
+    int64_t *n_nelem_cmaps = (int64_t*)nelem_cmaps;
+    *ierr = ex_put_loadbal_param(*idne, *n_nint_nodes, *n_nbor_nodes,
+				 *n_next_nodes, *n_nint_elems, *n_nbor_elems,
+				 *n_nnode_cmaps, *n_nelem_cmaps,
+				 *processor);
+  } else {
+    int *n_nint_nodes = (int*)nint_nodes;
+    int *n_nbor_nodes = (int*)nbor_nodes;
+    int *n_next_nodes = (int*)next_nodes;
+    int *n_nint_elems = (int*)nint_elems;
+    int *n_nbor_elems = (int*)nbor_elems;
+    int *n_nnode_cmaps = (int*)nnode_cmaps;
+    int *n_nelem_cmaps = (int*)nelem_cmaps;
+    *ierr = ex_put_loadbal_param(*idne, *n_nint_nodes, *n_nbor_nodes,
+				 *n_next_nodes, *n_nint_elems, *n_nbor_elems,
+				 *n_nnode_cmaps, *n_nelem_cmaps,
+				 *processor);
+  }
+  if (*ierr != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store load balance parameters in file id %d",
+	    *idne);
+    ex_err("neplbp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write concatenated load balance parameters
+ */
+void
+F2C(neplbpc)(int *idne,
+	     void_int *nint_nodes,	
+	     void_int *nbor_nodes,	
+	     void_int *next_nodes,	
+	     void_int *nint_elems,	
+	     void_int *nbor_elems,	
+	     void_int *nnode_cmaps,	
+	     void_int *nelem_cmaps,	
+	     int *ierr)	
+{
+  if ((*ierr = ex_put_loadbal_param_cc(*idne, nint_nodes, nbor_nodes,
+                                       next_nodes, nint_elems, nbor_elems,
+                                       nnode_cmaps, nelem_cmaps)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store load balance parameters in file id %d",
+	    *idne);
+    ex_err("neplbpc",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global node set parameters
+ */
+void
+F2C(negnspg)(int *idne,
+	     void_int *ns_ids_glob,
+	     void_int *ns_n_cnt_glob,
+	     void_int *ns_df_cnt_glob,
+	     int *ierr)
+{
+  if ((*ierr = ex_get_ns_param_global(*idne, ns_ids_glob, ns_n_cnt_glob, ns_df_cnt_glob)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global node set parameters from file id %d",
+	    *idne);
+    ex_err("negnspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global node set parameters
+ */
+void
+F2C(nepnspg)(int *idne,
+	     void_int *global_ids,
+	     void_int *global_n_cnts,
+	     void_int *global_df_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_ns_param_global(*idne, global_ids, global_n_cnts, global_df_cnts)) != 0)
+  {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global node set parameters in file id %d",
+	    *idne);
+    ex_err("nepnspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global side set parameters
+ */
+void
+F2C(negsspg)(int *idne,
+	     void_int *ss_ids_glob,
+	     void_int *ss_n_cnt_glob,
+	     void_int *ss_df_cnt_glob,
+	     int *ierr)
+{
+
+  if ((*ierr = ex_get_ss_param_global(*idne, ss_ids_glob, ss_n_cnt_glob, ss_df_cnt_glob)) != 0)
+  {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global side set parameters from file id %d",
+	    *idne);
+    ex_err("negsspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global side set parameters
+ */
+void
+F2C(nepsspg)(int *idne,
+	     void_int *global_ids,
+	     void_int *global_el_cnts,
+	     void_int *global_df_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_ss_param_global(*idne, global_ids, global_el_cnts, global_df_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global side set parameters in file id %d",
+	    *idne);
+    ex_err("nepsspg",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read global element block information
+ */
+void
+F2C(negebig)(int *idne,
+	     void_int *el_blk_ids,
+	     void_int *el_blk_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_get_eb_info_global(*idne, el_blk_ids, el_blk_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read global element block info from file id %d",
+	    *idne);
+    ex_err("negebig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write global element block information
+ */
+void
+F2C(nepebig)(int *idne,
+	     void_int *el_blk_ids,
+	     void_int *el_blk_cnts,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_eb_info_global(*idne, el_blk_ids, el_blk_cnts)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to store global element block info in file id %d",
+	    *idne);
+    ex_err("nepebig",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read side set element list and side set side list
+ */
+void
+F2C(negnss)(int *idne,
+	    entity_id *ss_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ss_elem_list,
+	    void_int *ss_side_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_side_set(*idne, *ss_id, st, cnt, ss_elem_list, ss_side_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read side set element list from file id %d",
+	    *idne);
+    ex_err("negnss",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write side set element list and side set side list
+ */
+void
+F2C(nepnss)(int *idne,
+	    entity_id *ss_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ss_elem_list,
+	    void_int *ss_side_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_side_set(*idne, *ss_id, st, cnt, ss_elem_list, ss_side_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write side set element list to file id %d",
+	    *idne);
+    ex_err("nepnss",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read side set distribution factor
+ */
+void
+F2C(negnssd)(int *idne,
+	     entity_id *ss_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ss_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_side_set_df(*idne, *ss_id, st, cnt, ss_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read side set dist factor from file id %d",
+	    *idne);
+    ex_err("negnssd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write side set distribution factor
+ */
+void
+F2C(nepnssd)(int *idne,
+	     entity_id *ss_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ss_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_side_set_df(*idne, *ss_id, st, cnt, ss_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write side set dist factor to file id %d",
+	    *idne);
+    ex_err("nepnssd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read node set list for a single node set
+ */
+void
+F2C(negnns)(int *idne,
+	    entity_id *ns_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ns_node_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_node_set(*idne, *ns_id, st, cnt,ns_node_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node set node list from file id %d",
+	    *idne);
+    ex_err("negnns",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write node set list for a single node set
+ */
+void
+F2C(nepnns)(int *idne,
+	    entity_id *ns_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *ns_node_list,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_node_set(*idne, *ns_id, st, cnt, ns_node_list)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node set node list to file id %d",
+	    *idne);
+    ex_err("nepnns",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read node set distribution factor
+ */
+void
+F2C(negnnsd)(int *idne,
+	     entity_id *ns_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ns_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_node_set_df(*idne, *ns_id, st, cnt, ns_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node set dist factor from file id %d",
+	    *idne);
+    ex_err("negnnsd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write node set distribution factor
+ */
+void
+F2C(nepnnsd)(int *idne,
+	     entity_id *ns_id,
+	     void_int *start,
+	     void_int *count,
+	     real *ns_df,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_node_set_df(*idne, *ns_id, st, cnt, ns_df)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node set dist factor to file id %d",
+	    *idne);
+    ex_err("nepnnsd",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read coordinates of the nodes
+ */
+void
+F2C(negcor)(int *idne,
+	    void_int *start,
+	    void_int *count,
+	    real *x_coor,
+	    real *y_coor,
+	    real *z_coor,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_coord(*idne, st, cnt, x_coor, y_coor, z_coor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node coordinates from file id %d",
+	    *idne);
+    ex_err("negcor",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write coordinates of the nodes
+ */
+void
+F2C(nepcor)(int *idne,
+	    void_int *start,
+	    void_int *count,
+	    real *x_coor,
+	    real *y_coor,
+	    real *z_coor,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_coord(*idne, st, cnt, x_coor, y_coor, z_coor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node coordinates to file id %d",
+	    *idne);
+    ex_err("nepcor",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read an element block's connectivity list
+ */
+void
+F2C(negnec)(int *idne,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *connect,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_elem_conn(*idne, *elem_blk_id, st, cnt, connect)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block connectivity from file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write an element block's connectivity list
+ */
+void
+F2C(nepnec)(int *idne,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    void_int *connect,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_elem_conn(*idne, *elem_blk_id, st, cnt, connect)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element block connectivity to file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read an element block's attributes
+ */
+void
+F2C(negneat)(int *idne,
+	     entity_id *elem_blk_id,
+	     void_int *start,
+	     void_int *count,
+	     real *attrib,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_elem_attr(*idne, *elem_blk_id, st, cnt, attrib)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block attribute from file id %d",
+	    *idne);
+    ex_err("negneat",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write an element block's attributes
+ */
+void
+F2C(nepneat)(int *idne,
+	     entity_id *elem_blk_id,
+	     void_int *start,
+	     void_int *count,
+	     real *attrib,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_n_elem_attr(*idne, *elem_blk_id, st, cnt, attrib)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element block attribute to file id %d",
+	    *idne);
+    ex_err("nepneat",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element type for a specific element block
+ */
+void
+F2C(negelt)(int *idne,
+	    entity_id *elem_blk_id,
+	    char *elem_type,
+	    int *ierr,
+	    size_t elem_typelen)
+{
+  size_t slen = MAX_STR_LENGTH;
+  char *etype;
+
+  /* WARNING: ftypelen SHOULD be MAX_STR_LENGTH, but may not be depending
+              on how the Fortran programmer passed it. It is best at
+              this time to hard code it per NEMESIS spec. */
+  if (elem_typelen != MAX_STR_LENGTH) {
+#if defined(EXODUS_STRING_LENGTH_WARNING)
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,"Warning: element type string length is %d in file id %d\n",
+            elem_typelen, *idne);
+    ex_err("negelt",errmsg,EX_MSG);
+#endif
+    slen = elem_typelen;
+  }
+
+  etype = (char *) malloc((slen+1)*sizeof(char));
+
+  if ((*ierr = ex_get_elem_type(*idne, *elem_blk_id, etype)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block type from file id %d",
+	    *idne);
+    ex_err("negelt",errmsg,EX_MSG);
+  }
+
+  if (*ierr == 0)
+    ex_fcdcpy (elem_type, slen, etype);
+
+  free(etype);
+}
+
+/*
+ * Read a variable for an element block
+ */
+void
+F2C(negnev)(int *idne,
+	    int *time_step,
+	    int *elem_var_index,
+	    entity_id *elem_blk_id,
+	    void_int *num_elem_this_blk,
+	    void_int *start,
+	    void_int *count,
+	    real *elem_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt, ne;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+    ne = *(int64_t*)num_elem_this_blk;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+    ne = *(int*)num_elem_this_blk;
+  }
+
+  if ((*ierr = ex_get_n_elem_var(*idne, *time_step, *elem_var_index,
+				 *elem_blk_id, ne, st, cnt, elem_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element block variable from file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write a variable slab for an element block
+ */
+void
+F2C(nepevs)(int *idne,
+	    int *time_step,
+	    int *elem_var_index,
+	    entity_id *elem_blk_id,
+	    void_int *start,
+	    void_int *count,
+	    real *elem_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_elem_var_slab(*idne, *time_step, *elem_var_index,
+                                    *elem_blk_id, st, cnt, elem_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write elem block variable slab to file id %d",
+	    *idne);
+    ex_err("negnec",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the values of a single nodal variable for a single time step
+ */
+void
+F2C(negnnv)(int *idne,
+	    int *time_step,
+	    int *nodal_var_index,
+	    void_int *start,
+	    void_int *count,
+	    real *nodal_vars,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_get_n_nodal_var(*idne, *time_step, *nodal_var_index,
+                                  st, cnt, nodal_vars)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read nodal variable from file id %d",
+	    *idne);
+    ex_err("negnnv",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write nodal variable slab
+ */
+void
+F2C(nepnvs)(int *idne,
+	    int *time_step,
+	    int *nodal_var_index,
+	    void_int *start,
+	    void_int *count,
+	    real *nodal_var_vals,
+	    int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)start;
+    cnt = *(int64_t*)count;
+  } else {
+    st = *(int*)start;
+    cnt = *(int*)count;
+  }
+
+  if ((*ierr = ex_put_nodal_var_slab(*idne, *time_step, *nodal_var_index,
+                                     st, cnt, nodal_var_vals)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write nodal variable slab to file id %d",
+	    *idne);
+    ex_err("nepnvs",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element numbering map
+ */
+void
+F2C(negnenm)(int *idne,
+	     void_int *starte,
+	     void_int *num_ent,
+	     void_int *elem_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)starte;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)starte;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_get_n_elem_num_map(*idne, st, cnt, elem_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read element numbering map from file id %d",
+	    *idne);
+    ex_err("negnenm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the element numbering map
+ */
+void
+F2C(nepnenm)(int *idne,
+	     void_int *starte,
+	     void_int *num_ent,
+	     void_int *elem_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)starte;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)starte;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_put_n_elem_num_map(*idne, st, cnt, elem_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write element numbering map to file id %d",
+	    *idne);
+    ex_err("nepnenm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the node numbering map
+ */
+void
+F2C(negnnnm)(int *idne,
+	     void_int *startn,
+	     void_int *num_ent,
+	     void_int *node_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)startn;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)startn;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_get_n_node_num_map(*idne, st, cnt, node_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read node numbering map from file id %d",
+	    *idne);
+    ex_err("negnnnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the node numbering map
+ */
+void
+F2C(nepnnnm)(int *idne,
+	     void_int *startn,
+	     void_int *num_ent,
+	     void_int *node_map,
+	     int *ierr)
+{
+  int64_t st, cnt;
+  if (ex_int64_status(*idne) & EX_BULK_INT64_API) {
+    st = *(int64_t*)startn;
+    cnt = *(int64_t*)num_ent;
+  } else {
+    st = *(int*)startn;
+    cnt = *(int*)num_ent;
+  }
+
+  if ((*ierr = ex_put_n_node_num_map(*idne, st, cnt, node_map)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write node numbering map to file id %d",
+	    *idne);
+    ex_err("nepnnnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the node map for a processor
+ */
+void
+F2C(negnm)(int *idne,
+	   void_int *node_mapi,
+	   void_int *node_mapb,
+	   void_int *node_mape,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_get_processor_node_maps(*idne, node_mapi, node_mapb, node_mape, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read processor node map from file id %d",
+	    *idne);
+    ex_err("negnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write a node map for a processor
+ */
+void
+F2C(nepnm)(int *idne,
+	   void_int *node_mapi,
+	   void_int *node_mapb,
+	   void_int *node_mape,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_put_processor_node_maps(*idne, node_mapi, node_mapb, node_mape, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write processor node map to file id %d",
+	    *idne);
+    ex_err("nepnm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the element map for a processor
+ */
+void
+F2C(negem)(int *idne,
+	   void_int *elem_mapi,
+	   void_int *elem_mapb,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_get_processor_elem_maps(*idne, elem_mapi, elem_mapb, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read processor element map from file id %d",
+	    *idne);
+    ex_err("negem",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the element map for a processor
+ */
+void
+F2C(nepem)(int *idne,
+	   void_int *elem_mapi,
+	   void_int *elem_mapb,
+	   int *processor,
+	   int *ierr)
+{
+  if ((*ierr = ex_put_processor_elem_maps(*idne, elem_mapi, elem_mapb, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write processor element map to file id %d",
+	    *idne);
+    ex_err("nepem",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the communications map parameters for a single processor
+ */
+void
+F2C(negcmp)(int *idne,
+	    void_int *ncmap_ids,
+	    void_int *ncmap_node_cnts,
+	    void_int *ecmap_ids,
+	    void_int *ecmap_elem_cnts,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_cmap_params(*idne, ncmap_ids, ncmap_node_cnts,
+                                  ecmap_ids, ecmap_elem_cnts, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read comm map parameters from file id %d",
+	    *idne);
+    ex_err("negcmp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the communications map parameters for a single processor
+ */
+void
+F2C(nepcmp)(int *idne,
+	    void_int *nmap_ids,
+	    void_int *nmap_node_cnts,
+	    void_int *emap_ids,
+	    void_int *emap_elem_cnts,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_cmap_params(*idne, nmap_ids, nmap_node_cnts,
+                                  emap_ids, emap_elem_cnts, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write comm map parameters to file id %d",
+	    *idne);
+    ex_err("nepcmp",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the communications map parameters for all processors
+ */
+void
+F2C(nepcmpc)(int *idne,
+	     void_int *nmap_ids,
+	     void_int *nmap_node_cnts,
+	     void_int *nproc_ptrs,
+	     void_int *emap_ids,
+	     void_int *emap_elem_cnts,
+	     void_int *eproc_ptrs,
+	     int *ierr)
+{
+  if ((*ierr = ex_put_cmap_params_cc(*idne, nmap_ids, nmap_node_cnts,
+                                     nproc_ptrs, emap_ids, emap_elem_cnts,
+                                     eproc_ptrs)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write comm map parameters to file id %d",
+	    *idne);
+    ex_err("nepcmpc",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the nodal communications map for a single processor
+ */
+void
+F2C(negncm)(int *idne,
+	    entity_id *map_id,
+	    void_int *node_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_node_cmap(*idne, *map_id, node_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read nodal communications map from file id %d",
+	    *idne);
+    ex_err("negncm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the nodal communications map for a single processor
+ */
+void
+F2C(nepncm)(int *idne,
+	    entity_id *map_id,
+	    void_int *node_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_node_cmap(*idne, *map_id, node_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write nodal communications map to file id %d",
+	    *idne);
+    ex_err("nepncm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Read the elemental communications map for a single processor
+ */
+void
+F2C(negecm)(int *idne,
+	    entity_id *map_id,
+	    void_int *elem_ids,
+	    void_int *side_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_get_elem_cmap(*idne, *map_id, elem_ids, side_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to read elemental comm map from file id %d",
+	    *idne);
+    ex_err("negecm",errmsg,EX_MSG);
+  }
+}
+
+/*
+ * Write the elemental communications map for a single processor
+ */
+void
+F2C(nepecm)(int *idne,
+	    entity_id *map_id,
+	    void_int *elem_ids,
+	    void_int *side_ids,
+	    void_int *proc_ids,
+	    int *processor,
+	    int *ierr)
+{
+  if ((*ierr = ex_put_elem_cmap(*idne, *map_id, elem_ids, side_ids, proc_ids, *processor)) != 0) {
+    char errmsg[MAX_ERR_LENGTH];
+    sprintf(errmsg,
+	    "Error: failed to write elemental comm map to file id %d",
+	    *idne);
+    ex_err("nepecm",errmsg,EX_MSG);
+  }
+}
+
diff --git a/nemesis/forbind/ne_test.inc b/nemesis/forbind/ne_test.inc
new file mode 100644
index 0000000..0f033a1
--- /dev/null
+++ b/nemesis/forbind/ne_test.inc
@@ -0,0 +1,66 @@
+C Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+C DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+C retains certain rights in this software.
+C 
+C Redistribution and use in source and binary forms, with or without
+C modification, are permitted provided that the following conditions are
+C met:
+C 
+C     * Redistributions of source code must retain the above copyright
+C       notice, this list of conditions and the following disclaimer.
+C 
+C     * Redistributions in binary form must reproduce the above
+C       copyright notice, this list of conditions and the following
+C       disclaimer in the documentation and/or other materials provided
+C       with the distribution.  
+C 
+C     * Neither the name of Sandia Corporation nor the names of its
+C       contributors may be used to endorse or promote products derived
+C       from this software without specific prior written permission.
+C 
+C THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+C "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+C LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+C A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+C OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+C SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+C LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+C DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+C THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+C (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+C OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+C 
+C==================================================
+C Parameters for the NE_TEST fortran interface test
+C program
+C==================================================
+
+C Constants for init_global functions
+      PARAMETER (NNG = 100)
+      PARAMETER (NEG = 50)
+      PARAMETER (NEBG = 5)
+      PARAMETER (NNSG = 2)
+      PARAMETER (NSSG = 3)
+
+C Constants for load-balance functions
+      PARAMETER (NPROC = 10)
+      PARAMETER (NPROCF = NPROC)
+      PARAMETER (NINTN = 200)
+      PARAMETER (NBORN = 10)
+      PARAMETER (NEXTN = 5)
+      PARAMETER (NINTE = 100)
+      PARAMETER (NBORE = 20)
+      INTEGER NNCMAP, NECMAP
+      PARAMETER (NNCMAP = 4)
+      PARAMETER (NECMAP = 2)
+
+C Constants for communication map
+      PARAMETER (NCNTCM = 20)
+      INTEGER ECNTCM
+      PARAMETER (ECNTCM = 17)
+
+C Some multiplied values
+C   NNCMAP * NPROCF
+      PARAMETER (NNCXNPF = 40)
+C   NECMAP * NPROCF
+      PARAMETER (NECXNPF = 20)
diff --git a/nemesis/ne_ctest_wrap.c b/nemesis/ne_ctest_wrap.c
new file mode 100644
index 0000000..ccc33be
--- /dev/null
+++ b/nemesis/ne_ctest_wrap.c
@@ -0,0 +1,1044 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+/* This file contains the source code for the program used to test the
+ * Nemesis distribution.
+ *****************************************************************************
+ * Written By: Gary L. Hennigan (SNL, 1421)
+ *****************************************************************************
+ * Functions contained in this file:
+ *	main() - Entry point and main calling program.
+ */
+/*****************************************************************************/
+/*****************************************************************************/
+/*****************************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <exodusII.h>
+
+#include "ne_nemesisI.h"
+
+/* Constants for init_global functions */
+#define NNG	100
+#define NEG	50
+#define NEBG	5
+#define NEBCG	10
+#define NNSG	2
+#define NSSG	3
+
+/* Constants for load-balance functions */
+#define NPROC	10
+#define NPROCF	NPROC
+#define NINTN	200
+#define NBORN	10
+#define NEXTN	5
+#define NINTE	100
+#define NBORE	20
+#define NNCMAP	4
+#define NECMAP	2
+
+/* Constants for communication map */
+#define NCNTCM	20
+#define ECNTCM	17
+
+int main(int argc, char *argv[])
+{
+
+  /* Local function calls */
+  int   ne_test_glbp(int);
+  int   ne_test_piinf(int);
+  int   ne_test_pinig(int);
+  int   ne_test_pelbid(int);
+  int	ne_test_pnsp(int);
+  int	ne_test_pssp(int);
+  int	ne_test_pnm(int);
+  int	ne_test_pem(int);
+  int	ne_test_pcmp(int);
+  int	ne_test_pncm(int);
+  int	ne_test_pecm(int);
+
+  int   ne_test_giinf(int);
+  int	ne_test_ginig(int);
+  int   ne_test_gelbid(int);
+  int   ne_test_gnsp(int);
+  int   ne_test_gssp(int);
+  int	ne_test_gnm(int);
+  int	ne_test_gem(int);
+  int   ne_test_gncm(int);
+  int 	ne_test_gecm(int);
+
+  int	ne_test_plbpc(int);
+  int   ne_test_pcmpc(int);
+
+  /* Unitialized local variables */
+  int     ne_file_id;
+  char    test_direc[256], file_name[256];
+  float	  version;
+
+  /* Initialized local variables */
+  int    mode3 = EX_CLOBBER;
+  int    mode4 = EX_CLOBBER|EX_NETCDF4|EX_NOCLASSIC;
+
+  char  *yo="main";
+  int    io_ws=0, cpu_ws=0, t_pass=0, t_fail=0;
+  int    debug_flag=0;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  /* Get the location of the temporary file to use for the test */
+  if (argc <= 1) {
+    /* Nothing specified. Use defaults. */
+    strcpy(file_name, "./ne_test.exoII");
+  }
+  else if (argc == 2) {
+    /* Test for the help flag */
+    if (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-?") == 0) {
+      /* Output the help line */
+      printf("Usage:\n\tne_test <optional directory> <optional file name>\n");
+      exit(0);
+    }
+    /* Test for the debug flag */
+    else if (strcmp(argv[1], "-d") == 0 || strcmp(argv[1], "-d") == 0) {
+      printf("****DEBUG MODE****\n");
+      ex_opts(EX_VERBOSE | EX_DEBUG);
+      strcpy(file_name, "./ne_test.exoII");
+      debug_flag = 1;
+    }
+    /* Else get the directory name and assign default name */
+    else {
+      strcpy(test_direc, argv[1]);
+      if (test_direc[strlen(test_direc)-1] != '/') {
+        strcpy(file_name, test_direc);
+        strcat(file_name, "/ne_test.exoII");
+      }
+      else {
+        strcpy(file_name, test_direc);
+        strcat(file_name, "ne_test.exoII");
+      }
+    }
+  }
+  else if (argc == 3) {
+    /* Both directory and file name specified */
+    strcpy(test_direc, argv[1]);
+    if (test_direc[strlen(test_direc)-1] == '/') {
+      strcpy(file_name, test_direc);
+      strcat(file_name, "/");
+      strcat(file_name, argv[2]);
+    }
+    else {
+      strcpy(file_name, test_direc);
+      strcat(file_name, argv[2]);
+    }
+  }
+
+/*---------------------------------------------------------------------------*/
+/*                      OUTPUT TEST SECTION                                  */
+/*---------------------------------------------------------------------------*/
+
+  printf("*********************Output Tests***********************\n");
+
+  /* Create the ExodusII/Nemesis file */
+  printf("creating ExodusII file..."); fflush(stdout);
+
+  /* Attempt to create a netcdf4-format file; if it fails, then assume
+     that the netcdf library does not support that mode and fall back
+     to classic netcdf3 format.  If that fails, issue an error and
+     die.
+  */
+  if ((ne_file_id=ex_create(file_name, mode4, &cpu_ws, &io_ws)) < 0) {
+    /* netcdf4 create failed, try netcdf3 */
+    if ((ne_file_id=ex_create(file_name, mode3, &cpu_ws, &io_ws)) < 0) {
+      printf("FAILED\n");
+      t_fail++;
+      fprintf(stderr, "[%s]: ERROR, unable to create test file \"%s\"!\n",
+	      yo, file_name);
+      exit(-1);
+    } else {
+      printf(" (netcdf3 format) ");
+    }
+  } else {
+    printf(" (netcdf4 format) ");
+  }
+  printf("successful\n"); fflush(stdout);
+  t_pass++;
+
+  /* Test the output of initial information */
+  printf("testing init info output..."); fflush(stdout);
+  if (ne_test_piinf(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of initial global information */
+  printf("testing global init info output..."); fflush(stdout);
+  if (ne_test_pinig(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the global element block IDs */
+  printf("testing global element block ID output..."); fflush(stdout);
+  if (ne_test_pelbid(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the global node-set info */
+  printf("testing global node-set params output..."); fflush(stdout);
+  if (ne_test_pnsp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the global side-set info */
+  printf("testing global side-set params output..."); fflush(stdout);
+  if (ne_test_pssp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the concatenated load-balance parameters */
+  printf("testing concatenated load balance info output...");
+  fflush(stdout);
+  if (ne_test_plbpc(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+  }
+  else {
+    printf("succesful\n"); fflush(stdout);
+  }
+
+  /* Test the output of the node map */
+  printf("testing node map output..."); fflush(stdout);
+  if (ne_test_pnm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the element map */
+  printf("testing element map output..."); fflush(stdout);
+  if (ne_test_pem(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test the output of the concatenated communication map params */
+  printf("testing concatenated communication map params output...");
+  fflush(stdout);
+  if (ne_test_pcmpc(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test nodal communication map output */
+  printf("testing nodal communication map output..."); fflush(stdout);
+  if (ne_test_pncm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test elemental communication map output */
+  printf("testing elemental communication map output..."); fflush(stdout);
+  if (ne_test_pecm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Close the ExodusII/Nemesis test file */
+  printf("closing ExodusII file..."); fflush(stdout);
+  if (ex_close(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+    fprintf(stderr, "[%s]: ERROR, unable to close test file \"%s\"!\n",
+            yo, file_name);
+    exit(-1);
+  }
+  printf("successful\n"); fflush(stdout);
+  t_pass++;
+
+/*---------------------------------------------------------------------------*/
+/*                       INPUT TEST SECTION                                  */
+/*---------------------------------------------------------------------------*/
+
+  printf("**********************Input Tests***********************\n");
+
+  /* Re-open the ExodusII/NemesisI file */
+  printf("reopening ExodusII file..."); fflush(stdout);
+  if (ex_open(file_name, EX_READ, &cpu_ws, &io_ws, &version) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of of the initial information */
+  printf("testing init info input..."); fflush(stdout);
+  if (ne_test_giinf(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of initial global information */
+  printf("testing global init info input..."); fflush(stdout);
+  if (ne_test_ginig(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of global element block IDs */
+  printf("testing global element block IDs input..."); fflush(stdout);
+  if (ne_test_gelbid(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of global node-set params */
+  printf("testing global node-set params input..."); fflush(stdout);
+  if (ne_test_gnsp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of global side-set params */
+  printf("testing global side-set params input..."); fflush(stdout);
+  if (ne_test_gssp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of load-balance params */
+  printf("testing load-balance params input..."); fflush(stdout);
+  if (ne_test_glbp(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of the node map */
+  printf("testing node map input..."); fflush(stdout);
+  if (ne_test_gnm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of element map */
+  printf("testing element map input..."); fflush(stdout);
+  if (ne_test_gem(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of nodal communication maps */
+  printf("testing nodal communication map input..."); fflush(stdout);
+  if (ne_test_gncm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Test read of elemental communication maps */
+  printf("testing elemental communication map input..."); fflush(stdout);
+  if (ne_test_gecm(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    if (debug_flag == 1)
+      return 1;
+  }
+  else {
+    printf("successful\n"); fflush(stdout);
+    t_pass++;
+  }
+
+  /* Close the ExodusII/Nemesis test file */
+  printf("closing ExodusII file..."); fflush(stdout);
+  if (ex_close(ne_file_id) < 0) {
+    printf("FAILED\n"); fflush(stdout);
+    t_fail++;
+    fprintf(stderr, "[%s]: ERROR, unable to close test file \"%s\"!\n",
+            yo, file_name);
+    exit(-1);
+  }
+  printf("successful\n"); fflush(stdout);
+  t_pass++;
+
+  /* Output a test summary */
+  printf("\n");
+  printf("Tests Passed: %d\n", t_pass);
+  printf("Tests Failed: %d\n", t_fail);
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_piinf(int fileid)
+{
+  char ftype[3];
+
+  strcpy(ftype, "s");
+
+  return (ne_put_init_info(fileid, NPROC, NPROCF, ftype));
+}
+
+/*****************************************************************************/
+int ne_test_pinig(int fileid)
+{
+
+  int	nng=NNG, neg=NEG, nebg=NEBG, nnsg=NNSG, nssg=NSSG;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  return (ne_put_init_global(fileid, nng, neg, nebg, nnsg, nssg));
+}
+
+/*****************************************************************************/
+int ne_test_pelbid(int fileid)
+{
+  int	i, elblk_ids[NEBG], elblk_cnt[NEBG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(i=0; i < NEBG; i++) {
+    elblk_ids[i]=(i+1);
+    elblk_cnt[i]=NEBCG;
+  }
+
+  return (ne_put_eb_info_global(fileid, elblk_ids, elblk_cnt));
+}
+
+/*****************************************************************************/
+int ne_test_pnsp(int fileid)
+{
+  int	i, global_ids[NNSG], global_n_cnts[NNSG], global_df_cnts[NNSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(i=0; i < NNSG; i++) {
+    global_ids[i]=2*(i+1);
+    global_n_cnts[i]=3*(i+1);
+    global_df_cnts[i]=1;
+  }
+
+  return (ne_put_ns_param_global(fileid, global_ids, global_n_cnts,
+                                 global_df_cnts));
+}
+
+/*****************************************************************************/
+int ne_test_pssp(int fileid)
+{
+  int	i, global_ids[NSSG], global_el_cnts[NSSG], global_df_cnts[NSSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(i=0; i < NSSG; i++) {
+    global_ids[i]=3*(i+1);
+    global_el_cnts[i]=2*(i+1);
+    global_df_cnts[i]=1;
+  }
+
+  return (ne_put_ss_param_global(fileid, global_ids, global_el_cnts,
+                                 global_df_cnts));
+}
+
+/*****************************************************************************/
+int ne_test_pnm(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	node_mapi[NINTN], node_mapb[NBORN], node_mape[NEXTN];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(j=0; j < NINTN; node_mapi[j++]=j1++);
+    for(j=0; j < NBORN; node_mapb[j++]=j1++);
+    for(j=0; j < NEXTN; node_mape[j++]=j1++);
+    j1 = 0;
+    error = ne_put_node_map(fileid, node_mapi, node_mapb, node_mape, iproc);
+    if (error < 0) return error;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_pem(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	elem_mapi[NINTE], elem_mapb[NBORE];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(j=0; j < NINTE; elem_mapi[j++]=j1++);
+    for(j=0; j < NBORE; elem_mapb[j++]=j1++);
+    j1 = 0;
+    error = ne_put_elem_map(fileid, elem_mapi, elem_mapb, iproc);
+    if (error < 0) return error;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_pcmp(int fileid)
+{
+  int 	i, iproc, error;
+  int	node_map_ids[NNCMAP], node_map_node_cnts[NNCMAP];
+  int   elem_map_ids[NECMAP], elem_map_elem_cnts[NECMAP];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(i=0; i < NNCMAP; i++) {
+      node_map_ids[i]=(i+1);
+      node_map_node_cnts[i]=NCNTCM;
+    }
+
+    for(i=0; i < NECMAP; i++) {
+      elem_map_ids[i]=2*(i+1);
+      elem_map_elem_cnts[i]=ECNTCM;
+    }
+
+    error = ne_put_cmap_params(fileid, node_map_node_cnts, node_map_ids,
+                               elem_map_elem_cnts, elem_map_ids, iproc);
+    if (error < 0) return error;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_pncm(int fileid)
+{
+  int i, iproc, error;
+  int node_map_ids[NNCMAP], node_ids[NCNTCM], proc_ids[NCNTCM];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(i=0; i < NNCMAP; i++) {
+      node_map_ids[i]=(i+1);
+    }
+    for(i=0; i < NCNTCM; i++) {
+      node_ids[i] = 2*(i+1);
+      proc_ids[i] = 3*(i+1);
+    }
+
+    for(i=0; i < NNCMAP; i++) {
+      error = ne_put_node_cmap(fileid, node_map_ids[i], node_ids,
+                               proc_ids, iproc);
+      if (error < 0) return error;
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_pecm(int fileid)
+{
+  int i, iproc, error;
+  int elem_map_ids[NECMAP], elem_ids[ECNTCM], side_ids[ECNTCM];
+  int proc_ids[ECNTCM];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    for(i=0; i < NECMAP; i++) {
+      elem_map_ids[i]=2*(i+1);
+    }
+    for(i=0; i < ECNTCM; i++) {
+      elem_ids[i] = 2*(i+1);
+      side_ids[i] = 3*(i+1);
+      proc_ids[i] = 4*(i+1);
+    }
+
+    for(i=0; i < NECMAP; i++) {
+      error = ne_put_elem_cmap(fileid, elem_map_ids[i], elem_ids,
+                               side_ids, proc_ids, iproc);
+      if (error < 0) return error;
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_giinf(int fileid)
+{
+  int  error, nproc, nprocf;
+  char ftype[2];
+
+/*-----------------------------Execution Begins-----------------------------*/
+  error = ne_get_init_info(fileid, &nproc, &nprocf, ftype);
+
+  if (error < 0) return error;
+
+  if (nproc != NPROC) return -1;
+  if (nprocf != NPROCF) return -1;
+  if (strcmp(ftype, "s") != 0) return -1;
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_ginig(int fileid)
+{
+
+  int error;
+  int num_nodes_g, num_elems_g, num_elem_blks_g, num_ns_g, num_ss_g;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ne_get_init_global(fileid, &num_nodes_g, &num_elems_g,
+                             &num_elem_blks_g, &num_ns_g, &num_ss_g);
+
+  if (error < 0) return error;
+
+  if (num_nodes_g     != NNG)  return -1;
+  if (num_elems_g     != NEG)  return -1;
+  if (num_elem_blks_g != NEBG) return -1;
+  if (num_ns_g        != NNSG) return -1;
+  if (num_ss_g        != NSSG) return -1;
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gelbid(int fileid)
+{
+
+  int i, error;
+  int el_blk_ids[NEBG], el_blk_cnt[NEBG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ne_get_eb_info_global(fileid, el_blk_ids, el_blk_cnt);
+
+  if (error < 0) return error;
+
+  for(i=0; i < NEBG; i++) {
+    if (el_blk_ids[i] != (i+1)) return -1;
+    if (el_blk_cnt[i] != NEBCG) return -1;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gnsp(int fileid)
+{
+
+  int i, error;
+  int global_ids[NNSG], global_n_cnts[NNSG], global_df_cnts[NNSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ne_get_ns_param_global(fileid, global_ids, global_n_cnts,
+                                 global_df_cnts);
+
+  if (error < 0) return error;
+
+  for(i=0; i < NNSG; i++) {
+    if (global_ids[i]     != 2*(i+1)) return -1;
+    if (global_n_cnts[i]  != 3*(i+1)) return -1;
+    if (global_df_cnts[i] != 1      ) return -1;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gssp(int fileid)
+{
+
+  int i, error;
+  int global_ids[NSSG], global_e_cnts[NSSG], global_df_cnts[NSSG];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  error = ne_get_ss_param_global(fileid, global_ids, global_e_cnts,
+                                 global_df_cnts);
+
+  if (error < 0) return error;
+
+  for(i=0; i < NSSG; i++) {
+    if (global_ids[i]     != 3*(i+1)) return -1;
+    if (global_e_cnts[i]  != 2*(i+1)) return -1;
+    if (global_df_cnts[i] != 1      ) return -1;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_glbp(int fileid)
+{
+
+  int	iproc, error;
+  int	nintn, nborn, nextn, ninte, nbore, nncmap, necmap;
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    error = ne_get_loadbal_param(fileid, &nintn, &nborn, &nextn, &ninte,
+                                 &nbore, &nncmap, &necmap, iproc);
+
+    if (error < 0) return error;
+
+    if (nintn  != NINTN ) return -1;
+    if (nborn  != NBORN ) return -1;
+    if (nextn  != NEXTN ) return -1;
+    if (ninte  != NINTE ) return -1;
+    if (nbore  != NBORE ) return -1;
+    if (nncmap != NNCMAP) return -1;
+    if (necmap != NECMAP) return -1;
+
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gnm(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	node_mapi[NINTN], node_mapb[NBORN], node_mape[NEXTN];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    error = ne_get_node_map(fileid, node_mapi, node_mapb, node_mape, iproc);
+
+    if (error < 0) return error;
+
+    for(j=0; j < NINTN; j++) {
+      if (node_mapi[j] != j1++) return -1;
+    }
+    for(j=0; j < NBORN; j++) {
+      if (node_mapb[j] != j1++) return -1;
+    }
+    for(j=0; j < NEXTN; j++) {
+      if (node_mape[j] != j1++) return -1;
+    }
+
+    j1 = 0;
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gem(int fileid)
+{
+  int	iproc, j, error, j1=0;
+  int	elem_mapi[NINTE], elem_mapb[NBORE];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    error = ne_get_elem_map(fileid, elem_mapi, elem_mapb, iproc);
+
+    if (error < 0) return error;
+
+    for(j=0; j < NINTE; j++) {
+      if (elem_mapi[j] != j1++) return -1;
+    }
+    for(j=0; j < NBORE; j++) {
+      if (elem_mapb[j] != j1++) return -1;
+    }
+    j1 = 0;
+  }
+
+  return 0;
+
+}
+
+/*****************************************************************************/
+int ne_test_gncm(int fileid)
+{
+  int i, j, iproc, error;
+  int node_map_ids[NNCMAP], node_map_cnts[NNCMAP];
+  int node_ids[NCNTCM], proc_ids[NCNTCM];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    error = ne_get_cmap_params(fileid, node_map_ids, node_map_cnts,
+                               NULL, NULL, iproc);
+
+    if (error < 0) return error;
+
+    for(i=0; i < NNCMAP; i++) {
+      error = ne_get_node_cmap(fileid, node_map_ids[i], node_ids,
+                               proc_ids, iproc);
+
+      if (error < 0) return error;
+
+      for(j=0; j < NCNTCM; j++) {
+        if (node_ids[j] != 2*(j+1)) return -1;
+        if (proc_ids[j] != 3*(j+1)) return -1;
+      }
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_gecm(int fileid)
+{
+  int i, j, iproc, error;
+  int elem_ids[ECNTCM], elem_map_cnts[NECMAP], proc_ids[ECNTCM];
+  int side_ids[ECNTCM], elem_map_ids[NECMAP];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    error = ne_get_cmap_params(fileid, NULL, NULL,
+                               elem_map_ids, elem_map_cnts, iproc);
+
+    if (error < 0) return error;
+
+    for(i=0; i < NECMAP; i++) {
+      error = ne_get_elem_cmap(fileid, elem_map_ids[i], elem_ids,
+                               side_ids, proc_ids, iproc);
+
+      if (error < 0) return error;
+
+      for(j=0; j < ECNTCM; j++) {
+        if (elem_ids[j] != 2*(j+1)) return -1;
+        if (side_ids[j] != 3*(j+1)) return -1;
+        if (proc_ids[j] != 4*(j+1)) return -1;
+      }
+    }
+  }
+
+  return 0;
+}
+
+/*****************************************************************************/
+int ne_test_plbpc(int fileid)
+{
+  int   iproc;
+
+  int 	num_int_nodes[NPROCF], num_bor_nodes[NPROCF], num_ext_nodes[NPROCF];
+  int	num_int_elems[NPROCF], num_bor_elems[NPROCF];
+  int	num_node_cmaps[NPROCF], num_elem_cmaps[NPROCF];
+
+/*-----------------------------Execution Begins-----------------------------*/
+
+  /* Set up the vectors */
+  for(iproc=0; iproc < NPROCF; iproc++) {
+    num_int_nodes[iproc] = NINTN;
+    num_bor_nodes[iproc] = NBORN;
+    num_ext_nodes[iproc] = NEXTN;
+
+    num_int_elems[iproc] = NINTE;
+    num_bor_elems[iproc] = NBORE;
+
+    num_node_cmaps[iproc] = NNCMAP;
+    num_elem_cmaps[iproc] = NECMAP;
+  }
+
+  return (ne_put_loadbal_param_cc(fileid, num_int_nodes, num_bor_nodes,
+                                  num_ext_nodes, num_int_elems,
+                                  num_bor_elems, num_node_cmaps,
+                                  num_elem_cmaps));
+
+}
+
+/*****************************************************************************/
+int ne_test_pcmpc(int fileid)
+{
+  int   iproc, j, n_cntr, e_cntr;
+
+  int 	nmap_ids[NNCMAP*NPROCF], nmap_n_cnts[NNCMAP*NPROCF];
+  int   nmap_proc_ptr[NPROCF+1];
+  int	emap_ids[NECMAP*NPROCF], emap_e_cnts[NECMAP*NPROCF];
+  int   emap_proc_ptr[NPROCF+1];
+/*-----------------------------Execution Begins-----------------------------*/
+
+  nmap_proc_ptr[0] = 0;
+  emap_proc_ptr[0] = 0;
+  n_cntr = 0;
+  e_cntr = 0;
+  for(iproc=0; iproc < NPROCF; iproc++) {
+
+    for(j=0; j < NNCMAP; j++) {
+      nmap_ids[n_cntr]      = (j+1);
+      nmap_n_cnts[n_cntr++] = NCNTCM;
+    }
+
+    for(j=0; j < NECMAP; j++) {
+      emap_ids[e_cntr]      = 2*(j+1);
+      emap_e_cnts[e_cntr++] = ECNTCM;
+    }
+
+    nmap_proc_ptr[iproc+1] = nmap_proc_ptr[iproc] + NNCMAP;
+    emap_proc_ptr[iproc+1] = emap_proc_ptr[iproc] + NECMAP;
+  }
+
+
+  return (ne_put_cmap_params_cc(fileid, nmap_ids, nmap_n_cnts, nmap_proc_ptr,
+                                emap_ids, emap_e_cnts, emap_proc_ptr));
+}
diff --git a/nemesis/ne_nemesisI.h b/nemesis/ne_nemesisI.h
new file mode 100644
index 0000000..cbd5b87
--- /dev/null
+++ b/nemesis/ne_nemesisI.h
@@ -0,0 +1,492 @@
+/*
+ * Copyright (c) 1998 Sandia Corporation. Under the terms of Contract
+ * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Governement
+ * retains certain rights in this software.
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ * 
+ *     * Redistributions in binary form must reproduce the above
+ *       copyright notice, this list of conditions and the following
+ *       disclaimer in the documentation and/or other materials provided
+ *       with the distribution.  
+ * 
+ *     * Neither the name of Sandia Corporation nor the names of its
+ *       contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+
+/****************************************************************************
+ * This file contains prototypes for the functions found in the NEMESIS
+ * library.
+ ****************************************************************************/
+
+#ifndef _NE_NEMESIS_H
+#define _NE_NEMESIS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXODUS_II_HDR
+#include <stdint.h>
+  /** Specifies that this argument is the id of an entity: element block, nodeset, sideset, ... */
+  typedef int64_t ex_entity_id;
+  
+  /** The mechanism for passing double/float and int/int64_t both use a
+     void*; to avoid some confusion as to whether a function takes an
+     integer or a float/double, the following typedef is used for the
+     integer argument
+  */
+  typedef void void_int;
+#endif
+  
+/*=============================================================================
+ *     Initial Information Routines
+ *===========================================================================*/
+extern int
+ne_get_init_info(int   neid,		/* NemesisI file ID */
+                 int  *num_proc,	/* Number of processors */
+                 int  *num_proc_in_f,	/* Number of procs in this file */
+                 char *ftype
+                 );
+
+extern int
+ne_put_init_info(int   neid,		/* NemesisI file ID */
+                 int   num_proc,	/* Number of processors */
+                 int   num_proc_in_f,	/* Number of procs in this file */
+                 char *ftype
+                 );
+
+extern int
+ne_get_init_global(int   neid, 		  /* NemesisI file ID */
+                   void_int  *num_nodes_g,	  /* Number of global FEM nodes */
+                   void_int  *num_elems_g,	  /* Number of global FEM elements */
+                   void_int  *num_elem_blks_g, /* Number of global elem blocks */
+                   void_int  *num_node_sets_g, /* Number of global node sets */
+                   void_int  *num_side_sets_g  /* Number of global side sets */
+                   );
+extern int
+ne_put_init_global(int neid, 		/* NemesisI file ID */
+                   int64_t num_nodes_g,	/* Number of global FEM nodes */
+                   int64_t num_elems_g,	/* Number of global FEM elements */
+                   int64_t num_elem_blks_g,	/* Number of global elem blocks */
+                   int64_t num_node_sets_g,	/* Number of global node sets */
+                   int64_t num_side_sets_g	/* Number of global side sets */
+                   );
+
+extern int
+ne_put_version(int neid);
+  
+/*=============================================================================
+ *     Loadbalance Parameter Routines
+ *===========================================================================*/
+extern int
+ne_get_loadbal_param(int   neid, 	/* NetCDF/Exodus file ID */
+                     void_int  *num_int_nodes,  /* Number of internal FEM nodes */
+                     void_int  *num_bor_nodes,  /* Number of border FEM nodes */
+                     void_int  *num_ext_nodes,  /* Number of external FEM nodes */
+                     void_int  *num_int_elems,  /* Number of internal FEM elems */
+                     void_int  *num_bor_elems,  /* Number of border FEM elems */
+                     void_int  *num_node_cmaps, /* Number of nodal comm maps */
+                     void_int  *num_elem_cmaps, /* Number of elemental comm maps */
+                     int   processor         /* Processor ID */
+                     );
+
+extern int
+ne_put_loadbal_param(int   neid, 	  /* NemesisI file ID  */
+                     int64_t   num_int_nodes, /* Number of internal FEM nodes */
+                     int64_t   num_bor_nodes, /* Number of border FEM nodes */
+                     int64_t   num_ext_nodes, /* Number of external FEM nodes */
+                     int64_t   num_int_elems, /* Number of internal FEM elems */
+                     int64_t   num_bor_elems, /* Number of border FEM elems */
+                     int64_t   num_node_cmaps,/* Number of nodal comm maps */
+                     int64_t   num_elem_cmaps,/* Number of elemental comm maps */
+                     int       processor	  /* Processor ID */
+                     );
+
+extern int
+ne_put_loadbal_param_cc(int   neid,		/* NetCDF/Exodus file ID */
+                        void_int  *num_int_nodes,  /* Number of internal node IDs */
+                        void_int  *num_bor_nodes,  /* Number of border node IDs */
+                        void_int  *num_ext_nodes,  /* Number of external node IDs */
+                        void_int  *num_int_elems,  /* Number of internal elem IDs */
+                        void_int  *num_bor_elems,  /* Number of border elem IDs */
+                        void_int  *num_node_cmaps, /* Number of nodal comm maps */
+                        void_int  *num_elem_cmaps  /* Number of elem comm maps */
+                        );
+
+/*=============================================================================
+ *     NS, SS & EB Global Parameter Routines
+ *===========================================================================*/
+extern int
+ne_get_ns_param_global(int neid,	         /* NetCDF/Exodus file ID */
+                       void_int *ns_ids_glob,    /* Global IDs of node sets */
+                       void_int *ns_n_cnt_glob,  /* Count of nodes in node sets */
+                       void_int *ns_df_cnt_glob  /* Count of dist. factors in ns */
+                       );
+
+extern int
+ne_put_ns_param_global(int neid, 	         /* NemesisI file ID */
+                       void_int *global_ids,	 /* Vector of global node-set IDs */
+                       void_int *global_n_cnts,  /* Vector of node counts in node-sets */
+                       void_int *global_df_cnts  /* Vector of dist factor counts in node-sets */
+                       );
+
+extern int
+ne_get_ss_param_global(int neid,	    /* NetCDF/Exodus file ID */
+                       void_int *ss_ids_glob,    /* Global side-set IDs */
+                       void_int *ss_s_cnt_glob,  /* Global side count */
+                       void_int *ss_df_cnt_glob  /* Global dist. factor count */
+                       );
+
+extern int
+ne_put_ss_param_global(int neid, 	    /* NemesisI file ID */
+                       void_int *global_ids,	    /* Vector of global side-set IDs */
+                       void_int *global_el_cnts, /* Vector of element/side */
+					    /* counts in each side set */
+                       void_int *global_df_cnts  /* Vector of dist. factor */
+					    /* counts in each side set */
+                       );
+
+extern int
+ne_get_eb_info_global(int neid,		/* NemesisI file ID                 */
+                      void_int *el_blk_ids,	/* Vector of global element IDs     */
+                      void_int *el_blk_cnts	/* Vector of global element counts  */
+                      );
+
+extern int
+ne_put_eb_info_global(int neid,		/* NemesisI file ID */
+                      void_int *el_blk_ids,	/* Vector of global element IDs     */
+                      void_int *el_blk_cnts	/* Vector of global element counts  */
+                      );
+
+/*=============================================================================
+ *     NS, SS & EB Subset Routines
+ *===========================================================================*/
+extern int
+ne_get_n_side_set(int  neid,		    /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,	    /* Side-set ID to read */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,	    /* Number of sides to read */
+                  void_int *side_set_elem_list,  /* List of element IDs */
+                  void_int *side_set_side_list   /* List of side IDs */
+                  );
+
+extern int
+ne_put_n_side_set(int  neid,                /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,         /* Side-set ID to write */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,           /* Number of sides to write */
+                  const void_int *side_set_elem_list,  /* List of element IDs */
+                  const void_int *side_set_side_list   /* List of side IDs */
+                  );
+
+extern int
+ne_get_n_side_set_df(int   neid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,		/* Side-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *side_set_df 		/* Distribution factors */
+                     );
+
+extern int
+ne_put_n_side_set_df(int   neid,                /* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,         /* Side-set ID */
+                     int64_t   start_num,           /* Starting df number */
+                     int64_t   num_df_to_get,       /* Number of df's to write */
+                     void *side_set_df          /* Distribution factors */
+                     );
+
+extern int
+ne_get_n_node_set(int  neid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start reading at */
+                  int64_t  num_node,	   /* Number of nodes to read */
+                  void_int *node_set_node_list  /* List of nodes in node set */
+                  );
+
+extern int
+ne_put_n_node_set(int  neid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start writing at */
+                  int64_t  num_node,	   /* Number of nodes to write */
+                  const void_int *node_set_node_list  /* List of nodes in node set */
+                  );
+
+extern int
+ne_get_n_node_set_df(int   neid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *node_set_df 		/* Distribution factors */
+                     );
+
+extern int
+ne_put_n_node_set_df(int   neid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to write */
+                     void *node_set_df 		/* Distribution factors */
+                     );
+
+extern int
+ne_get_n_coord(int   neid,		/* NetCDF/Exodus file ID */
+               int64_t   start_node_num,	/* Starting position to read from */
+               int64_t   num_nodes,		/* Number of coords to read */
+               void *x_coor,		/* Vector of X coordinates */
+               void *y_coor,		/* Vector of Y coordinates */
+               void *z_coor		/* Vector of Z coordinates */
+               );
+
+extern int
+ne_put_n_coord(int   neid,              /* NetCDF/Exodus file ID */
+               int64_t start_node_num,    /* Starting position to write to */
+               int64_t num_nodes,         /* Number of coords to write */
+               void *x_coor,            /* Vector of X coordinates */
+               void *y_coor,            /* Vector of Y coordinates */
+               void *z_coor             /* Vector of Z coordinates */
+               );
+
+extern int
+ne_get_n_elem_conn (int   neid,		  /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	  /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to read from */
+                    int64_t   num_elems,	  /* Number of elements to read */
+                    void_int  *connect	  /* Connectivity vector */
+                    );
+
+extern int
+ne_put_n_elem_conn (int   neid,           /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,    /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to write to */
+                    int64_t   num_elems,      /* Number of elements to write */
+                    const void_int  *connect         /* Connectivity vector */
+);
+
+extern int
+ne_get_n_elem_attr (int   neid,		   /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	   /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to read from */
+                    int64_t   num_elems,	   /* Number of elements to read */
+                    void *attrib	   /* Attribute */
+                    );
+
+extern int
+ne_put_n_elem_attr (int   neid,            /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,     /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to write to */
+                    int64_t   num_elems,       /* Number of elements to write */
+                    void *attrib           /* Attribute */
+                    );
+
+extern int
+ne_get_elem_type(int   neid,            /* NetCDF/Exodus file ID */
+                 ex_entity_id   elem_blk_id,     /* Element block ID */
+                 char *elem_type        /* The name of the element type */
+                 );
+
+/*=============================================================================
+ *     Variable Routines
+ *===========================================================================*/
+extern int
+ne_get_n_elem_var (int   neid,              /* NetCDF/Exodus file ID */
+                   int   time_step,         /* time index */
+                   int   elem_var_index,    /* elemental variable index */
+                   ex_entity_id   elem_blk_id,       /* elemental block id */
+                   int64_t   num_elem_this_blk, /* number of elements in block */
+                   int64_t   start_elem_num,    /* Starting position for read */
+                   int64_t   num_elem,          /* Number of elements to read */
+                   void *elem_var_vals      /* variable values */
+                   );
+
+extern int
+ne_put_elem_var_slab (int   neid,           /* NetCDF/Exodus file ID */
+                      int   time_step,      /* time index */
+                      int   elem_var_index, /* elemental variable index */
+                      ex_entity_id   elem_blk_id,    /* elemental block id */
+                      int64_t   start_pos,      /* Starting position to write to */
+                      int64_t   num_vals,       /* Number of elements to write */
+                      void *elem_var_vals   /* variable values */
+                      );
+
+extern int
+ne_get_n_nodal_var(int   neid,               /* NetCDF/Exodus file ID */
+                   int   time_step,          /* whole time step number */
+                   int   nodal_var_index,    /* index of desired nodal var */
+                   int64_t   start_node_num,     /* starting node number */
+                   int64_t   num_nodes,          /* number of nodes to read */
+                   void *nodal_vars          /* array of nodal var values */
+                   );
+
+extern int
+ne_put_nodal_var_slab(int   neid,            /* NetCDF/Exodus file ID */
+                      int   time_step,       /* The time step index */
+                      int   nodal_var_index, /* Nodal variable index */
+                      int64_t   start_pos,       /* Start position for write */
+                      int64_t   num_vals,        /* Number of nodal variables */
+                      void *nodal_var_vals   /* Nodal variable values */
+                      );
+
+/*=============================================================================
+ *     Number Map Routines
+ *===========================================================================*/
+extern int
+ne_get_n_elem_num_map (int  neid,           /* NetCDF/Exodus file ID */
+                       int64_t  start_ent,      /* Starting position to read from */
+                       int64_t  num_ents,       /* Number of elements to read */
+                       void_int *elem_map        /* element map numbers */
+                       );
+
+extern int
+ne_put_n_elem_num_map (int  neid,           /* NetCDF/Exodus file ID */
+                       int64_t  start_ent,      /* Starting position to read from */
+                       int64_t  num_ents,       /* Number of elements to read */
+                       const void_int *elem_map        /* element map numbers */
+                       );
+
+extern int
+ne_get_n_node_num_map(int   neid,	     /* NetCDF/Exodus file ID */
+                      int64_t   start_ent,       /* starting node number */
+                      int64_t   num_ents,        /* number of nodes to read */
+                      void_int  *node_map         /* vector for node map */
+                      );
+
+extern int
+ne_put_n_node_num_map(int   neid,	     /* NetCDF/Exodus file ID */
+                      int64_t   start_ent,       /* starting node number */
+                      int64_t   num_ents,        /* number of nodes to read */
+                      const void_int  *node_map         /* vector for node map */
+                      );
+
+extern int
+ne_get_node_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *node_mapi,	/* Internal FEM node IDs */
+                void_int  *node_mapb,	/* Border FEM node IDs */
+                void_int  *node_mape,	/* External FEM node IDs */
+                int   processor		/* Processor IDs */
+                );
+
+extern int
+ne_put_node_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *node_mapi,	/* Internal FEM node IDs */
+                void_int  *node_mapb,	/* Border FEM node IDs */
+                void_int  *node_mape,	/* External FEM node IDs */
+                int   processor		/* This processor ID */
+                );
+
+extern int
+ne_get_elem_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *elem_mapi,	/* Internal element IDs */
+                void_int  *elem_mapb,	/* Border element IDs */
+                int   processor		/* Processor ID */
+                );
+
+extern int
+ne_put_elem_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *elem_mapi,	/* Internal FEM element IDs */
+                void_int  *elem_mapb,	/* Border FEM element IDs */
+                int   processor		/* This processor ID */
+                );
+
+
+/*=============================================================================
+ *     Communications Maps Routines
+ *===========================================================================*/
+
+extern int
+ne_get_cmap_params(int neid,                  /* NetCDF/Exodus file ID */
+                   void_int *node_cmap_ids,        /* Nodal comm. map IDs */
+                   void_int *node_cmap_node_cnts,  /* Number of nodes in each map */
+                   void_int *elem_cmap_ids,        /* Elemental comm. map IDs */
+                   void_int *elem_cmap_elem_cnts,  /* Number of elems in each map */
+                   int  processor             /* This processor ID */
+                   );
+
+extern int
+ne_put_cmap_params(int  neid,			/* NetCDF/Exodus file ID */
+                   void_int *node_map_ids,	/* Node map IDs */
+                   void_int *node_map_node_cnts,/* Nodes in nodal comm */
+                   void_int *elem_map_ids,	/* Elem map IDs */
+                   void_int *elem_map_elem_cnts,/* Elems in elemental comm */
+                   int64_t   processor		/* This processor ID */
+                   );
+
+extern int
+ne_put_cmap_params_cc(int  neid,		/* NetCDF/Exodus file ID */
+                      void_int *node_map_ids,	/* Node map IDs */
+                      void_int *node_map_node_cnts,	/* Nodes in nodal comm */
+                      void_int *node_proc_ptrs,      /* Pointer into array for */
+						/* node maps		  */
+                      void_int *elem_map_ids,	/* Elem map IDs */
+                      void_int *elem_map_elem_cnts,	/* Elems in elemental comm */
+                      void_int *elem_proc_ptrs	/* Pointer into array for */
+						/* elem maps		  */
+                      );
+
+extern int
+ne_get_node_cmap(int  neid,             /* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,           /* Map ID */
+                 void_int *node_ids,         /* FEM node IDs */
+                 void_int *proc_ids,         /* Processor IDs */
+                 int  processor         /* This processor ID */
+                 );
+
+extern int
+ne_put_node_cmap(int  neid,	/* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,	/* Nodal comm map ID */
+                 void_int *node_ids,	/* FEM node IDs */
+                 void_int *proc_ids, /* Processor IDs */
+                 int  processor	/* This processor ID */
+                 );
+
+extern int
+ne_get_elem_cmap(int  neid,     /* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,   /* Elemental comm map ID */
+                 void_int *elem_ids, /* Element IDs */
+                 void_int *side_ids, /* Element side IDs */
+                 void_int *proc_ids, /* Processor IDs */
+                 int  processor /* This processor ID */
+                 );
+
+extern int
+ne_put_elem_cmap(int  neid,	/* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,	/* Elemental comm map ID */
+                 void_int *elem_ids,	/* Vector of element IDs */
+                 void_int *side_ids, /* Vector of side IDs */
+                 void_int *proc_ids, /* Vector of processor IDs */
+                 int  processor	/* This processor ID */
+                 );
+
+  /* Should be internal use only, but was in external include file for
+     nemesis and some codes are using the function
+  */
+  int ne_get_idx(int      neid,	 /* NetCDF/Exodus file ID */
+		 const char *ne_var_name, /* Nemesis index variable name */
+		 int64_t *index,	 /* array of length 2 to hold results */
+		 int      pos		 /* position of this proc/cmap in index */
+		 );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NE_NEMESIS_H */
diff --git a/nemesis/ne_nemesisI_int.h b/nemesis/ne_nemesisI_int.h
new file mode 100644
index 0000000..23a76ea
--- /dev/null
+++ b/nemesis/ne_nemesisI_int.h
@@ -0,0 +1,3 @@
+/* Dummy file  -- Not needed after integration of nemesis library into exodus. */
+
+/* Provided in case an application used to include this file in the past. */
diff --git a/nemesis/nemesis_cfg.h.in b/nemesis/nemesis_cfg.h.in
new file mode 100755
index 0000000..dd32b4a
--- /dev/null
+++ b/nemesis/nemesis_cfg.h.in
@@ -0,0 +1,25 @@
+#ifndef __nemesis_cfg_h
+#define __nemesis_cfg_h
+
+#define NEMESIS_VERSION_MAJOR @NEMESIS_VERSION_MAJOR@
+#define NEMESIS_VERSION_MINOR @NEMESIS_VERSION_MINOR@
+#define NEMESIS_VERSION_PATCH @NEMESIS_VERSION_PATCH@
+#define NEMESIS_VERSION "@NEMESIS_VERSION_MAJOR at .@NEMESIS_VERSION_MINOR at .@NEMESIS_VERSION_PATCH@"
+
+#if defined(_WIN32) && !defined(WIN32)
+# define WIN32
+#endif
+
+#cmakedefine NEMESIS_BUILD_SHARED_LIBS
+#if defined(WIN32) && defined(NEMESIS_BUILD_SHARED_LIBS)
+#  if defined(nemc_EXPORTS)
+#    define NEMESIS_EXPORT __declspec( dllexport ) extern
+#  else
+#    define NEMESIS_EXPORT __declspec( dllimport ) extern
+#  endif
+#else
+#  define NEMESIS_EXPORT extern
+#endif
+
+#endif
+
diff --git a/nemesis/nemesis_wrapper.c b/nemesis/nemesis_wrapper.c
new file mode 100644
index 0000000..531998a
--- /dev/null
+++ b/nemesis/nemesis_wrapper.c
@@ -0,0 +1,596 @@
+#include <exodusII.h>
+#include <exodusII_int.h>
+#include <ne_nemesisI.h>
+
+/*=============================================================================
+ *     Initial Information Routines
+ *===========================================================================*/
+int
+ne_get_init_info(int   neid,		/* NemesisI file ID */
+                 int  *num_proc,	/* Number of processors */
+                 int  *num_proc_in_f,	/* Number of procs in this file */
+                 char *ftype)
+{
+  return ex_get_init_info(neid, num_proc, num_proc_in_f, ftype);
+}
+
+int
+ne_put_init_info(int   neid,		/* NemesisI file ID */
+                 int   num_proc,	/* Number of processors */
+                 int   num_proc_in_f,	/* Number of procs in this file */
+                 char *ftype)
+{
+  return ex_put_init_info(neid, num_proc, num_proc_in_f, ftype);
+}
+
+int
+ne_get_init_global(int   neid, 		  /* NemesisI file ID */
+                   void_int  *num_nodes_g,	  /* Number of global FEM nodes */
+                   void_int  *num_elems_g,	  /* Number of global FEM elements */
+                   void_int  *num_elem_blks_g, /* Number of global elem blocks */
+                   void_int  *num_node_sets_g, /* Number of global node sets */
+                   void_int  *num_side_sets_g  /* Number of global side sets */
+                   )
+{
+  return ex_get_init_global(neid, num_nodes_g, num_elems_g, num_elem_blks_g, num_node_sets_g, num_side_sets_g);
+}
+
+int
+ne_put_init_global(int neid, 		/* NemesisI file ID */
+                   int64_t num_nodes_g,	/* Number of global FEM nodes */
+                   int64_t num_elems_g,	/* Number of global FEM elements */
+                   int64_t num_elem_blks_g,	/* Number of global elem blocks */
+                   int64_t num_node_sets_g,	/* Number of global node sets */
+                   int64_t num_side_sets_g	/* Number of global side sets */
+                   )
+{
+  return ex_put_init_global(neid, num_nodes_g, num_elems_g, num_elem_blks_g, num_node_sets_g, num_side_sets_g);
+}
+
+int ne_put_version(int neid)
+{
+  return ex_put_nemesis_version(neid);
+}
+
+/*=============================================================================
+ *     Loadbalance Parameter Routines
+ *===========================================================================*/
+int
+ne_get_loadbal_param(int   neid, 	/* NetCDF/Exodus file ID */
+                     void_int  *num_int_nodes,  /* Number of internal FEM nodes */
+                     void_int  *num_bor_nodes,  /* Number of border FEM nodes */
+                     void_int  *num_ext_nodes,  /* Number of external FEM nodes */
+                     void_int  *num_int_elems,  /* Number of internal FEM elems */
+                     void_int  *num_bor_elems,  /* Number of border FEM elems */
+                     void_int  *num_node_cmaps, /* Number of nodal comm maps */
+                     void_int  *num_elem_cmaps, /* Number of elemental comm maps */
+                     int   processor         /* Processor ID */
+                     )
+{
+  return ex_get_loadbal_param(neid,
+			      num_int_nodes, num_bor_nodes, num_ext_nodes,
+			      num_int_elems, num_bor_elems,
+			      num_node_cmaps, num_elem_cmaps, processor);
+}
+
+int
+ne_put_loadbal_param(int   neid, 	  /* NemesisI file ID  */
+                     int64_t   num_int_nodes, /* Number of internal FEM nodes */
+                     int64_t   num_bor_nodes, /* Number of border FEM nodes */
+                     int64_t   num_ext_nodes, /* Number of external FEM nodes */
+                     int64_t   num_int_elems, /* Number of internal FEM elems */
+                     int64_t   num_bor_elems, /* Number of border FEM elems */
+                     int64_t   num_node_cmaps,/* Number of nodal comm maps */
+                     int64_t   num_elem_cmaps,/* Number of elemental comm maps */
+                     int       processor	  /* Processor ID */
+                     )
+{
+  return ex_put_loadbal_param(neid,
+			      num_int_nodes, num_bor_nodes, num_ext_nodes,
+			      num_int_elems, num_bor_elems,
+			      num_node_cmaps, num_elem_cmaps, processor);
+}
+
+int
+ne_put_loadbal_param_cc(int   neid,		/* NetCDF/Exodus file ID */
+                        void_int  *num_int_nodes,  /* Number of internal node IDs */
+                        void_int  *num_bor_nodes,  /* Number of border node IDs */
+                        void_int  *num_ext_nodes,  /* Number of external node IDs */
+                        void_int  *num_int_elems,  /* Number of internal elem IDs */
+                        void_int  *num_bor_elems,  /* Number of border elem IDs */
+                        void_int  *num_node_cmaps, /* Number of nodal comm maps */
+                        void_int  *num_elem_cmaps  /* Number of elem comm maps */
+                        )
+{
+  return ex_put_loadbal_param_cc(neid,
+				 num_int_nodes, num_bor_nodes, num_ext_nodes,
+				 num_int_elems, num_bor_elems,
+				 num_node_cmaps, num_elem_cmaps);
+}
+
+
+/*=============================================================================
+ *     NS, SS & EB Global Parameter Routines
+ *===========================================================================*/
+int
+ne_get_ns_param_global(int neid,	         /* NetCDF/Exodus file ID */
+                       void_int *ns_ids_glob,    /* Global IDs of node sets */
+                       void_int *ns_n_cnt_glob,  /* Count of nodes in node sets */
+                       void_int *ns_df_cnt_glob  /* Count of dist. factors in ns */
+                       )
+{
+  return ex_get_ns_param_global(neid, ns_ids_glob, ns_n_cnt_glob, ns_df_cnt_glob);
+}
+
+int
+ne_put_ns_param_global(int neid, 	         /* NemesisI file ID */
+                       void_int *global_ids,	 /* Vector of global node-set IDs */
+                       void_int *global_n_cnts,  /* Vector of node counts in node-sets */
+                       void_int *global_df_cnts  /* Vector of dist factor counts in node-sets */
+                       )
+{
+  return ex_put_ns_param_global(neid, global_ids, global_n_cnts, global_df_cnts);
+}
+
+int
+ne_get_ss_param_global(int neid,	    /* NetCDF/Exodus file ID */
+                       void_int *ss_ids_glob,    /* Global side-set IDs */
+                       void_int *ss_s_cnt_glob,  /* Global side count */
+                       void_int *ss_df_cnt_glob  /* Global dist. factor count */
+                       )
+{
+  return ex_get_ss_param_global(neid, ss_ids_glob, ss_s_cnt_glob, ss_df_cnt_glob);
+}
+
+int
+ne_put_ss_param_global(int neid, 	    /* NemesisI file ID */
+                       void_int *global_ids,	    /* Vector of global side-set IDs */
+                       void_int *global_el_cnts, /* Vector of element/side */
+					    /* counts in each side set */
+                       void_int *global_df_cnts  /* Vector of dist. factor */
+					    /* counts in each side set */
+                       )
+{
+  return ex_put_ss_param_global(neid, global_ids, global_el_cnts, global_df_cnts);
+}
+
+
+int
+ne_get_eb_info_global(int neid,		/* NemesisI file ID                 */
+                      void_int *el_blk_ids,	/* Vector of global element IDs     */
+                      void_int *el_blk_cnts	/* Vector of global element counts  */
+                      )
+{
+  return ex_get_eb_info_global(neid, el_blk_ids, el_blk_cnts);
+}
+
+int
+ne_put_eb_info_global(int neid,		/* NemesisI file ID */
+                      void_int *el_blk_ids,	/* Vector of global element IDs     */
+                      void_int *el_blk_cnts	/* Vector of global element counts  */
+                      )
+{
+  return ex_put_eb_info_global(neid, el_blk_ids, el_blk_cnts);
+}
+
+
+/*=============================================================================
+ *     NS, SS & EB Subset Routines
+ *===========================================================================*/
+int
+ne_get_n_side_set(int  neid,		    /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,	    /* Side-set ID to read */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,	    /* Number of sides to read */
+                  void_int *side_set_elem_list,  /* List of element IDs */
+                  void_int *side_set_side_list   /* List of side IDs */
+                  )
+{
+  return ex_get_n_side_set(neid, side_set_id, start_side_num, num_sides, side_set_elem_list, side_set_side_list);
+}
+
+int
+ne_put_n_side_set(int  neid,                /* NetCDF/Exodus file ID */
+                  ex_entity_id side_set_id,         /* Side-set ID to write */
+                  int64_t  start_side_num,      /* Starting element number */
+                  int64_t  num_sides,           /* Number of sides to write */
+                  const void_int *side_set_elem_list,  /* List of element IDs */
+                  const void_int *side_set_side_list   /* List of side IDs */
+                  )
+{
+  return ex_put_n_side_set(neid, side_set_id, start_side_num, num_sides, side_set_elem_list, side_set_side_list);
+}
+
+
+int
+ne_get_n_side_set_df(int   neid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,		/* Side-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *side_set_df 		/* Distribution factors */
+                     )
+{
+  return ex_get_n_side_set_df(neid, side_set_id, start_num, num_df_to_get, side_set_df);
+}
+
+int
+ne_put_n_side_set_df(int   neid,                /* NetCDF/Exodus file ID */
+                     ex_entity_id   side_set_id,         /* Side-set ID */
+                     int64_t   start_num,           /* Starting df number */
+                     int64_t   num_df_to_get,       /* Number of df's to write */
+                     void *side_set_df          /* Distribution factors */
+                     )
+{
+  return ex_put_n_side_set_df(neid, side_set_id, start_num, num_df_to_get, side_set_df);
+}
+
+
+int
+ne_get_n_node_set(int  neid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start reading at */
+                  int64_t  num_node,	   /* Number of nodes to read */
+                  void_int *node_set_node_list  /* List of nodes in node set */
+                  )
+{
+  return ex_get_n_node_set(neid, node_set_id, start_node_num, num_node, node_set_node_list);
+}
+
+int
+ne_put_n_node_set(int  neid,		   /* NetCDF/Exodus file ID */
+                  ex_entity_id  node_set_id,	   /* Node set ID */
+                  int64_t  start_node_num,	   /* Node index to start writing at */
+                  int64_t  num_node,	   /* Number of nodes to write */
+                  const void_int *node_set_node_list  /* List of nodes in node set */
+                  )
+{
+  return ex_put_n_node_set(neid, node_set_id, start_node_num, num_node, node_set_node_list);
+}
+
+int
+ne_get_n_node_set_df(int   neid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to read */
+                     void *node_set_df 		/* Distribution factors */
+                     )
+{
+  return ex_get_n_node_set_df(neid, node_set_id, start_num, num_df_to_get, node_set_df);
+}
+
+int
+ne_put_n_node_set_df(int   neid,		/* NetCDF/Exodus file ID */
+                     ex_entity_id   node_set_id,		/* Node-set ID */
+                     int64_t   start_num,		/* Starting df number */
+                     int64_t   num_df_to_get,	/* Number of df's to write */
+                     void *node_set_df 		/* Distribution factors */
+                     )
+{
+  return ex_put_n_node_set_df(neid, node_set_id, start_num, num_df_to_get, node_set_df);
+}
+
+int
+ne_get_n_coord(int   neid,		/* NetCDF/Exodus file ID */
+               int64_t   start_node_num,	/* Starting position to read from */
+               int64_t   num_nodes,		/* Number of coords to read */
+               void *x_coor,		/* Vector of X coordinates */
+               void *y_coor,		/* Vector of Y coordinates */
+               void *z_coor		/* Vector of Z coordinates */
+               )
+{
+  return ex_get_n_coord(neid, start_node_num, num_nodes, x_coor, y_coor, z_coor);
+}
+
+int
+ne_put_n_coord(int   neid,              /* NetCDF/Exodus file ID */
+               int64_t start_node_num,    /* Starting position to write to */
+               int64_t num_nodes,         /* Number of coords to write */
+               void *x_coor,            /* Vector of X coordinates */
+               void *y_coor,            /* Vector of Y coordinates */
+               void *z_coor             /* Vector of Z coordinates */
+               )
+{
+  return ex_put_n_coord(neid, start_node_num, num_nodes, x_coor, y_coor, z_coor);
+}
+
+int
+ne_get_n_elem_conn (int   neid,		  /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	  /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to read from */
+                    int64_t   num_elems,	  /* Number of elements to read */
+                    void_int  *connect	  /* Connectivity vector */
+                    )
+{
+  return ex_get_n_elem_conn(neid, elem_blk_id, start_elem_num, num_elems, connect);
+}
+
+int
+ne_put_n_elem_conn (int   neid,           /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,    /* Element block ID */
+                    int64_t   start_elem_num, /* Starting position to write to */
+                    int64_t   num_elems,      /* Number of elements to write */
+                    const void_int  *connect         /* Connectivity vector */
+		    )
+{
+  return ex_put_n_elem_conn(neid, elem_blk_id, start_elem_num, num_elems, connect);
+}
+
+int
+ne_get_n_elem_attr (int   neid,		   /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,	   /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to read from */
+                    int64_t   num_elems,	   /* Number of elements to read */
+                    void *attrib	   /* Attribute */
+                    )
+{
+  return ex_get_n_elem_attr(neid, elem_blk_id, start_elem_num, num_elems, attrib);
+}
+
+int
+ne_put_n_elem_attr (int   neid,            /* NetCDF/Exodus file ID */
+                    ex_entity_id   elem_blk_id,     /* Element block ID */
+                    int64_t   start_elem_num,  /* Starting position to write to */
+                    int64_t   num_elems,       /* Number of elements to write */
+                    void *attrib           /* Attribute */
+                    )
+{
+  return ex_put_n_elem_attr(neid, elem_blk_id, start_elem_num, num_elems, attrib);
+}
+
+int
+ne_get_elem_type(int   neid,            /* NetCDF/Exodus file ID */
+                 ex_entity_id   elem_blk_id,     /* Element block ID */
+                 char *elem_type        /* The name of the element type */
+                 )
+{
+  return ex_get_elem_type(neid, elem_blk_id, elem_type);
+}
+
+/*=============================================================================
+ *     Variable Routines
+ *===========================================================================*/
+int
+ne_get_n_elem_var (int   neid,              /* NetCDF/Exodus file ID */
+                   int   time_step,         /* time index */
+                   int   elem_var_index,    /* elemental variable index */
+                   ex_entity_id   elem_blk_id,       /* elemental block id */
+                   int64_t   num_elem_this_blk, /* number of elements in block */
+                   int64_t   start_elem_num,    /* Starting position for read */
+                   int64_t   num_elem,          /* Number of elements to read */
+                   void *elem_var_vals      /* variable values */
+                   )
+{
+  return ex_get_n_var(neid, time_step, EX_ELEM_BLOCK,
+                      elem_var_index, elem_blk_id,
+                      start_elem_num, num_elem,
+                      elem_var_vals);
+}
+
+int
+ne_put_elem_var_slab (int   neid,           /* NetCDF/Exodus file ID */
+                      int   time_step,      /* time index */
+                      int   elem_var_index, /* elemental variable index */
+                      ex_entity_id   elem_blk_id,    /* elemental block id */
+                      int64_t   start_pos,      /* Starting position to write to */
+                      int64_t   num_vals,       /* Number of elements to write */
+                      void *elem_var_vals   /* variable values */
+                      )
+{
+  return ex_put_elem_var_slab(neid, time_step, elem_var_index, elem_blk_id, start_pos, num_vals, elem_var_vals);
+}
+
+int
+ne_get_n_nodal_var(int   neid,               /* NetCDF/Exodus file ID */
+                   int   time_step,          /* whole time step number */
+                   int   nodal_var_index,    /* index of desired nodal var */
+                   int64_t   start_node_num,     /* starting node number */
+                   int64_t   num_nodes,          /* number of nodes to read */
+                   void *nodal_vars          /* array of nodal var values */
+                   )
+{
+  return ex_get_n_var(neid, time_step, EX_NODAL,
+                      nodal_var_index, 1,
+                      start_node_num, num_nodes,
+                      nodal_vars);
+}
+
+int
+ne_put_nodal_var_slab(int   neid,            /* NetCDF/Exodus file ID */
+                      int   time_step,       /* The time step index */
+                      int   nodal_var_index, /* Nodal variable index */
+                      int64_t   start_pos,       /* Start position for write */
+                      int64_t   num_vals,        /* Number of nodal variables */
+                      void *nodal_var_vals   /* Nodal variable values */
+                      )
+{
+  return ex_put_nodal_var_slab(neid, time_step, nodal_var_index, start_pos, num_vals, nodal_var_vals);
+}
+
+/*=============================================================================
+ *     Number Map Routines
+ *===========================================================================*/
+int
+ne_get_n_elem_num_map (int  neid,           /* NetCDF/Exodus file ID */
+                       int64_t  start_ent,      /* Starting position to read from */
+                       int64_t  num_ents,       /* Number of elements to read */
+                       void_int *elem_map        /* element map numbers */
+                       )
+{
+  return ex_get_n_elem_num_map(neid, start_ent, num_ents, elem_map);
+}
+
+int
+ne_put_n_elem_num_map (int  neid,           /* NetCDF/Exodus file ID */
+                       int64_t  start_ent,      /* Starting position to read from */
+                       int64_t  num_ents,       /* Number of elements to read */
+                       const void_int *elem_map        /* element map numbers */
+                       )
+{
+  return ex_put_partial_id_map(neid, EX_ELEM_MAP, start_ent, num_ents, elem_map);
+}
+
+int
+ne_get_n_node_num_map(int   neid,	     /* NetCDF/Exodus file ID */
+                      int64_t   start_ent,       /* starting node number */
+                      int64_t   num_ents,        /* number of nodes to read */
+                      void_int  *node_map         /* vector for node map */
+                      )
+{
+  return ex_get_n_node_num_map(neid, start_ent, num_ents, node_map);
+}
+
+int
+ne_put_n_node_num_map(int   neid,	     /* NetCDF/Exodus file ID */
+                      int64_t   start_ent,       /* starting node number */
+                      int64_t   num_ents,        /* number of nodes to read */
+                      const void_int  *node_map         /* vector for node map */
+                      )
+{
+  return ex_put_partial_id_map(neid, EX_NODE_MAP, start_ent, num_ents, node_map);
+}
+
+int
+ne_get_node_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *node_mapi,	/* Internal FEM node IDs */
+                void_int  *node_mapb,	/* Border FEM node IDs */
+                void_int  *node_mape,	/* External FEM node IDs */
+                int   processor		/* Processor IDs */
+                )
+{
+  return ex_get_processor_node_maps(neid, node_mapi, node_mapb, node_mape, processor);
+}
+
+int
+ne_put_node_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *node_mapi,	/* Internal FEM node IDs */
+                void_int  *node_mapb,	/* Border FEM node IDs */
+                void_int  *node_mape,	/* External FEM node IDs */
+                int   processor		/* This processor ID */
+                )
+{
+  return ex_put_processor_node_maps(neid, node_mapi, node_mapb, node_mape, processor);
+}
+
+int
+ne_get_elem_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *elem_mapi,	/* Internal element IDs */
+                void_int  *elem_mapb,	/* Border element IDs */
+                int   processor		/* Processor ID */
+                )
+{
+  return ex_get_processor_elem_maps(neid, elem_mapi, elem_mapb, processor);
+}
+
+int
+ne_put_elem_map(int   neid,		/* NetCDF/Exodus file ID */
+                void_int  *elem_mapi,	/* Internal FEM element IDs */
+                void_int  *elem_mapb,	/* Border FEM element IDs */
+                int   processor		/* This processor ID */
+                )
+{
+  return ex_put_processor_elem_maps(neid, elem_mapi, elem_mapb, processor);
+}
+
+
+/*=============================================================================
+ *     Communications Maps Routines
+ *===========================================================================*/
+
+int
+ne_get_cmap_params(int neid,                  /* NetCDF/Exodus file ID */
+                   void_int *node_cmap_ids,        /* Nodal comm. map IDs */
+                   void_int *node_cmap_node_cnts,  /* Number of nodes in each map */
+                   void_int *elem_cmap_ids,        /* Elemental comm. map IDs */
+                   void_int *elem_cmap_elem_cnts,  /* Number of elems in each map */
+                   int  processor             /* This processor ID */
+                   )
+{
+  return ex_get_cmap_params(neid, node_cmap_ids, node_cmap_node_cnts, elem_cmap_ids, elem_cmap_elem_cnts, processor);
+}
+
+int
+ne_put_cmap_params(int  neid,			/* NetCDF/Exodus file ID */
+                   void_int *node_map_ids,	/* Node map IDs */
+                   void_int *node_map_node_cnts,/* Nodes in nodal comm */
+                   void_int *elem_map_ids,	/* Elem map IDs */
+                   void_int *elem_map_elem_cnts,/* Elems in elemental comm */
+                   int64_t   processor		/* This processor ID */
+                   )
+{
+  return ex_put_cmap_params(neid, node_map_ids, node_map_node_cnts, elem_map_ids, elem_map_elem_cnts, processor);
+}
+
+int
+ne_put_cmap_params_cc(int  neid,		/* NetCDF/Exodus file ID */
+                      void_int *node_map_ids,	/* Node map IDs */
+                      void_int *node_map_node_cnts,	/* Nodes in nodal comm */
+                      void_int *node_proc_ptrs,      /* Pointer into array for */
+						/* node maps		  */
+                      void_int *elem_map_ids,	/* Elem map IDs */
+                      void_int *elem_map_elem_cnts,	/* Elems in elemental comm */
+                      void_int *elem_proc_ptrs	/* Pointer into array for */
+						/* elem maps		  */
+                      )
+{
+  return ex_put_cmap_params_cc(neid,
+			       node_map_ids, node_map_node_cnts, node_proc_ptrs,
+			       elem_map_ids, elem_map_elem_cnts, elem_proc_ptrs);
+}
+
+
+int
+ne_get_node_cmap(int  neid,             /* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,           /* Map ID */
+                 void_int *node_ids,         /* FEM node IDs */
+                 void_int *proc_ids,         /* Processor IDs */
+                 int  processor         /* This processor ID */
+                 )
+{
+  return ex_get_node_cmap(neid, map_id, node_ids, proc_ids, processor);
+}
+
+int
+ne_put_node_cmap(int  neid,	/* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,	/* Nodal comm map ID */
+                 void_int *node_ids,	/* FEM node IDs */
+                 void_int *proc_ids, /* Processor IDs */
+                 int  processor	/* This processor ID */
+                 )
+{
+  return ex_put_node_cmap(neid, map_id, node_ids, proc_ids, processor);
+}
+
+int
+ne_get_elem_cmap(int  neid,     /* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,   /* Elemental comm map ID */
+                 void_int *elem_ids, /* Element IDs */
+                 void_int *side_ids, /* Element side IDs */
+                 void_int *proc_ids, /* Processor IDs */
+                 int  processor /* This processor ID */
+                 )
+{
+  return ex_get_elem_cmap(neid, map_id, elem_ids, side_ids, proc_ids, processor);
+}
+
+
+int
+ne_put_elem_cmap(int  neid,	/* NetCDF/Exodus file ID */
+                 ex_entity_id  map_id,	/* Elemental comm map ID */
+                 void_int *elem_ids,	/* Vector of element IDs */
+                 void_int *side_ids, /* Vector of side IDs */
+                 void_int *proc_ids, /* Vector of processor IDs */
+                 int  processor	/* This processor ID */
+                 )
+{
+  return ex_put_elem_cmap(neid, map_id, elem_ids, side_ids, proc_ids, processor);
+}
+
+int ne_get_idx(int      neid,	 /* NetCDF/Exodus file ID */
+	       const char *ne_var_name, /* Nemesis index variable name */
+	       int64_t *index,	 /* array of length 2 to hold results */
+	       int      pos		 /* position of this proc/cmap in index */
+	       )
+{
+  return ex_get_idx(neid, ne_var_name, index, pos);
+}
+

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



More information about the debian-science-commits mailing list