Repository: eWaterCycle/grpc4bmi (language: python)

Issue:
Upgrade to protobuf v4
A major version of protobuf was released see https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates . We should check if we can upgrade to 4

Protobuf is used by grpc which is used as 
1. client, in [eWaterCycle](https://github.com/eWaterCycle/ewatercycle)
2. server, inside container images of Hydrological models.

We should make sure that server using protobuf v3 can talk to client with protobuf v3. If not we need to rebuild all container images.

When using v4 of protobuf to run tests in grpc4bmi v0.2.14 you get following error:

```
test/test_docker.py:6: in <module>
    from grpc4bmi.bmi_client_docker import BmiClientDocker
grpc4bmi/bmi_client_docker.py:9: in <module>
    from grpc4bmi.bmi_grpc_client import BmiClient
grpc4bmi/bmi_grpc_client.py:13: in <module>
    from . import bmi_pb2, bmi_pb2_grpc
grpc4bmi/bmi_pb2.py:28: in <module>
    _EMPTY = _descriptor.Descriptor(
/opt/hostedtoolcache/Python/3.10.7/x64/lib/python3.10/site-packages/google/protobuf/descriptor.py:313: in __new__
    _message.Message._CheckCalledFromGeneratedFile()
E   TypeError: Descriptors cannot not be created directly.
E   If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
E   If you cannot immediately regenerate your protos, some other possible workarounds are:
E    1. Downgrade the protobuf package to 3.20.x or lower.
E    2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
E   
E   More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates
```
Typeguard3 compat
Fixes #128 


Discussion / hints:

Fix patch:
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..64e336c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,3 @@
+# Apptainer images
+*.sif
+/.venv
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 657d060..bf589ea 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -30,7 +30,7 @@ jobs:
       run: docker pull ewatercycle/walrus-grpc4bmi:v0.3.1
     - name: Cache Apptainer image
       id: cache-apptainer-image
-      uses: actions/cache@v2
+      uses: actions/cache@v3
       with:
         path: ~/.apptainer
         key: apptainer-image
@@ -63,14 +63,25 @@ jobs:
       - name: Install grpc
         uses: ewatercycle/setup-grpc@v4
         with:
-          grpc-version: 1.48.2
+          grpc-version: 1.51.1
       - name: Copy grpc to system default
         run: |
           sudo rsync -a $GRPC_ROOT/ /usr/local
           sudo ldconfig
-      - name: Build & install bmi-c
-        run: mkdir -p build && cd build && cmake .. && sudo make install
-        working-directory: cpp/bmi-c
+      - name: Install bmi-cxx
+        run: |
+          git clone -b v2.0 https://github.com/csdms/bmi-cxx.git bmi-cxx
+          mkdir bmi-cxx/build 
+          cd bmi-cxx/build
+          cmake ..
+          make install
+      - name: Install bmi-cxx
+        run: |
+          git clone -b v2.1 https://github.com/csdms/bmi-c.git bmi-c
+          mkdir bmi-c/build 
+          cd bmi-c/build
+          cmake ..
+          make install          
       - name: Build dir
         run: mkdir -p cpp/build
       - name: configure
diff --git a/.gitignore b/.gitignore
index 96604a8..0d24000 100644
--- a/.gitignore
+++ b/.gitignore
@@ -100,3 +100,6 @@ ENV/
 
 # mypy
 .mypy_cache/
+
+# Apptainer images
+*.sif
diff --git a/.gitmodules b/.gitmodules
index 40297e5..e69de29 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,6 +0,0 @@
-[submodule "cpp/bmi-cxx"]
-	path = cpp/bmi-cxx
-	url = https://github.com/csdms/bmi-cxx.git
-[submodule "cpp/bmi-c"]
-	path = cpp/bmi-c
-	url = https://github.com/csdms/bmi-c.git
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 327cac3..b719eed 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -1,17 +1,25 @@
-cmake_minimum_required (VERSION 2.6)
+cmake_minimum_required (VERSION 3.6)
 
-project (grpc4bmi)
+project (grpc4bmi C CXX)
 set (GRPC4BMI_VERSION 0.2)
 
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/grpc4bmi.pc.cmake
                ${CMAKE_CURRENT_BINARY_DIR}/grpc4bmi.pc)
 
-add_compile_options(-std=c++11)
+if (NOT DEFINED CMAKE_CXX_STANDARD)
+  set (CMAKE_CXX_STANDARD 14)
+endif()
 
+find_package(Threads REQUIRED)
 find_package(Protobuf REQUIRED)
+message(STATUS "Using protobuf ${Protobuf_VERSION}")
 find_program(GRPC_CPP_PLUGIN grpc_cpp_plugin REQUIRED)
-find_library(GRPCPP_UNSECURE grpc++_unsecure)
-find_library(GRPCLIB grpc)
+find_library(GRPCREFLECTION grpc++_reflection)
+find_library(GRPCLIB grpc CONFIG REQUIRED)
+message(STATUS "Using gRPC ${GRPCLIB_VERSION}")
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(BMI REQUIRED IMPORTED_TARGET bmic bmicxx)
+message(STATUS "Using BMI ${BMI_VERSION}")
 
 set(PROTO_PATH "${CMAKE_SOURCE_DIR}/../proto/grpc4bmi")
 add_custom_command(
@@ -31,11 +39,20 @@ add_custom_command(
     )
 set(GRPC_SRC_FILES ${CMAKE_CURRENT_BINARY_DIR}/bmi.pb.cc ${CMAKE_CURRENT_BINARY_DIR}/bmi.grpc.pb.cc)
 set(GRPC_HDR_FILES ${CMAKE_CURRENT_BINARY_DIR}/bmi.pb.h ${CMAKE_CURRENT_BINARY_DIR}/bmi.grpc.pb.h)
-link_libraries(${PROTOBUF_LIBRARY} ${GRPCPP_UNSECURE} ${GRPC} ${BMIC})
+
 include_directories(${CMAKE_SOURCE_DIR})
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
-add_library (grpc4bmi SHARED bmi-c/bmi.h bmi-cxx/bmi.hxx bmi_cpp_extension.h bmi_cpp_extension.cc
+include_directories(${BMI_INCLUDE_DIRS})
+
+add_library (grpc4bmi SHARED bmi_cpp_extension.h bmi_cpp_extension.cc
     bmi_c_wrapper.h bmi_c_wrapper.cc bmi_grpc_server.cc bmi_grpc_server.h ${GRPC_SRC_FILES} ${GRPC_HDR_FILES})
+
+target_link_libraries(
+    grpc4bmi
+    ${GRPCREFLECTION}
+    ${GRPC}
+    ${PROTOBUF_LIBRARY}
+)
 set_target_properties(grpc4bmi PROPERTIES PUBLIC_HEADER "bmi_cpp_extension.h;bmi_c_wrapper.h;bmi_grpc_server.h;${GRPC_HDR_FILES}")
 add_subdirectory (test)
 
diff --git a/cpp/bmi-c b/cpp/bmi-c
deleted file mode 160000
index 9b5b34d..0000000
--- a/cpp/bmi-c
+++ /dev/null
@@ -1,1 +0,0 @@
-Subproject commit 9b5b34d7c43a7d8732dc2b245b102bcb505946cf
diff --git a/cpp/bmi-cxx b/cpp/bmi-cxx
deleted file mode 160000
index 46cec3d..0000000
--- a/cpp/bmi-cxx
+++ /dev/null
@@ -1,1 +0,0 @@
-Subproject commit 46cec3de7ce624d9f1f4cffcf00bcf64d27b8d17
diff --git a/cpp/bmi_c_wrapper.cc b/cpp/bmi_c_wrapper.cc
index 7d6bcc0..442bef2 100644
--- a/cpp/bmi_c_wrapper.cc
+++ b/cpp/bmi_c_wrapper.cc
@@ -15,254 +15,280 @@ void checkStatus(int status)
 
 void BmiCWrapper::Initialize(std::string configfile)
 {
-    checkStatus(this->model->initialize(this->model->self, const_cast<char*>(configfile.c_str())));
+    checkStatus(this->model->initialize(this->model, const_cast<char*>(configfile.c_str())));
 }
 
 void BmiCWrapper::Update()
 {
     double curtime, timestep;
-    checkStatus(this->model->get_current_time(this->model->self, &curtime));
-    checkStatus(this->model->get_time_step(this->model->self, &timestep));
-    checkStatus(this->model->update(this->model->self));
+    checkStatus(this->model->get_current_time(this->model, &curtime));
+    checkStatus(this->model->get_time_step(this->model, &timestep));
+    checkStatus(this->model->update(this->model));
 }
 
 void BmiCWrapper::UpdateUntil(double time)
 {
-    checkStatus(this->model->update_until(this->model->self, time));
+    checkStatus(this->model->update_until(this->model, time));
 }
 
 void BmiCWrapper::Finalize()
 {
-    checkStatus(this->model->finalize(this->model->self));
+    checkStatus(this->model->finalize(this->model));
 }
 
 std::string BmiCWrapper::GetComponentName()
 {
-    char* dest;
-    checkStatus(this->model->get_component_name(this->model->self, dest));
+    char dest[BMI_MAX_COMPONENT_NAME];
+    checkStatus(this->model->get_component_name(this->model, dest));
     return dest;
 }
 
 int BmiCWrapper::GetInputItemCount()
 {
     int dest;
-    checkStatus(this->model->get_input_item_count(this->model->self, &dest));
+    checkStatus(this->model->get_input_item_count(this->model, &dest));
     return dest;
 }
 
 int BmiCWrapper::GetOutputItemCount()
 {
     int dest;
-    checkStatus(this->model->get_output_item_count(this->model->self, &dest));
+    checkStatus(this->model->get_output_item_count(this->model, &dest));
     return dest;
 }
 
 std::vector<std::string> BmiCWrapper::GetInputVarNames()
 {
-    char** dest;
-    checkStatus(this->model->get_input_var_names(this->model->self, dest));
-    // TODO convert dest to vector of strings
+    size_t count = static_cast<size_t>(GetInputItemCount());
+    // TODO replace with std::vector<std::unique_ptr> oid???
+    // Current impl is not safe against exceptions
+    char** dest = reinterpret_cast<char **>(malloc(sizeof(char *) * count));
+    for (size_t i = 0; i < count; ++i) {
+        dest[i] = reinterpret_cast<char *>(malloc(BMI_MAX_VAR_NAME + 1));
+    }
+    checkStatus(this->model->get_input_var_names(this->model, dest));
+
+    std::vector<std::string> result;
+    for (size_t i = 0; i < count; ++i) {
+        result.emplace_back(dest[i]);
+        free(dest[i]);
+    }
+    free(dest);
+    return result;
 }
 
 std::vector<std::string> BmiCWrapper::GetOutputVarNames()
 {
-    char** dest;
-    checkStatus(this->model->get_output_var_names(this->model->self, dest));
-    // TODO convert dest to vector of strings
+    size_t count = static_cast<size_t>(GetOutputItemCount());
+    // TODO replace with std::vector<std::unique_ptr> oid???
+    // Current impl is not safe against exceptions
+    char** dest = reinterpret_cast<char **>(malloc(sizeof(char *) * count));
+    for (size_t i = 0; i < count; ++i) {
+        dest[i] = reinterpret_cast<char *>(malloc(BMI_MAX_VAR_NAME + 1));
+    }
+    checkStatus(this->model->get_output_var_names(this->model, dest));
+
+    std::vector<std::string> result;
+    for (size_t i = 0; i < count; ++i) {
+        result.emplace_back(dest[i]);
+        free(dest[i]);
+    }
+    free(dest);
+    return result;
 }
 
 int BmiCWrapper::GetVarGrid(std::string name)
 {
     int dest;
-    checkStatus(this->model->get_var_grid(this->model->self, const_cast<char*>(name.c_str()), &dest));
+    checkStatus(this->model->get_var_grid(this->model, const_cast<char*>(name.c_str()), &dest));
     return dest;
 }
 
 std::string BmiCWrapper::GetVarType(std::string name)
 {
-    char* vtype;
-    checkStatus(this->model->get_var_type(this->model->self, const_cast<char*>(name.c_str()), vtype));
+    char vtype[BMI_MAX_TYPE_NAME];
+    checkStatus(this->model->get_var_type(this->model, const_cast<char*>(name.c_str()), vtype));
     return vtype;
 }
 
 int BmiCWrapper::GetVarItemsize(std::string name)
 {
     int dest;
-    checkStatus(this->model->get_var_itemsize(this->model->self, const_cast<char*>(name.c_str()), &dest));
+    checkStatus(this->model->get_var_itemsize(this->model, const_cast<char*>(name.c_str()), &dest));
     return dest;
 }
 
 std::string BmiCWrapper::GetVarUnits(std::string name)
 {
-    char* dest;
-    checkStatus(this->model->get_var_units(this->model->self, const_cast<char*>(name.c_str()), dest));
+    char dest[BMI_MAX_VAR_NAME];
+    checkStatus(this->model->get_var_units(this->model, const_cast<char*>(name.c_str()), dest));
     return dest;
 }
 
 int BmiCWrapper::GetVarNbytes(std::string name)
 {
     int dest;
-    checkStatus(this->model->get_var_nbytes(this->model->self, const_cast<char*>(name.c_str()), &dest));
+    checkStatus(this->model->get_var_nbytes(this->model, const_cast<char*>(name.c_str()), &dest));
     return dest;
 }
 
 std::string BmiCWrapper::GetVarLocation(std::string name)
 {
-    char* location;
-    checkStatus(this->model->get_var_location(this->model->self, const_cast<char*>(name.c_str()), location));
+    char location[BMI_MAX_UNITS_NAME];
+    checkStatus(this->model->get_var_location(this->model, const_cast<char*>(name.c_str()), location));
     return location;
 }
 
 double BmiCWrapper::GetCurrentTime()
 {
     double dest;
-    checkStatus(this->model->get_current_time(this->model->self, &dest));
+    checkStatus(this->model->get_current_time(this->model, &dest));
     return dest;
 }
 
 double BmiCWrapper::GetStartTime()
 {
     double dest;
-    checkStatus(this->model->get_start_time(this->model->self, &dest));
+    checkStatus(this->model->get_start_time(this->model, &dest));
     return dest;
 }
 
 double BmiCWrapper::GetEndTime()
 {
     double dest;
-    checkStatus(this->model->get_end_time(this->model->self, &dest));
+    checkStatus(this->model->get_end_time(this->model, &dest));
     return dest;
 }
 
 std::string BmiCWrapper::GetTimeUnits()
 {
-    char* dest;
-    checkStatus(this->model->get_time_units(this->model->self, dest));
+    char dest[BMI_MAX_UNITS_NAME];
+    checkStatus(this->model->get_time_units(this->model, dest));
     return dest;
 }
 
 double BmiCWrapper::GetTimeStep()
 {
     double dest;
-    checkStatus(this->model->get_time_step(this->model->self, &dest));
+    checkStatus(this->model->get_time_step(this->model, &dest));
     return dest;
 }
 
 void BmiCWrapper::GetValue(std::string name, void* dest)
 {
-    checkStatus(this->model->get_value(this->model->self, const_cast<char*>(name.c_str()), dest));
+    checkStatus(this->model->get_value(this->model, const_cast<char*>(name.c_str()), dest));
 }
 
 void* BmiCWrapper::GetValuePtr(std::string name)
 {
     void* dest;
-    checkStatus(this->model->get_value_ptr(this->model->self, const_cast<char*>(name.c_str()), &dest));
+    checkStatus(this->model->get_value_ptr(this->model, const_cast<char*>(name.c_str()), &dest));
     return dest;
 }
 
 void BmiCWrapper::GetValueAtIndices(std::string name, void* dest, int* pts, int numpts)
 {
-    checkStatus(this->model->get_value_at_indices(this->model->self, const_cast<char*>(name.c_str()), dest, const_cast<int*>(pts), numpts));
+    checkStatus(this->model->get_value_at_indices(this->model, const_cast<char*>(name.c_str()), dest, const_cast<int*>(pts), numpts));
 }
 
 void BmiCWrapper::SetValue(std::string name, void* src)
 {
-    checkStatus(this->model->set_value(this->model->self, const_cast<char*>(name.c_str()), src));
+    checkStatus(this->model->set_value(this->model, const_cast<char*>(name.c_str()), src));
 }
 
 void BmiCWrapper::SetValueAtIndices(std::string name, int* pts, int numpts, void* values)
 {
-    checkStatus(this->model->set_value_at_indices(this->model->self, const_cast<char*>(name.c_str()), pts, numpts, values));
+    checkStatus(this->model->set_value_at_indices(this->model, const_cast<char*>(name.c_str()), pts, numpts, values));
 }
 
 int BmiCWrapper::GetGridSize(int id)
 {
     int dest;
-    checkStatus(this->model->get_grid_size(this->model->self, id, &dest));
+    checkStatus(this->model->get_grid_size(this->model, id, &dest));
     return dest;
 }
 
 int BmiCWrapper::GetGridRank(int id)
 {
     int dest;
-    checkStatus(this->model->get_grid_size(this->model->self, id, &dest));
+    checkStatus(this->model->get_grid_rank(this->model, id, &dest));
     return dest;
 }
 
 std::string BmiCWrapper::GetGridType(int id)
 {
-    char* dest;
-    checkStatus(this->model->get_grid_type(this->model->self, id, dest));
+    char dest[BMI_MAX_TYPE_NAME];
+    checkStatus(this->model->get_grid_type(this->model, id, dest));
     return dest;
 }
 
 void BmiCWrapper::GetGridShape(int id, int* dest)
 {
-    checkStatus(this->model->get_grid_shape(this->model->self, id, dest));
+    checkStatus(this->model->get_grid_shape(this->model, id, dest));
 }
 
 void BmiCWrapper::GetGridSpacing(int id, double* dest)
 {
-    checkStatus(this->model->get_grid_spacing(this->model->self, id, dest));
+    checkStatus(this->model->get_grid_spacing(this->model, id, dest));
 }
 
 void BmiCWrapper::GetGridOrigin(int id, double* dest)
 {
-    checkStatus(this->model->get_grid_origin(this->model->self, id, dest));
+    checkStatus(this->model->get_grid_origin(this->model, id, dest));
 }
 
 void BmiCWrapper::GetGridX(int id, double* dest)
 {
-    checkStatus(this->model->get_grid_x(this->model->self, id, dest));
+    checkStatus(this->model->get_grid_x(this->model, id, dest));
 }
 
 void BmiCWrapper::GetGridY(int id, double* dest)
 {
-    checkStatus(this->model->get_grid_y(this->model->self, id, dest));
+    checkStatus(this->model->get_grid_y(this->model, id, dest));
 }
 
 void BmiCWrapper::GetGridZ(int id, double* dest)
 {
-    checkStatus(this->model->get_grid_z(this->model->self, id, dest));
+    checkStatus(this->model->get_grid_z(this->model, id, dest));
 }
 
 int BmiCWrapper::GetGridNodeCount(int grid)
 {
     int dest;
-    checkStatus(this->model->get_grid_node_count(this->model->self, grid, &dest));
+    checkStatus(this->model->get_grid_node_count(this->model, grid, &dest));
     return dest;
 }
 
 int BmiCWrapper::GetGridEdgeCount(int grid)
 {
     int dest;
-    checkStatus(this->model->get_grid_edge_count(this->model->self, grid, &dest));
+    checkStatus(this->model->get_grid_edge_count(this->model, grid, &dest));
     return dest;
 }
 
 int BmiCWrapper::GetGridFaceCount(int grid)
 {
     int dest;
-    checkStatus(this->model->get_grid_face_count(this->model->self, grid, &dest));
+    checkStatus(this->model->get_grid_face_count(this->model, grid, &dest));
     return dest;
 }
 
 void BmiCWrapper::GetGridEdgeNodes(int grid, int *edge_nodes)
 {
-    checkStatus(this->model->get_grid_edge_nodes(this->model->self, grid, edge_nodes));
+    checkStatus(this->model->get_grid_edge_nodes(this->model, grid, edge_nodes));
 }
 
 void BmiCWrapper::GetGridFaceEdges(int grid, int *face_edges)
 {
-    checkStatus(this->model->get_grid_edge_nodes(this->model->self, grid, face_edges));
+    checkStatus(this->model->get_grid_edge_nodes(this->model, grid, face_edges));
 }
 
 void BmiCWrapper::GetGridFaceNodes(int grid, int *face_nodes)
 {
-    checkStatus(this->model->get_grid_face_nodes(this->model->self, grid, face_nodes));
+    checkStatus(this->model->get_grid_face_nodes(this->model, grid, face_nodes));
 }
 
 void BmiCWrapper::GetGridNodesPerFace(int grid, int *nodes_per_face)
 {
-    checkStatus(this->model->get_grid_nodes_per_face(this->model->self, grid, nodes_per_face));
+    checkStatus(this->model->get_grid_nodes_per_face(this->model, grid, nodes_per_face));
 }
diff --git a/cpp/bmi_c_wrapper.h b/cpp/bmi_c_wrapper.h
index 31cc5e4..86e608e 100644
--- a/cpp/bmi_c_wrapper.h
+++ b/cpp/bmi_c_wrapper.h
@@ -6,10 +6,10 @@
 
 #ifndef BMI_INCLUDED
 #define BMI_INCLUDED
-#include "bmi-c/bmi.h"
+#include "bmi.h"
 #undef BMI_SUCCESS
 #undef BMI_FAILURE
-#include "bmi-cxx/bmi.hxx"
+#include "bmi.hxx"
 #endif
   
 typedef Bmi BMIModel;
diff --git a/cpp/bmi_cpp_extension.h b/cpp/bmi_cpp_extension.h
index 9b0e26c..922b718 100644
--- a/cpp/bmi_cpp_extension.h
+++ b/cpp/bmi_cpp_extension.h
@@ -7,7 +7,7 @@
 
 #ifndef BMI_INCLUDED
 #define BMI_INCLUDED
-#include "bmi-cxx/bmi.hxx"
+#include "bmi.hxx"
 #endif
 
 class BmiCppExtension: public bmi::Bmi 
diff --git a/cpp/bmi_grpc_server.cc b/cpp/bmi_grpc_server.cc
index d267f09..4d8afbd 100644
--- a/cpp/bmi_grpc_server.cc
+++ b/cpp/bmi_grpc_server.cc
@@ -1,8 +1,10 @@
-#include <grpc/grpc.h>
+#include <grpcpp/grpcpp.h>
 #include <grpcpp/server.h>
 #include <grpcpp/server_builder.h>
 #include <grpcpp/server_context.h>
 #include <grpcpp/security/server_credentials.h>
+#include <grpcpp/ext/proto_server_reflection_plugin.h>
+#include <grpcpp/health_check_service_interface.h>
 #include "bmi_grpc_server.h"
 #include "bmi_c_wrapper.h"
 
@@ -815,15 +817,17 @@ void run_bmi_server(BmiClass *model, int argc, char *argv[])
     {
         server_address = "0.0.0.0:" + std::string(argv[1]);
     }
-    std::string bmi_port = std::getenv("BMI_PORT");
-    if(!bmi_port.empty()) {
-        server_address = "0.0.0.0:" + bmi_port;
+    if(const char* bmi_port = std::getenv("BMI_PORT")) {
+        server_address = "0.0.0.0:" + std::string(bmi_port);
     }
-    std::cerr << "BMI grpc server attached to server address " << server_address << std::endl;
     BmiGRPCService service(model);
+    grpc::EnableDefaultHealthCheckService(true);
+    grpc::reflection::InitProtoReflectionServerBuilderPlugin();
     grpc::ServerBuilder builder;
     builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
     builder.RegisterService(&service);
     std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
+    std::cerr << "BMI grpc server attached to server address " << server_address << std::endl;
     server->Wait();
+    std::cerr << "Waiting";
 }
diff --git a/cpp/bmi_grpc_server.h b/cpp/bmi_grpc_server.h
index 4b517d3..ec2792f 100644
--- a/cpp/bmi_grpc_server.h
+++ b/cpp/bmi_grpc_server.h
@@ -2,10 +2,10 @@
 #define BMI_GRPC_SERVER_H_INCLUDED
 
 #include "bmi.grpc.pb.h"
-#include "bmi-c/bmi.h"
+#include "bmi.h"
 #undef BMI_SUCCESS
 #undef BMI_FAILURE
-#include "bmi-cxx/bmi.hxx"
+#include "bmi.hxx"
 
 typedef bmi::Bmi BmiClass;
 typedef Bmi BmiModel;
diff --git a/docs/server/Cpp.rst b/docs/server/Cpp.rst
index fe8dd49..aace88c 100644
--- a/docs/server/Cpp.rst
+++ b/docs/server/Cpp.rst
@@ -20,6 +20,16 @@ For native programming languages it is necessary to install and compile the C++
     sudo make -j4 install
     sudo ldconfig
 
+You will also need the install the BMI C and C++ headers
+
+.. code-block:: sh
+
+    git clone -b v2.0 https://github.com/csdms/bmi-cxx.git bmi-cxx
+    cd bmi-cxx && mkdir build && cd build cmake .. && make install
+
+    git clone -b v2.1 https://github.com/csdms/bmi-c.git bmi-c
+    cd bmi-c && mkdir build && cd build cmake .. && make install
+
 You will also need to compile grpc4bmi
 
 .. code-block:: sh
@@ -33,29 +43,41 @@ You will also need to compile grpc4bmi
 Creating
 --------
 
-The grpc4bmi package comes with a C++ abstract base class that contains the BMI functions. The `header file <https://github.com/eWaterCycle/grpc4bmi/blob/master/cpp/bmi_class.h>`_ will
-be copied to your system include path upon the installation steps above. Write an implementation of the ``Bmi`` class using your model time step code and data structures. You don't have to worry about global variables in your model code: with grpc4bmi every model instance runs in its own memory space. For the same reason, the ``get_value_ptr`` and ``set_value_ptr`` methods can be safely ignored, they are never called through the grpc process bridge.
+The grpc4bmi package requires a model implementing the BMI interface in 
+`C with bmi.h <https://github.com/csdms/bmi-c/blob/v2.1/bmi.h>`_ 
+or `C++ with bmi.hxx <https://github.com/csdms/bmi-cxx/blob/v2.0/bmi.hxx>`_. 
+The header files will
+be copied to your system include path upon the installation steps above. 
+Write an implementation of the ``Bmi`` class using your model time step code and data structures. 
+You don't have to worry about global variables in your model code: 
+with grpc4bmi every model instance runs in its own memory space. 
+For the same reason, the ``get_value_ptr`` and ``set_value_ptr`` methods can be safely ignored, 
+they are never called through the grpc network protocol.
 
 Running
 -------
 
-Since native language lack reflection, it is necessary to make your own ``run_bmi_server`` program. We provide a function ``run_bmi_server(Bmi*, int*, char*)`` in the ``bmi_grpc_server.h`` header that can be called with your model instance (see the example below). To compile your server binary, it is necessary to link against grpc4bmi and protobuf libraries.
-The program will accept a single optional argument which is the port the server will run on. The port can also be specified using the BMI_PORT environment variable. The default port is 50051.
+Since native language lack reflection, it is necessary to make your own ``run_bmi_server`` program. 
+We provide a function ``run_bmi_server(Bmi*, int*, char*)`` in the ``bmi_grpc_server.h`` header 
+that can be called with your model instance (see the example below). To compile your server binary, 
+it is necessary to link against grpc4bmi and protobuf libraries.
+The program will accept a single optional argument which is the port the server will run on.
+The port can also be specified using the BMI_PORT environment variable. The default port is 50051.
 
 .. _example_cpp:
 
-Example
--------
+Example in C
+------------
 
-To create a BMI to your model, write a header file in which you declare the overridden functions of the base class ``Bmi`` in the included file ``bmi_class.h``.
+To create a BMI to your model, write a header file in which you declare the overridden functions of the base class ``Bmi`` in the included file ``bmi.h``.
 
 my_bmi_model.h:
 
 .. code-block:: cpp
 
-    #include <bmi_class.h>
+    #include <bmi.h>
 
-    class MyBmiModel: public Bmi
+    class MyBmiModel: public bmi::Bmi
     {
         public:
             MyBmiModel();
diff --git a/grpc4bmi/bmi_client_apptainer.py b/grpc4bmi/bmi_client_apptainer.py
index 100a85b..a4169e2 100644
--- a/grpc4bmi/bmi_client_apptainer.py
+++ b/grpc4bmi/bmi_client_apptainer.py
@@ -8,7 +8,7 @@
 
 from packaging.specifiers import SpecifierSet
 from packaging.version import Version
-from typeguard import check_argument_types, qualified_name
+from typeguard import typechecked
 
 from grpc4bmi.bmi_grpc_client import BmiClient
 from grpc4bmi.exceptions import ApptainerVersionException, DeadContainerException
@@ -194,13 +194,13 @@ class BmiClientApptainer(BmiClient):
 
     """
 
+    @typechecked
     def __init__(self, image: str, work_dir: str, input_dirs: Iterable[str] = tuple(), delay=0, timeout=None,
                  capture_logs=True,
                  ):
-        assert check_argument_types()
         if type(input_dirs) == str:
             msg = f'type of argument "input_dirs" must be collections.abc.Iterable; ' \
-                  f'got {qualified_name(input_dirs)} instead'
+                  f'got {type(input_dirs)} instead'
             raise TypeError(msg)
         check_apptainer_version()
         host = 'localhost'
diff --git a/grpc4bmi/bmi_client_docker.py b/grpc4bmi/bmi_client_docker.py
index d14fe67..328400a 100644
--- a/grpc4bmi/bmi_client_docker.py
+++ b/grpc4bmi/bmi_client_docker.py
@@ -5,7 +5,7 @@
 
 import docker
 from docker.models.containers import Container
-from typeguard import check_argument_types, qualified_name
+from typeguard import typechecked
 
 from grpc4bmi.bmi_grpc_client import BmiClient
 from grpc4bmi.exceptions import DeadContainerException
@@ -58,14 +58,14 @@ class BmiClientDocker(BmiClient):
     See :py:class:`grpc4bmi.bmi_client_apptainer.BmiClientApptainer` for examples using `input_dirs` and `work_dir`.
     """
 
+    @typechecked
     def __init__(self, image: str, work_dir: str, image_port=50051, host=None,
                  input_dirs: Iterable[str] = tuple(),
                  user=os.getuid(), remove=False, delay=5,
                  timeout=None):
-        assert check_argument_types()
         if type(input_dirs) == str:
             msg = f'type of argument "input_dirs" must be collections.abc.Iterable; ' \
-                  f'got {qualified_name(input_dirs)} instead'
+                  f'got {type(input_dirs)} instead'
             raise TypeError(msg)
         port = BmiClient.get_unique_port()
         client = docker.from_env()
diff --git a/grpc4bmi/bmi_client_singularity.py b/grpc4bmi/bmi_client_singularity.py
index 3a49871..f2f1e4a 100644
--- a/grpc4bmi/bmi_client_singularity.py
+++ b/grpc4bmi/bmi_client_singularity.py
@@ -8,7 +8,7 @@
 
 from packaging.specifiers import SpecifierSet
 from packaging.version import Version
-from typeguard import check_argument_types, qualified_name
+from typeguard import typechecked
 
 from grpc4bmi.bmi_grpc_client import BmiClient
 from grpc4bmi.exceptions import ApptainerVersionException, DeadContainerException, SingularityVersionException
@@ -197,13 +197,13 @@ class BmiClientSingularity(BmiClient):
 
     """
 
+    @typechecked
     def __init__(self, image: str, work_dir: str, input_dirs: Iterable[str] = tuple(), delay=0, timeout=None,
                  capture_logs=True,
                  ):
-        assert check_argument_types()
         if type(input_dirs) == str:
             msg = f'type of argument "input_dirs" must be collections.abc.Iterable; ' \
-                  f'got {qualified_name(input_dirs)} instead'
+                  f'got {type(input_dirs)} instead'
             raise TypeError(msg)
         check_singularity_version()
         host = 'localhost'
diff --git a/grpc4bmi/bmi_grpc_client.py b/grpc4bmi/bmi_grpc_client.py
index 23550b8..2db4cfe 100644
--- a/grpc4bmi/bmi_grpc_client.py
+++ b/grpc4bmi/bmi_grpc_client.py
@@ -9,7 +9,7 @@
 from bmipy import Bmi
 import grpc
 import numpy
-from typeguard import check_argument_types
+from typeguard import typechecked
 
 from grpc_status import rpc_status
 from google.rpc import error_details_pb2
@@ -94,8 +94,8 @@ def get_unique_port(host=None):
             s.bind(("" if host is None else host, 0))
             return int(s.getsockname()[1])
 
+    @typechecked
     def initialize(self, filename: Optional[str]):
-        assert check_argument_types()
         fname = "" if filename is None else filename
         try:
             return self.stub.initialize(bmi_pb2.InitializeRequest(config_file=fname))
@@ -195,7 +195,17 @@ def get_var_type(self, name):
 
     def get_var_itemsize(self, name):
         try:
-            return self.stub.getVarItemSize(bmi_pb2.GetVarRequest(name=name)).size
+            item_size = self.stub.getVarItemSize(bmi_pb2.GetVarRequest(name=name)).size
+            if item_size == 0:
+                # BMI < v2.0 did not have get_var_itemsize, so old server will return 0
+                # fallback to getting item size from var type
+                var_type = self.get_var_type(name)
+                try:
+                    item_size = numpy.dtype(var_type).itemsize
+                    log.info(f'get_var_itemsize returned 0, corrected to {item_size} using get_var_type.')
+                except TypeError:
+                    raise ValueError('get_var_itemsize returned 0, which is impossible')
+            return item_size
         except grpc.RpcError as e:
             handle_error(e)
 
diff --git a/grpc4bmi/bmi_pb2.py b/grpc4bmi/bmi_pb2.py
index 6b6f9c4..da2f84c 100644
--- a/grpc4bmi/bmi_pb2.py
+++ b/grpc4bmi/bmi_pb2.py
@@ -1,10 +1,10 @@
 # -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: grpc4bmi/bmi.proto
-
+"""Generated protocol buffer code."""
+from google.protobuf.internal import builder as _builder
 from google.protobuf import descriptor as _descriptor
-from google.protobuf import message as _message
-from google.protobuf import reflection as _reflection
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import symbol_database as _symbol_database
 # @@protoc_insertion_point(imports)
 
@@ -13,1982 +13,113 @@
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='grpc4bmi/bmi.proto',
-  package='bmi',
-  syntax='proto3',
-  serialized_options=None,
-  serialized_pb=b'\n\x12grpc4bmi/bmi.proto\x12\x03\x62mi\"\x07\n\x05\x45mpty\"(\n\x11InitializeRequest\x12\x13\n\x0b\x63onfig_file\x18\x01 \x01(\t\"(\n\x18GetComponentNameResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\"$\n\x13GetVarNamesResponse\x12\r\n\x05names\x18\x01 \x03(\t\"%\n\x14GetTimeUnitsResponse\x12\r\n\x05units\x18\x01 \x01(\t\"\'\n\x13GetTimeStepResponse\x12\x10\n\x08interval\x18\x01 \x01(\x01\"\x1f\n\x0fGetTimeResponse\x12\x0c\n\x04time\x18\x01 \x01(\x01\"\x1d\n\rGetVarRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"%\n\x12GetVarGridResponse\x12\x0f\n\x07grid_id\x18\x01 \x01(\x05\"\"\n\x12GetVarTypeResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\"&\n\x16GetVarItemSizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"$\n\x13GetVarUnitsResponse\x12\r\n\x05units\x18\x01 \x01(\t\"&\n\x14GetVarNBytesResponse\x12\x0e\n\x06nbytes\x18\x01 \x01(\x03\"z\n\x16GetVarLocationResponse\x12\x36\n\x08location\x18\x01 \x01(\x0e\x32$.bmi.GetVarLocationResponse.Location\"(\n\x08Location\x12\x08\n\x04NODE\x10\x00\x12\x08\n\x04\x45\x44GE\x10\x01\x12\x08\n\x04\x46\x41\x43\x45\x10\x02\"%\n\x0fIntArrayMessage\x12\x12\n\x06values\x18\x01 \x03(\x03\x42\x02\x10\x01\"\'\n\x11\x46loatArrayMessage\x12\x12\n\x06values\x18\x01 \x03(\x02\x42\x02\x10\x01\"(\n\x12\x44oubleArrayMessage\x12\x12\n\x06values\x18\x01 \x03(\x01\x42\x02\x10\x01\"\xaa\x01\n\x10GetValueResponse\x12*\n\nvalues_int\x18\x01 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x02 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x03 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"=\n\x18GetValueAtIndicesRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07indices\x18\x02 \x03(\x03\x42\x02\x10\x01\"\xb3\x01\n\x19GetValueAtIndicesResponse\x12*\n\nvalues_int\x18\x01 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x02 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x03 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"\xb7\x01\n\x0fSetValueRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\nvalues_int\x18\x02 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x03 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x04 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"/\n\x12SetValuePtrRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03ref\x18\x02 \x01(\x03\"\xd5\x01\n\x18SetValueAtIndicesRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07indices\x18\x02 \x03(\x03\x42\x02\x10\x01\x12*\n\nvalues_int\x18\x03 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x04 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x05 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"\x1e\n\x0bGridRequest\x12\x0f\n\x07grid_id\x18\x01 \x01(\x03\"#\n\x13GetGridSizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"#\n\x13GetGridRankResponse\x12\x0c\n\x04rank\x18\x01 \x01(\x03\"#\n\x13GetGridTypeResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\")\n\x14GetGridShapeResponse\x12\x11\n\x05shape\x18\x01 \x03(\x03\x42\x02\x10\x01\"-\n\x16GetGridSpacingResponse\x12\x13\n\x07spacing\x18\x01 \x03(\x01\x42\x02\x10\x01\"+\n\x15GetGridOriginResponse\x12\x12\n\x06origin\x18\x01 \x03(\x01\x42\x02\x10\x01\"0\n\x15GetGridPointsResponse\x12\x17\n\x0b\x63oordinates\x18\x01 \x03(\x01\x42\x02\x10\x01\"!\n\x10GetCountResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\"2\n\x18GetGridEdgeNodesResponse\x12\x16\n\nedge_nodes\x18\x01 \x03(\x03\x42\x02\x10\x01\"2\n\x18GetGridFaceEdgesResponse\x12\x16\n\nface_edges\x18\x01 \x03(\x03\x42\x02\x10\x01\"2\n\x18GetGridFaceNodesResponse\x12\x16\n\nface_nodes\x18\x01 \x03(\x03\x42\x02\x10\x01\"9\n\x1bGetGridNodesPerFaceResponse\x12\x1a\n\x0enodes_per_face\x18\x01 \x03(\x03\x42\x02\x10\x01\x32\x8a\x13\n\nBmiService\x12\x32\n\ninitialize\x12\x16.bmi.InitializeRequest\x1a\n.bmi.Empty\"\x00\x12\"\n\x06update\x12\n.bmi.Empty\x1a\n.bmi.Empty\"\x00\x12\x31\n\x0bupdateUntil\x12\x14.bmi.GetTimeResponse\x1a\n.bmi.Empty\"\x00\x12$\n\x08\x66inalize\x12\n.bmi.Empty\x1a\n.bmi.Empty\"\x00\x12?\n\x10getComponentName\x12\n.bmi.Empty\x1a\x1d.bmi.GetComponentNameResponse\"\x00\x12\x38\n\x11getInputItemCount\x12\n.bmi.Empty\x1a\x15.bmi.GetCountResponse\"\x00\x12\x39\n\x12getOutputItemCount\x12\n.bmi.Empty\x1a\x15.bmi.GetCountResponse\"\x00\x12:\n\x10getInputVarNames\x12\n.bmi.Empty\x1a\x18.bmi.GetVarNamesResponse\"\x00\x12;\n\x11getOutputVarNames\x12\n.bmi.Empty\x1a\x18.bmi.GetVarNamesResponse\"\x00\x12\x37\n\x0cgetTimeUnits\x12\n.bmi.Empty\x1a\x19.bmi.GetTimeUnitsResponse\"\x00\x12\x35\n\x0bgetTimeStep\x12\n.bmi.Empty\x1a\x18.bmi.GetTimeStepResponse\"\x00\x12\x34\n\x0egetCurrentTime\x12\n.bmi.Empty\x1a\x14.bmi.GetTimeResponse\"\x00\x12\x32\n\x0cgetStartTime\x12\n.bmi.Empty\x1a\x14.bmi.GetTimeResponse\"\x00\x12\x30\n\ngetEndTime\x12\n.bmi.Empty\x1a\x14.bmi.GetTimeResponse\"\x00\x12;\n\ngetVarGrid\x12\x12.bmi.GetVarRequest\x1a\x17.bmi.GetVarGridResponse\"\x00\x12;\n\ngetVarType\x12\x12.bmi.GetVarRequest\x1a\x17.bmi.GetVarTypeResponse\"\x00\x12\x43\n\x0egetVarItemSize\x12\x12.bmi.GetVarRequest\x1a\x1b.bmi.GetVarItemSizeResponse\"\x00\x12=\n\x0bgetVarUnits\x12\x12.bmi.GetVarRequest\x1a\x18.bmi.GetVarUnitsResponse\"\x00\x12?\n\x0cgetVarNBytes\x12\x12.bmi.GetVarRequest\x1a\x19.bmi.GetVarNBytesResponse\"\x00\x12\x43\n\x0egetVarLocation\x12\x12.bmi.GetVarRequest\x1a\x1b.bmi.GetVarLocationResponse\"\x00\x12\x37\n\x08getValue\x12\x12.bmi.GetVarRequest\x1a\x15.bmi.GetValueResponse\"\x00\x12T\n\x11getValueAtIndices\x12\x1d.bmi.GetValueAtIndicesRequest\x1a\x1e.bmi.GetValueAtIndicesResponse\"\x00\x12.\n\x08setValue\x12\x14.bmi.SetValueRequest\x1a\n.bmi.Empty\"\x00\x12@\n\x11setValueAtIndices\x12\x1d.bmi.SetValueAtIndicesRequest\x1a\n.bmi.Empty\"\x00\x12;\n\x0bgetGridSize\x12\x10.bmi.GridRequest\x1a\x18.bmi.GetGridSizeResponse\"\x00\x12;\n\x0bgetGridType\x12\x10.bmi.GridRequest\x1a\x18.bmi.GetGridTypeResponse\"\x00\x12;\n\x0bgetGridRank\x12\x10.bmi.GridRequest\x1a\x18.bmi.GetGridRankResponse\"\x00\x12=\n\x0cgetGridShape\x12\x10.bmi.GridRequest\x1a\x19.bmi.GetGridShapeResponse\"\x00\x12\x41\n\x0egetGridSpacing\x12\x10.bmi.GridRequest\x1a\x1b.bmi.GetGridSpacingResponse\"\x00\x12?\n\rgetGridOrigin\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridOriginResponse\"\x00\x12:\n\x08getGridX\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridPointsResponse\"\x00\x12:\n\x08getGridY\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridPointsResponse\"\x00\x12:\n\x08getGridZ\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridPointsResponse\"\x00\x12=\n\x10getGridNodeCount\x12\x10.bmi.GridRequest\x1a\x15.bmi.GetCountResponse\"\x00\x12=\n\x10getGridEdgeCount\x12\x10.bmi.GridRequest\x1a\x15.bmi.GetCountResponse\"\x00\x12=\n\x10getGridFaceCount\x12\x10.bmi.GridRequest\x1a\x15.bmi.GetCountResponse\"\x00\x12\x45\n\x10getGridEdgeNodes\x12\x10.bmi.GridRequest\x1a\x1d.bmi.GetGridEdgeNodesResponse\"\x00\x12\x45\n\x10getGridFaceNodes\x12\x10.bmi.GridRequest\x1a\x1d.bmi.GetGridFaceNodesResponse\"\x00\x12\x45\n\x10getGridFaceEdges\x12\x10.bmi.GridRequest\x1a\x1d.bmi.GetGridFaceEdgesResponse\"\x00\x12K\n\x13getGridNodesPerFace\x12\x10.bmi.GridRequest\x1a .bmi.GetGridNodesPerFaceResponse\"\x00\x62\x06proto3'
-)
-
-
-
-_GETVARLOCATIONRESPONSE_LOCATION = _descriptor.EnumDescriptor(
-  name='Location',
-  full_name='bmi.GetVarLocationResponse.Location',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='NODE', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='EDGE', index=1, number=1,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='FACE', index=2, number=2,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=577,
-  serialized_end=617,
-)
-_sym_db.RegisterEnumDescriptor(_GETVARLOCATIONRESPONSE_LOCATION)
-
-
-_EMPTY = _descriptor.Descriptor(
-  name='Empty',
-  full_name='bmi.Empty',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=27,
-  serialized_end=34,
-)
-
-
-_INITIALIZEREQUEST = _descriptor.Descriptor(
-  name='InitializeRequest',
-  full_name='bmi.InitializeRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='config_file', full_name='bmi.InitializeRequest.config_file', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=36,
-  serialized_end=76,
-)
-
-
-_GETCOMPONENTNAMERESPONSE = _descriptor.Descriptor(
-  name='GetComponentNameResponse',
-  full_name='bmi.GetComponentNameResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='bmi.GetComponentNameResponse.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=78,
-  serialized_end=118,
-)
-
-
-_GETVARNAMESRESPONSE = _descriptor.Descriptor(
-  name='GetVarNamesResponse',
-  full_name='bmi.GetVarNamesResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='names', full_name='bmi.GetVarNamesResponse.names', index=0,
-      number=1, type=9, cpp_type=9, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=120,
-  serialized_end=156,
-)
-
-
-_GETTIMEUNITSRESPONSE = _descriptor.Descriptor(
-  name='GetTimeUnitsResponse',
-  full_name='bmi.GetTimeUnitsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='units', full_name='bmi.GetTimeUnitsResponse.units', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=158,
-  serialized_end=195,
-)
-
-
-_GETTIMESTEPRESPONSE = _descriptor.Descriptor(
-  name='GetTimeStepResponse',
-  full_name='bmi.GetTimeStepResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='interval', full_name='bmi.GetTimeStepResponse.interval', index=0,
-      number=1, type=1, cpp_type=5, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=197,
-  serialized_end=236,
-)
-
-
-_GETTIMERESPONSE = _descriptor.Descriptor(
-  name='GetTimeResponse',
-  full_name='bmi.GetTimeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='time', full_name='bmi.GetTimeResponse.time', index=0,
-      number=1, type=1, cpp_type=5, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=238,
-  serialized_end=269,
-)
-
-
-_GETVARREQUEST = _descriptor.Descriptor(
-  name='GetVarRequest',
-  full_name='bmi.GetVarRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='bmi.GetVarRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=271,
-  serialized_end=300,
-)
-
-
-_GETVARGRIDRESPONSE = _descriptor.Descriptor(
-  name='GetVarGridResponse',
-  full_name='bmi.GetVarGridResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='grid_id', full_name='bmi.GetVarGridResponse.grid_id', index=0,
-      number=1, type=5, cpp_type=1, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=302,
-  serialized_end=339,
-)
-
-
-_GETVARTYPERESPONSE = _descriptor.Descriptor(
-  name='GetVarTypeResponse',
-  full_name='bmi.GetVarTypeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='bmi.GetVarTypeResponse.type', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=341,
-  serialized_end=375,
-)
-
-
-_GETVARITEMSIZERESPONSE = _descriptor.Descriptor(
-  name='GetVarItemSizeResponse',
-  full_name='bmi.GetVarItemSizeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='size', full_name='bmi.GetVarItemSizeResponse.size', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=377,
-  serialized_end=415,
-)
-
-
-_GETVARUNITSRESPONSE = _descriptor.Descriptor(
-  name='GetVarUnitsResponse',
-  full_name='bmi.GetVarUnitsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='units', full_name='bmi.GetVarUnitsResponse.units', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=417,
-  serialized_end=453,
-)
-
-
-_GETVARNBYTESRESPONSE = _descriptor.Descriptor(
-  name='GetVarNBytesResponse',
-  full_name='bmi.GetVarNBytesResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='nbytes', full_name='bmi.GetVarNBytesResponse.nbytes', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=455,
-  serialized_end=493,
-)
-
-
-_GETVARLOCATIONRESPONSE = _descriptor.Descriptor(
-  name='GetVarLocationResponse',
-  full_name='bmi.GetVarLocationResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='location', full_name='bmi.GetVarLocationResponse.location', index=0,
-      number=1, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _GETVARLOCATIONRESPONSE_LOCATION,
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=495,
-  serialized_end=617,
-)
-
-
-_INTARRAYMESSAGE = _descriptor.Descriptor(
-  name='IntArrayMessage',
-  full_name='bmi.IntArrayMessage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='values', full_name='bmi.IntArrayMessage.values', index=0,
-      number=1, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=619,
-  serialized_end=656,
-)
-
-
-_FLOATARRAYMESSAGE = _descriptor.Descriptor(
-  name='FloatArrayMessage',
-  full_name='bmi.FloatArrayMessage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='values', full_name='bmi.FloatArrayMessage.values', index=0,
-      number=1, type=2, cpp_type=6, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=658,
-  serialized_end=697,
-)
-
-
-_DOUBLEARRAYMESSAGE = _descriptor.Descriptor(
-  name='DoubleArrayMessage',
-  full_name='bmi.DoubleArrayMessage',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='values', full_name='bmi.DoubleArrayMessage.values', index=0,
-      number=1, type=1, cpp_type=5, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=699,
-  serialized_end=739,
-)
-
-
-_GETVALUERESPONSE = _descriptor.Descriptor(
-  name='GetValueResponse',
-  full_name='bmi.GetValueResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='values_int', full_name='bmi.GetValueResponse.values_int', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_float', full_name='bmi.GetValueResponse.values_float', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_double', full_name='bmi.GetValueResponse.values_double', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-    _descriptor.OneofDescriptor(
-      name='values', full_name='bmi.GetValueResponse.values',
-      index=0, containing_type=None, fields=[]),
-  ],
-  serialized_start=742,
-  serialized_end=912,
-)
-
-
-_GETVALUEATINDICESREQUEST = _descriptor.Descriptor(
-  name='GetValueAtIndicesRequest',
-  full_name='bmi.GetValueAtIndicesRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='bmi.GetValueAtIndicesRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='indices', full_name='bmi.GetValueAtIndicesRequest.indices', index=1,
-      number=2, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=914,
-  serialized_end=975,
-)
-
-
-_GETVALUEATINDICESRESPONSE = _descriptor.Descriptor(
-  name='GetValueAtIndicesResponse',
-  full_name='bmi.GetValueAtIndicesResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='values_int', full_name='bmi.GetValueAtIndicesResponse.values_int', index=0,
-      number=1, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_float', full_name='bmi.GetValueAtIndicesResponse.values_float', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_double', full_name='bmi.GetValueAtIndicesResponse.values_double', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-    _descriptor.OneofDescriptor(
-      name='values', full_name='bmi.GetValueAtIndicesResponse.values',
-      index=0, containing_type=None, fields=[]),
-  ],
-  serialized_start=978,
-  serialized_end=1157,
-)
-
-
-_SETVALUEREQUEST = _descriptor.Descriptor(
-  name='SetValueRequest',
-  full_name='bmi.SetValueRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='bmi.SetValueRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_int', full_name='bmi.SetValueRequest.values_int', index=1,
-      number=2, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_float', full_name='bmi.SetValueRequest.values_float', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_double', full_name='bmi.SetValueRequest.values_double', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-    _descriptor.OneofDescriptor(
-      name='values', full_name='bmi.SetValueRequest.values',
-      index=0, containing_type=None, fields=[]),
-  ],
-  serialized_start=1160,
-  serialized_end=1343,
-)
-
-
-_SETVALUEPTRREQUEST = _descriptor.Descriptor(
-  name='SetValuePtrRequest',
-  full_name='bmi.SetValuePtrRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='bmi.SetValuePtrRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='ref', full_name='bmi.SetValuePtrRequest.ref', index=1,
-      number=2, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1345,
-  serialized_end=1392,
-)
-
-
-_SETVALUEATINDICESREQUEST = _descriptor.Descriptor(
-  name='SetValueAtIndicesRequest',
-  full_name='bmi.SetValueAtIndicesRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='name', full_name='bmi.SetValueAtIndicesRequest.name', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='indices', full_name='bmi.SetValueAtIndicesRequest.indices', index=1,
-      number=2, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_int', full_name='bmi.SetValueAtIndicesRequest.values_int', index=2,
-      number=3, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_float', full_name='bmi.SetValueAtIndicesRequest.values_float', index=3,
-      number=4, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='values_double', full_name='bmi.SetValueAtIndicesRequest.values_double', index=4,
-      number=5, type=11, cpp_type=10, label=1,
-      has_default_value=False, default_value=None,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-    _descriptor.OneofDescriptor(
-      name='values', full_name='bmi.SetValueAtIndicesRequest.values',
-      index=0, containing_type=None, fields=[]),
-  ],
-  serialized_start=1395,
-  serialized_end=1608,
-)
-
-
-_GRIDREQUEST = _descriptor.Descriptor(
-  name='GridRequest',
-  full_name='bmi.GridRequest',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='grid_id', full_name='bmi.GridRequest.grid_id', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1610,
-  serialized_end=1640,
-)
-
-
-_GETGRIDSIZERESPONSE = _descriptor.Descriptor(
-  name='GetGridSizeResponse',
-  full_name='bmi.GetGridSizeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='size', full_name='bmi.GetGridSizeResponse.size', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1642,
-  serialized_end=1677,
-)
-
-
-_GETGRIDRANKRESPONSE = _descriptor.Descriptor(
-  name='GetGridRankResponse',
-  full_name='bmi.GetGridRankResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='rank', full_name='bmi.GetGridRankResponse.rank', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1679,
-  serialized_end=1714,
-)
-
-
-_GETGRIDTYPERESPONSE = _descriptor.Descriptor(
-  name='GetGridTypeResponse',
-  full_name='bmi.GetGridTypeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='type', full_name='bmi.GetGridTypeResponse.type', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=b"".decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1716,
-  serialized_end=1751,
-)
-
-
-_GETGRIDSHAPERESPONSE = _descriptor.Descriptor(
-  name='GetGridShapeResponse',
-  full_name='bmi.GetGridShapeResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='shape', full_name='bmi.GetGridShapeResponse.shape', index=0,
-      number=1, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1753,
-  serialized_end=1794,
-)
-
-
-_GETGRIDSPACINGRESPONSE = _descriptor.Descriptor(
-  name='GetGridSpacingResponse',
-  full_name='bmi.GetGridSpacingResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='spacing', full_name='bmi.GetGridSpacingResponse.spacing', index=0,
-      number=1, type=1, cpp_type=5, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1796,
-  serialized_end=1841,
-)
-
-
-_GETGRIDORIGINRESPONSE = _descriptor.Descriptor(
-  name='GetGridOriginResponse',
-  full_name='bmi.GetGridOriginResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='origin', full_name='bmi.GetGridOriginResponse.origin', index=0,
-      number=1, type=1, cpp_type=5, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1843,
-  serialized_end=1886,
-)
-
-
-_GETGRIDPOINTSRESPONSE = _descriptor.Descriptor(
-  name='GetGridPointsResponse',
-  full_name='bmi.GetGridPointsResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='coordinates', full_name='bmi.GetGridPointsResponse.coordinates', index=0,
-      number=1, type=1, cpp_type=5, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1888,
-  serialized_end=1936,
-)
-
-
-_GETCOUNTRESPONSE = _descriptor.Descriptor(
-  name='GetCountResponse',
-  full_name='bmi.GetCountResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='count', full_name='bmi.GetCountResponse.count', index=0,
-      number=1, type=3, cpp_type=2, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1938,
-  serialized_end=1971,
-)
-
-
-_GETGRIDEDGENODESRESPONSE = _descriptor.Descriptor(
-  name='GetGridEdgeNodesResponse',
-  full_name='bmi.GetGridEdgeNodesResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='edge_nodes', full_name='bmi.GetGridEdgeNodesResponse.edge_nodes', index=0,
-      number=1, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=1973,
-  serialized_end=2023,
-)
-
-
-_GETGRIDFACEEDGESRESPONSE = _descriptor.Descriptor(
-  name='GetGridFaceEdgesResponse',
-  full_name='bmi.GetGridFaceEdgesResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='face_edges', full_name='bmi.GetGridFaceEdgesResponse.face_edges', index=0,
-      number=1, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2025,
-  serialized_end=2075,
-)
-
-
-_GETGRIDFACENODESRESPONSE = _descriptor.Descriptor(
-  name='GetGridFaceNodesResponse',
-  full_name='bmi.GetGridFaceNodesResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='face_nodes', full_name='bmi.GetGridFaceNodesResponse.face_nodes', index=0,
-      number=1, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2077,
-  serialized_end=2127,
-)
-
-
-_GETGRIDNODESPERFACERESPONSE = _descriptor.Descriptor(
-  name='GetGridNodesPerFaceResponse',
-  full_name='bmi.GetGridNodesPerFaceResponse',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='nodes_per_face', full_name='bmi.GetGridNodesPerFaceResponse.nodes_per_face', index=0,
-      number=1, type=3, cpp_type=2, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=b'\020\001', file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=2129,
-  serialized_end=2186,
-)
-
-_GETVARLOCATIONRESPONSE.fields_by_name['location'].enum_type = _GETVARLOCATIONRESPONSE_LOCATION
-_GETVARLOCATIONRESPONSE_LOCATION.containing_type = _GETVARLOCATIONRESPONSE
-_GETVALUERESPONSE.fields_by_name['values_int'].message_type = _INTARRAYMESSAGE
-_GETVALUERESPONSE.fields_by_name['values_float'].message_type = _FLOATARRAYMESSAGE
-_GETVALUERESPONSE.fields_by_name['values_double'].message_type = _DOUBLEARRAYMESSAGE
-_GETVALUERESPONSE.oneofs_by_name['values'].fields.append(
-  _GETVALUERESPONSE.fields_by_name['values_int'])
-_GETVALUERESPONSE.fields_by_name['values_int'].containing_oneof = _GETVALUERESPONSE.oneofs_by_name['values']
-_GETVALUERESPONSE.oneofs_by_name['values'].fields.append(
-  _GETVALUERESPONSE.fields_by_name['values_float'])
-_GETVALUERESPONSE.fields_by_name['values_float'].containing_oneof = _GETVALUERESPONSE.oneofs_by_name['values']
-_GETVALUERESPONSE.oneofs_by_name['values'].fields.append(
-  _GETVALUERESPONSE.fields_by_name['values_double'])
-_GETVALUERESPONSE.fields_by_name['values_double'].containing_oneof = _GETVALUERESPONSE.oneofs_by_name['values']
-_GETVALUEATINDICESRESPONSE.fields_by_name['values_int'].message_type = _INTARRAYMESSAGE
-_GETVALUEATINDICESRESPONSE.fields_by_name['values_float'].message_type = _FLOATARRAYMESSAGE
-_GETVALUEATINDICESRESPONSE.fields_by_name['values_double'].message_type = _DOUBLEARRAYMESSAGE
-_GETVALUEATINDICESRESPONSE.oneofs_by_name['values'].fields.append(
-  _GETVALUEATINDICESRESPONSE.fields_by_name['values_int'])
-_GETVALUEATINDICESRESPONSE.fields_by_name['values_int'].containing_oneof = _GETVALUEATINDICESRESPONSE.oneofs_by_name['values']
-_GETVALUEATINDICESRESPONSE.oneofs_by_name['values'].fields.append(
-  _GETVALUEATINDICESRESPONSE.fields_by_name['values_float'])
-_GETVALUEATINDICESRESPONSE.fields_by_name['values_float'].containing_oneof = _GETVALUEATINDICESRESPONSE.oneofs_by_name['values']
-_GETVALUEATINDICESRESPONSE.oneofs_by_name['values'].fields.append(
-  _GETVALUEATINDICESRESPONSE.fields_by_name['values_double'])
-_GETVALUEATINDICESRESPONSE.fields_by_name['values_double'].containing_oneof = _GETVALUEATINDICESRESPONSE.oneofs_by_name['values']
-_SETVALUEREQUEST.fields_by_name['values_int'].message_type = _INTARRAYMESSAGE
-_SETVALUEREQUEST.fields_by_name['values_float'].message_type = _FLOATARRAYMESSAGE
-_SETVALUEREQUEST.fields_by_name['values_double'].message_type = _DOUBLEARRAYMESSAGE
-_SETVALUEREQUEST.oneofs_by_name['values'].fields.append(
-  _SETVALUEREQUEST.fields_by_name['values_int'])
-_SETVALUEREQUEST.fields_by_name['values_int'].containing_oneof = _SETVALUEREQUEST.oneofs_by_name['values']
-_SETVALUEREQUEST.oneofs_by_name['values'].fields.append(
-  _SETVALUEREQUEST.fields_by_name['values_float'])
-_SETVALUEREQUEST.fields_by_name['values_float'].containing_oneof = _SETVALUEREQUEST.oneofs_by_name['values']
-_SETVALUEREQUEST.oneofs_by_name['values'].fields.append(
-  _SETVALUEREQUEST.fields_by_name['values_double'])
-_SETVALUEREQUEST.fields_by_name['values_double'].containing_oneof = _SETVALUEREQUEST.oneofs_by_name['values']
-_SETVALUEATINDICESREQUEST.fields_by_name['values_int'].message_type = _INTARRAYMESSAGE
-_SETVALUEATINDICESREQUEST.fields_by_name['values_float'].message_type = _FLOATARRAYMESSAGE
-_SETVALUEATINDICESREQUEST.fields_by_name['values_double'].message_type = _DOUBLEARRAYMESSAGE
-_SETVALUEATINDICESREQUEST.oneofs_by_name['values'].fields.append(
-  _SETVALUEATINDICESREQUEST.fields_by_name['values_int'])
-_SETVALUEATINDICESREQUEST.fields_by_name['values_int'].containing_oneof = _SETVALUEATINDICESREQUEST.oneofs_by_name['values']
-_SETVALUEATINDICESREQUEST.oneofs_by_name['values'].fields.append(
-  _SETVALUEATINDICESREQUEST.fields_by_name['values_float'])
-_SETVALUEATINDICESREQUEST.fields_by_name['values_float'].containing_oneof = _SETVALUEATINDICESREQUEST.oneofs_by_name['values']
-_SETVALUEATINDICESREQUEST.oneofs_by_name['values'].fields.append(
-  _SETVALUEATINDICESREQUEST.fields_by_name['values_double'])
-_SETVALUEATINDICESREQUEST.fields_by_name['values_double'].containing_oneof = _SETVALUEATINDICESREQUEST.oneofs_by_name['values']
-DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY
-DESCRIPTOR.message_types_by_name['InitializeRequest'] = _INITIALIZEREQUEST
-DESCRIPTOR.message_types_by_name['GetComponentNameResponse'] = _GETCOMPONENTNAMERESPONSE
-DESCRIPTOR.message_types_by_name['GetVarNamesResponse'] = _GETVARNAMESRESPONSE
-DESCRIPTOR.message_types_by_name['GetTimeUnitsResponse'] = _GETTIMEUNITSRESPONSE
-DESCRIPTOR.message_types_by_name['GetTimeStepResponse'] = _GETTIMESTEPRESPONSE
-DESCRIPTOR.message_types_by_name['GetTimeResponse'] = _GETTIMERESPONSE
-DESCRIPTOR.message_types_by_name['GetVarRequest'] = _GETVARREQUEST
-DESCRIPTOR.message_types_by_name['GetVarGridResponse'] = _GETVARGRIDRESPONSE
-DESCRIPTOR.message_types_by_name['GetVarTypeResponse'] = _GETVARTYPERESPONSE
-DESCRIPTOR.message_types_by_name['GetVarItemSizeResponse'] = _GETVARITEMSIZERESPONSE
-DESCRIPTOR.message_types_by_name['GetVarUnitsResponse'] = _GETVARUNITSRESPONSE
-DESCRIPTOR.message_types_by_name['GetVarNBytesResponse'] = _GETVARNBYTESRESPONSE
-DESCRIPTOR.message_types_by_name['GetVarLocationResponse'] = _GETVARLOCATIONRESPONSE
-DESCRIPTOR.message_types_by_name['IntArrayMessage'] = _INTARRAYMESSAGE
-DESCRIPTOR.message_types_by_name['FloatArrayMessage'] = _FLOATARRAYMESSAGE
-DESCRIPTOR.message_types_by_name['DoubleArrayMessage'] = _DOUBLEARRAYMESSAGE
-DESCRIPTOR.message_types_by_name['GetValueResponse'] = _GETVALUERESPONSE
-DESCRIPTOR.message_types_by_name['GetValueAtIndicesRequest'] = _GETVALUEATINDICESREQUEST
-DESCRIPTOR.message_types_by_name['GetValueAtIndicesResponse'] = _GETVALUEATINDICESRESPONSE
-DESCRIPTOR.message_types_by_name['SetValueRequest'] = _SETVALUEREQUEST
-DESCRIPTOR.message_types_by_name['SetValuePtrRequest'] = _SETVALUEPTRREQUEST
-DESCRIPTOR.message_types_by_name['SetValueAtIndicesRequest'] = _SETVALUEATINDICESREQUEST
-DESCRIPTOR.message_types_by_name['GridRequest'] = _GRIDREQUEST
-DESCRIPTOR.message_types_by_name['GetGridSizeResponse'] = _GETGRIDSIZERESPONSE
-DESCRIPTOR.message_types_by_name['GetGridRankResponse'] = _GETGRIDRANKRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridTypeResponse'] = _GETGRIDTYPERESPONSE
-DESCRIPTOR.message_types_by_name['GetGridShapeResponse'] = _GETGRIDSHAPERESPONSE
-DESCRIPTOR.message_types_by_name['GetGridSpacingResponse'] = _GETGRIDSPACINGRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridOriginResponse'] = _GETGRIDORIGINRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridPointsResponse'] = _GETGRIDPOINTSRESPONSE
-DESCRIPTOR.message_types_by_name['GetCountResponse'] = _GETCOUNTRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridEdgeNodesResponse'] = _GETGRIDEDGENODESRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridFaceEdgesResponse'] = _GETGRIDFACEEDGESRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridFaceNodesResponse'] = _GETGRIDFACENODESRESPONSE
-DESCRIPTOR.message_types_by_name['GetGridNodesPerFaceResponse'] = _GETGRIDNODESPERFACERESPONSE
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {
-  'DESCRIPTOR' : _EMPTY,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.Empty)
-  })
-_sym_db.RegisterMessage(Empty)
-
-InitializeRequest = _reflection.GeneratedProtocolMessageType('InitializeRequest', (_message.Message,), {
-  'DESCRIPTOR' : _INITIALIZEREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.InitializeRequest)
-  })
-_sym_db.RegisterMessage(InitializeRequest)
-
-GetComponentNameResponse = _reflection.GeneratedProtocolMessageType('GetComponentNameResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETCOMPONENTNAMERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetComponentNameResponse)
-  })
-_sym_db.RegisterMessage(GetComponentNameResponse)
-
-GetVarNamesResponse = _reflection.GeneratedProtocolMessageType('GetVarNamesResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARNAMESRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarNamesResponse)
-  })
-_sym_db.RegisterMessage(GetVarNamesResponse)
-
-GetTimeUnitsResponse = _reflection.GeneratedProtocolMessageType('GetTimeUnitsResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETTIMEUNITSRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetTimeUnitsResponse)
-  })
-_sym_db.RegisterMessage(GetTimeUnitsResponse)
-
-GetTimeStepResponse = _reflection.GeneratedProtocolMessageType('GetTimeStepResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETTIMESTEPRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetTimeStepResponse)
-  })
-_sym_db.RegisterMessage(GetTimeStepResponse)
-
-GetTimeResponse = _reflection.GeneratedProtocolMessageType('GetTimeResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETTIMERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetTimeResponse)
-  })
-_sym_db.RegisterMessage(GetTimeResponse)
-
-GetVarRequest = _reflection.GeneratedProtocolMessageType('GetVarRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarRequest)
-  })
-_sym_db.RegisterMessage(GetVarRequest)
-
-GetVarGridResponse = _reflection.GeneratedProtocolMessageType('GetVarGridResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARGRIDRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarGridResponse)
-  })
-_sym_db.RegisterMessage(GetVarGridResponse)
-
-GetVarTypeResponse = _reflection.GeneratedProtocolMessageType('GetVarTypeResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARTYPERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarTypeResponse)
-  })
-_sym_db.RegisterMessage(GetVarTypeResponse)
-
-GetVarItemSizeResponse = _reflection.GeneratedProtocolMessageType('GetVarItemSizeResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARITEMSIZERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarItemSizeResponse)
-  })
-_sym_db.RegisterMessage(GetVarItemSizeResponse)
-
-GetVarUnitsResponse = _reflection.GeneratedProtocolMessageType('GetVarUnitsResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARUNITSRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarUnitsResponse)
-  })
-_sym_db.RegisterMessage(GetVarUnitsResponse)
-
-GetVarNBytesResponse = _reflection.GeneratedProtocolMessageType('GetVarNBytesResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARNBYTESRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarNBytesResponse)
-  })
-_sym_db.RegisterMessage(GetVarNBytesResponse)
-
-GetVarLocationResponse = _reflection.GeneratedProtocolMessageType('GetVarLocationResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVARLOCATIONRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetVarLocationResponse)
-  })
-_sym_db.RegisterMessage(GetVarLocationResponse)
-
-IntArrayMessage = _reflection.GeneratedProtocolMessageType('IntArrayMessage', (_message.Message,), {
-  'DESCRIPTOR' : _INTARRAYMESSAGE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.IntArrayMessage)
-  })
-_sym_db.RegisterMessage(IntArrayMessage)
-
-FloatArrayMessage = _reflection.GeneratedProtocolMessageType('FloatArrayMessage', (_message.Message,), {
-  'DESCRIPTOR' : _FLOATARRAYMESSAGE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.FloatArrayMessage)
-  })
-_sym_db.RegisterMessage(FloatArrayMessage)
-
-DoubleArrayMessage = _reflection.GeneratedProtocolMessageType('DoubleArrayMessage', (_message.Message,), {
-  'DESCRIPTOR' : _DOUBLEARRAYMESSAGE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.DoubleArrayMessage)
-  })
-_sym_db.RegisterMessage(DoubleArrayMessage)
-
-GetValueResponse = _reflection.GeneratedProtocolMessageType('GetValueResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVALUERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetValueResponse)
-  })
-_sym_db.RegisterMessage(GetValueResponse)
-
-GetValueAtIndicesRequest = _reflection.GeneratedProtocolMessageType('GetValueAtIndicesRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GETVALUEATINDICESREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetValueAtIndicesRequest)
-  })
-_sym_db.RegisterMessage(GetValueAtIndicesRequest)
-
-GetValueAtIndicesResponse = _reflection.GeneratedProtocolMessageType('GetValueAtIndicesResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETVALUEATINDICESRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetValueAtIndicesResponse)
-  })
-_sym_db.RegisterMessage(GetValueAtIndicesResponse)
-
-SetValueRequest = _reflection.GeneratedProtocolMessageType('SetValueRequest', (_message.Message,), {
-  'DESCRIPTOR' : _SETVALUEREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.SetValueRequest)
-  })
-_sym_db.RegisterMessage(SetValueRequest)
-
-SetValuePtrRequest = _reflection.GeneratedProtocolMessageType('SetValuePtrRequest', (_message.Message,), {
-  'DESCRIPTOR' : _SETVALUEPTRREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.SetValuePtrRequest)
-  })
-_sym_db.RegisterMessage(SetValuePtrRequest)
-
-SetValueAtIndicesRequest = _reflection.GeneratedProtocolMessageType('SetValueAtIndicesRequest', (_message.Message,), {
-  'DESCRIPTOR' : _SETVALUEATINDICESREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.SetValueAtIndicesRequest)
-  })
-_sym_db.RegisterMessage(SetValueAtIndicesRequest)
-
-GridRequest = _reflection.GeneratedProtocolMessageType('GridRequest', (_message.Message,), {
-  'DESCRIPTOR' : _GRIDREQUEST,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GridRequest)
-  })
-_sym_db.RegisterMessage(GridRequest)
-
-GetGridSizeResponse = _reflection.GeneratedProtocolMessageType('GetGridSizeResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDSIZERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridSizeResponse)
-  })
-_sym_db.RegisterMessage(GetGridSizeResponse)
-
-GetGridRankResponse = _reflection.GeneratedProtocolMessageType('GetGridRankResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDRANKRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridRankResponse)
-  })
-_sym_db.RegisterMessage(GetGridRankResponse)
-
-GetGridTypeResponse = _reflection.GeneratedProtocolMessageType('GetGridTypeResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDTYPERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridTypeResponse)
-  })
-_sym_db.RegisterMessage(GetGridTypeResponse)
-
-GetGridShapeResponse = _reflection.GeneratedProtocolMessageType('GetGridShapeResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDSHAPERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridShapeResponse)
-  })
-_sym_db.RegisterMessage(GetGridShapeResponse)
-
-GetGridSpacingResponse = _reflection.GeneratedProtocolMessageType('GetGridSpacingResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDSPACINGRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridSpacingResponse)
-  })
-_sym_db.RegisterMessage(GetGridSpacingResponse)
-
-GetGridOriginResponse = _reflection.GeneratedProtocolMessageType('GetGridOriginResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDORIGINRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridOriginResponse)
-  })
-_sym_db.RegisterMessage(GetGridOriginResponse)
-
-GetGridPointsResponse = _reflection.GeneratedProtocolMessageType('GetGridPointsResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDPOINTSRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridPointsResponse)
-  })
-_sym_db.RegisterMessage(GetGridPointsResponse)
-
-GetCountResponse = _reflection.GeneratedProtocolMessageType('GetCountResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETCOUNTRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetCountResponse)
-  })
-_sym_db.RegisterMessage(GetCountResponse)
-
-GetGridEdgeNodesResponse = _reflection.GeneratedProtocolMessageType('GetGridEdgeNodesResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDEDGENODESRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridEdgeNodesResponse)
-  })
-_sym_db.RegisterMessage(GetGridEdgeNodesResponse)
-
-GetGridFaceEdgesResponse = _reflection.GeneratedProtocolMessageType('GetGridFaceEdgesResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDFACEEDGESRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridFaceEdgesResponse)
-  })
-_sym_db.RegisterMessage(GetGridFaceEdgesResponse)
-
-GetGridFaceNodesResponse = _reflection.GeneratedProtocolMessageType('GetGridFaceNodesResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDFACENODESRESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridFaceNodesResponse)
-  })
-_sym_db.RegisterMessage(GetGridFaceNodesResponse)
-
-GetGridNodesPerFaceResponse = _reflection.GeneratedProtocolMessageType('GetGridNodesPerFaceResponse', (_message.Message,), {
-  'DESCRIPTOR' : _GETGRIDNODESPERFACERESPONSE,
-  '__module__' : 'grpc4bmi.bmi_pb2'
-  # @@protoc_insertion_point(class_scope:bmi.GetGridNodesPerFaceResponse)
-  })
-_sym_db.RegisterMessage(GetGridNodesPerFaceResponse)
-
-
-_INTARRAYMESSAGE.fields_by_name['values']._options = None
-_FLOATARRAYMESSAGE.fields_by_name['values']._options = None
-_DOUBLEARRAYMESSAGE.fields_by_name['values']._options = None
-_GETVALUEATINDICESREQUEST.fields_by_name['indices']._options = None
-_SETVALUEATINDICESREQUEST.fields_by_name['indices']._options = None
-_GETGRIDSHAPERESPONSE.fields_by_name['shape']._options = None
-_GETGRIDSPACINGRESPONSE.fields_by_name['spacing']._options = None
-_GETGRIDORIGINRESPONSE.fields_by_name['origin']._options = None
-_GETGRIDPOINTSRESPONSE.fields_by_name['coordinates']._options = None
-_GETGRIDEDGENODESRESPONSE.fields_by_name['edge_nodes']._options = None
-_GETGRIDFACEEDGESRESPONSE.fields_by_name['face_edges']._options = None
-_GETGRIDFACENODESRESPONSE.fields_by_name['face_nodes']._options = None
-_GETGRIDNODESPERFACERESPONSE.fields_by_name['nodes_per_face']._options = None
-
-_BMISERVICE = _descriptor.ServiceDescriptor(
-  name='BmiService',
-  full_name='bmi.BmiService',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  serialized_start=2189,
-  serialized_end=4631,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='initialize',
-    full_name='bmi.BmiService.initialize',
-    index=0,
-    containing_service=None,
-    input_type=_INITIALIZEREQUEST,
-    output_type=_EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='update',
-    full_name='bmi.BmiService.update',
-    index=1,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='updateUntil',
-    full_name='bmi.BmiService.updateUntil',
-    index=2,
-    containing_service=None,
-    input_type=_GETTIMERESPONSE,
-    output_type=_EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='finalize',
-    full_name='bmi.BmiService.finalize',
-    index=3,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getComponentName',
-    full_name='bmi.BmiService.getComponentName',
-    index=4,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETCOMPONENTNAMERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getInputItemCount',
-    full_name='bmi.BmiService.getInputItemCount',
-    index=5,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETCOUNTRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getOutputItemCount',
-    full_name='bmi.BmiService.getOutputItemCount',
-    index=6,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETCOUNTRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getInputVarNames',
-    full_name='bmi.BmiService.getInputVarNames',
-    index=7,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETVARNAMESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getOutputVarNames',
-    full_name='bmi.BmiService.getOutputVarNames',
-    index=8,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETVARNAMESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getTimeUnits',
-    full_name='bmi.BmiService.getTimeUnits',
-    index=9,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETTIMEUNITSRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getTimeStep',
-    full_name='bmi.BmiService.getTimeStep',
-    index=10,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETTIMESTEPRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getCurrentTime',
-    full_name='bmi.BmiService.getCurrentTime',
-    index=11,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETTIMERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getStartTime',
-    full_name='bmi.BmiService.getStartTime',
-    index=12,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETTIMERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getEndTime',
-    full_name='bmi.BmiService.getEndTime',
-    index=13,
-    containing_service=None,
-    input_type=_EMPTY,
-    output_type=_GETTIMERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getVarGrid',
-    full_name='bmi.BmiService.getVarGrid',
-    index=14,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVARGRIDRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getVarType',
-    full_name='bmi.BmiService.getVarType',
-    index=15,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVARTYPERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getVarItemSize',
-    full_name='bmi.BmiService.getVarItemSize',
-    index=16,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVARITEMSIZERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getVarUnits',
-    full_name='bmi.BmiService.getVarUnits',
-    index=17,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVARUNITSRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getVarNBytes',
-    full_name='bmi.BmiService.getVarNBytes',
-    index=18,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVARNBYTESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getVarLocation',
-    full_name='bmi.BmiService.getVarLocation',
-    index=19,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVARLOCATIONRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getValue',
-    full_name='bmi.BmiService.getValue',
-    index=20,
-    containing_service=None,
-    input_type=_GETVARREQUEST,
-    output_type=_GETVALUERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getValueAtIndices',
-    full_name='bmi.BmiService.getValueAtIndices',
-    index=21,
-    containing_service=None,
-    input_type=_GETVALUEATINDICESREQUEST,
-    output_type=_GETVALUEATINDICESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='setValue',
-    full_name='bmi.BmiService.setValue',
-    index=22,
-    containing_service=None,
-    input_type=_SETVALUEREQUEST,
-    output_type=_EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='setValueAtIndices',
-    full_name='bmi.BmiService.setValueAtIndices',
-    index=23,
-    containing_service=None,
-    input_type=_SETVALUEATINDICESREQUEST,
-    output_type=_EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridSize',
-    full_name='bmi.BmiService.getGridSize',
-    index=24,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDSIZERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridType',
-    full_name='bmi.BmiService.getGridType',
-    index=25,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDTYPERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridRank',
-    full_name='bmi.BmiService.getGridRank',
-    index=26,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDRANKRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridShape',
-    full_name='bmi.BmiService.getGridShape',
-    index=27,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDSHAPERESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridSpacing',
-    full_name='bmi.BmiService.getGridSpacing',
-    index=28,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDSPACINGRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridOrigin',
-    full_name='bmi.BmiService.getGridOrigin',
-    index=29,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDORIGINRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridX',
-    full_name='bmi.BmiService.getGridX',
-    index=30,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDPOINTSRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridY',
-    full_name='bmi.BmiService.getGridY',
-    index=31,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDPOINTSRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridZ',
-    full_name='bmi.BmiService.getGridZ',
-    index=32,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDPOINTSRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridNodeCount',
-    full_name='bmi.BmiService.getGridNodeCount',
-    index=33,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETCOUNTRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridEdgeCount',
-    full_name='bmi.BmiService.getGridEdgeCount',
-    index=34,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETCOUNTRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridFaceCount',
-    full_name='bmi.BmiService.getGridFaceCount',
-    index=35,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETCOUNTRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridEdgeNodes',
-    full_name='bmi.BmiService.getGridEdgeNodes',
-    index=36,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDEDGENODESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridFaceNodes',
-    full_name='bmi.BmiService.getGridFaceNodes',
-    index=37,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDFACENODESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridFaceEdges',
-    full_name='bmi.BmiService.getGridFaceEdges',
-    index=38,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDFACEEDGESRESPONSE,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='getGridNodesPerFace',
-    full_name='bmi.BmiService.getGridNodesPerFace',
-    index=39,
-    containing_service=None,
-    input_type=_GRIDREQUEST,
-    output_type=_GETGRIDNODESPERFACERESPONSE,
-    serialized_options=None,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_BMISERVICE)
-
-DESCRIPTOR.services_by_name['BmiService'] = _BMISERVICE
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12grpc4bmi/bmi.proto\x12\x03\x62mi\"\x07\n\x05\x45mpty\"(\n\x11InitializeRequest\x12\x13\n\x0b\x63onfig_file\x18\x01 \x01(\t\"(\n\x18GetComponentNameResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\"$\n\x13GetVarNamesResponse\x12\r\n\x05names\x18\x01 \x03(\t\"%\n\x14GetTimeUnitsResponse\x12\r\n\x05units\x18\x01 \x01(\t\"\'\n\x13GetTimeStepResponse\x12\x10\n\x08interval\x18\x01 \x01(\x01\"\x1f\n\x0fGetTimeResponse\x12\x0c\n\x04time\x18\x01 \x01(\x01\"\x1d\n\rGetVarRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"%\n\x12GetVarGridResponse\x12\x0f\n\x07grid_id\x18\x01 \x01(\x05\"\"\n\x12GetVarTypeResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\"&\n\x16GetVarItemSizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"$\n\x13GetVarUnitsResponse\x12\r\n\x05units\x18\x01 \x01(\t\"&\n\x14GetVarNBytesResponse\x12\x0e\n\x06nbytes\x18\x01 \x01(\x03\"z\n\x16GetVarLocationResponse\x12\x36\n\x08location\x18\x01 \x01(\x0e\x32$.bmi.GetVarLocationResponse.Location\"(\n\x08Location\x12\x08\n\x04NODE\x10\x00\x12\x08\n\x04\x45\x44GE\x10\x01\x12\x08\n\x04\x46\x41\x43\x45\x10\x02\"%\n\x0fIntArrayMessage\x12\x12\n\x06values\x18\x01 \x03(\x03\x42\x02\x10\x01\"\'\n\x11\x46loatArrayMessage\x12\x12\n\x06values\x18\x01 \x03(\x02\x42\x02\x10\x01\"(\n\x12\x44oubleArrayMessage\x12\x12\n\x06values\x18\x01 \x03(\x01\x42\x02\x10\x01\"\xaa\x01\n\x10GetValueResponse\x12*\n\nvalues_int\x18\x01 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x02 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x03 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"=\n\x18GetValueAtIndicesRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07indices\x18\x02 \x03(\x03\x42\x02\x10\x01\"\xb3\x01\n\x19GetValueAtIndicesResponse\x12*\n\nvalues_int\x18\x01 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x02 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x03 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"\xb7\x01\n\x0fSetValueRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12*\n\nvalues_int\x18\x02 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x03 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x04 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"/\n\x12SetValuePtrRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0b\n\x03ref\x18\x02 \x01(\x03\"\xd5\x01\n\x18SetValueAtIndicesRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x07indices\x18\x02 \x03(\x03\x42\x02\x10\x01\x12*\n\nvalues_int\x18\x03 \x01(\x0b\x32\x14.bmi.IntArrayMessageH\x00\x12.\n\x0cvalues_float\x18\x04 \x01(\x0b\x32\x16.bmi.FloatArrayMessageH\x00\x12\x30\n\rvalues_double\x18\x05 \x01(\x0b\x32\x17.bmi.DoubleArrayMessageH\x00\x42\x08\n\x06values\"\x1e\n\x0bGridRequest\x12\x0f\n\x07grid_id\x18\x01 \x01(\x03\"#\n\x13GetGridSizeResponse\x12\x0c\n\x04size\x18\x01 \x01(\x03\"#\n\x13GetGridRankResponse\x12\x0c\n\x04rank\x18\x01 \x01(\x03\"#\n\x13GetGridTypeResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\")\n\x14GetGridShapeResponse\x12\x11\n\x05shape\x18\x01 \x03(\x03\x42\x02\x10\x01\"-\n\x16GetGridSpacingResponse\x12\x13\n\x07spacing\x18\x01 \x03(\x01\x42\x02\x10\x01\"+\n\x15GetGridOriginResponse\x12\x12\n\x06origin\x18\x01 \x03(\x01\x42\x02\x10\x01\"0\n\x15GetGridPointsResponse\x12\x17\n\x0b\x63oordinates\x18\x01 \x03(\x01\x42\x02\x10\x01\"!\n\x10GetCountResponse\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\"2\n\x18GetGridEdgeNodesResponse\x12\x16\n\nedge_nodes\x18\x01 \x03(\x03\x42\x02\x10\x01\"2\n\x18GetGridFaceEdgesResponse\x12\x16\n\nface_edges\x18\x01 \x03(\x03\x42\x02\x10\x01\"2\n\x18GetGridFaceNodesResponse\x12\x16\n\nface_nodes\x18\x01 \x03(\x03\x42\x02\x10\x01\"9\n\x1bGetGridNodesPerFaceResponse\x12\x1a\n\x0enodes_per_face\x18\x01 \x03(\x03\x42\x02\x10\x01\x32\x8a\x13\n\nBmiService\x12\x32\n\ninitialize\x12\x16.bmi.InitializeRequest\x1a\n.bmi.Empty\"\x00\x12\"\n\x06update\x12\n.bmi.Empty\x1a\n.bmi.Empty\"\x00\x12\x31\n\x0bupdateUntil\x12\x14.bmi.GetTimeResponse\x1a\n.bmi.Empty\"\x00\x12$\n\x08\x66inalize\x12\n.bmi.Empty\x1a\n.bmi.Empty\"\x00\x12?\n\x10getComponentName\x12\n.bmi.Empty\x1a\x1d.bmi.GetComponentNameResponse\"\x00\x12\x38\n\x11getInputItemCount\x12\n.bmi.Empty\x1a\x15.bmi.GetCountResponse\"\x00\x12\x39\n\x12getOutputItemCount\x12\n.bmi.Empty\x1a\x15.bmi.GetCountResponse\"\x00\x12:\n\x10getInputVarNames\x12\n.bmi.Empty\x1a\x18.bmi.GetVarNamesResponse\"\x00\x12;\n\x11getOutputVarNames\x12\n.bmi.Empty\x1a\x18.bmi.GetVarNamesResponse\"\x00\x12\x37\n\x0cgetTimeUnits\x12\n.bmi.Empty\x1a\x19.bmi.GetTimeUnitsResponse\"\x00\x12\x35\n\x0bgetTimeStep\x12\n.bmi.Empty\x1a\x18.bmi.GetTimeStepResponse\"\x00\x12\x34\n\x0egetCurrentTime\x12\n.bmi.Empty\x1a\x14.bmi.GetTimeResponse\"\x00\x12\x32\n\x0cgetStartTime\x12\n.bmi.Empty\x1a\x14.bmi.GetTimeResponse\"\x00\x12\x30\n\ngetEndTime\x12\n.bmi.Empty\x1a\x14.bmi.GetTimeResponse\"\x00\x12;\n\ngetVarGrid\x12\x12.bmi.GetVarRequest\x1a\x17.bmi.GetVarGridResponse\"\x00\x12;\n\ngetVarType\x12\x12.bmi.GetVarRequest\x1a\x17.bmi.GetVarTypeResponse\"\x00\x12\x43\n\x0egetVarItemSize\x12\x12.bmi.GetVarRequest\x1a\x1b.bmi.GetVarItemSizeResponse\"\x00\x12=\n\x0bgetVarUnits\x12\x12.bmi.GetVarRequest\x1a\x18.bmi.GetVarUnitsResponse\"\x00\x12?\n\x0cgetVarNBytes\x12\x12.bmi.GetVarRequest\x1a\x19.bmi.GetVarNBytesResponse\"\x00\x12\x43\n\x0egetVarLocation\x12\x12.bmi.GetVarRequest\x1a\x1b.bmi.GetVarLocationResponse\"\x00\x12\x37\n\x08getValue\x12\x12.bmi.GetVarRequest\x1a\x15.bmi.GetValueResponse\"\x00\x12T\n\x11getValueAtIndices\x12\x1d.bmi.GetValueAtIndicesRequest\x1a\x1e.bmi.GetValueAtIndicesResponse\"\x00\x12.\n\x08setValue\x12\x14.bmi.SetValueRequest\x1a\n.bmi.Empty\"\x00\x12@\n\x11setValueAtIndices\x12\x1d.bmi.SetValueAtIndicesRequest\x1a\n.bmi.Empty\"\x00\x12;\n\x0bgetGridSize\x12\x10.bmi.GridRequest\x1a\x18.bmi.GetGridSizeResponse\"\x00\x12;\n\x0bgetGridType\x12\x10.bmi.GridRequest\x1a\x18.bmi.GetGridTypeResponse\"\x00\x12;\n\x0bgetGridRank\x12\x10.bmi.GridRequest\x1a\x18.bmi.GetGridRankResponse\"\x00\x12=\n\x0cgetGridShape\x12\x10.bmi.GridRequest\x1a\x19.bmi.GetGridShapeResponse\"\x00\x12\x41\n\x0egetGridSpacing\x12\x10.bmi.GridRequest\x1a\x1b.bmi.GetGridSpacingResponse\"\x00\x12?\n\rgetGridOrigin\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridOriginResponse\"\x00\x12:\n\x08getGridX\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridPointsResponse\"\x00\x12:\n\x08getGridY\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridPointsResponse\"\x00\x12:\n\x08getGridZ\x12\x10.bmi.GridRequest\x1a\x1a.bmi.GetGridPointsResponse\"\x00\x12=\n\x10getGridNodeCount\x12\x10.bmi.GridRequest\x1a\x15.bmi.GetCountResponse\"\x00\x12=\n\x10getGridEdgeCount\x12\x10.bmi.GridRequest\x1a\x15.bmi.GetCountResponse\"\x00\x12=\n\x10getGridFaceCount\x12\x10.bmi.GridRequest\x1a\x15.bmi.GetCountResponse\"\x00\x12\x45\n\x10getGridEdgeNodes\x12\x10.bmi.GridRequest\x1a\x1d.bmi.GetGridEdgeNodesResponse\"\x00\x12\x45\n\x10getGridFaceNodes\x12\x10.bmi.GridRequest\x1a\x1d.bmi.GetGridFaceNodesResponse\"\x00\x12\x45\n\x10getGridFaceEdges\x12\x10.bmi.GridRequest\x1a\x1d.bmi.GetGridFaceEdgesResponse\"\x00\x12K\n\x13getGridNodesPerFace\x12\x10.bmi.GridRequest\x1a .bmi.GetGridNodesPerFaceResponse\"\x00\x62\x06proto3')
+
+_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
+_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'grpc4bmi.bmi_pb2', globals())
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _INTARRAYMESSAGE.fields_by_name['values']._options = None
+  _INTARRAYMESSAGE.fields_by_name['values']._serialized_options = b'\020\001'
+  _FLOATARRAYMESSAGE.fields_by_name['values']._options = None
+  _FLOATARRAYMESSAGE.fields_by_name['values']._serialized_options = b'\020\001'
+  _DOUBLEARRAYMESSAGE.fields_by_name['values']._options = None
+  _DOUBLEARRAYMESSAGE.fields_by_name['values']._serialized_options = b'\020\001'
+  _GETVALUEATINDICESREQUEST.fields_by_name['indices']._options = None
+  _GETVALUEATINDICESREQUEST.fields_by_name['indices']._serialized_options = b'\020\001'
+  _SETVALUEATINDICESREQUEST.fields_by_name['indices']._options = None
+  _SETVALUEATINDICESREQUEST.fields_by_name['indices']._serialized_options = b'\020\001'
+  _GETGRIDSHAPERESPONSE.fields_by_name['shape']._options = None
+  _GETGRIDSHAPERESPONSE.fields_by_name['shape']._serialized_options = b'\020\001'
+  _GETGRIDSPACINGRESPONSE.fields_by_name['spacing']._options = None
+  _GETGRIDSPACINGRESPONSE.fields_by_name['spacing']._serialized_options = b'\020\001'
+  _GETGRIDORIGINRESPONSE.fields_by_name['origin']._options = None
+  _GETGRIDORIGINRESPONSE.fields_by_name['origin']._serialized_options = b'\020\001'
+  _GETGRIDPOINTSRESPONSE.fields_by_name['coordinates']._options = None
+  _GETGRIDPOINTSRESPONSE.fields_by_name['coordinates']._serialized_options = b'\020\001'
+  _GETGRIDEDGENODESRESPONSE.fields_by_name['edge_nodes']._options = None
+  _GETGRIDEDGENODESRESPONSE.fields_by_name['edge_nodes']._serialized_options = b'\020\001'
+  _GETGRIDFACEEDGESRESPONSE.fields_by_name['face_edges']._options = None
+  _GETGRIDFACEEDGESRESPONSE.fields_by_name['face_edges']._serialized_options = b'\020\001'
+  _GETGRIDFACENODESRESPONSE.fields_by_name['face_nodes']._options = None
+  _GETGRIDFACENODESRESPONSE.fields_by_name['face_nodes']._serialized_options = b'\020\001'
+  _GETGRIDNODESPERFACERESPONSE.fields_by_name['nodes_per_face']._options = None
+  _GETGRIDNODESPERFACERESPONSE.fields_by_name['nodes_per_face']._serialized_options = b'\020\001'
+  _EMPTY._serialized_start=27
+  _EMPTY._serialized_end=34
+  _INITIALIZEREQUEST._serialized_start=36
+  _INITIALIZEREQUEST._serialized_end=76
+  _GETCOMPONENTNAMERESPONSE._serialized_start=78
+  _GETCOMPONENTNAMERESPONSE._serialized_end=118
+  _GETVARNAMESRESPONSE._serialized_start=120
+  _GETVARNAMESRESPONSE._serialized_end=156
+  _GETTIMEUNITSRESPONSE._serialized_start=158
+  _GETTIMEUNITSRESPONSE._serialized_end=195
+  _GETTIMESTEPRESPONSE._serialized_start=197
+  _GETTIMESTEPRESPONSE._serialized_end=236
+  _GETTIMERESPONSE._serialized_start=238
+  _GETTIMERESPONSE._serialized_end=269
+  _GETVARREQUEST._serialized_start=271
+  _GETVARREQUEST._serialized_end=300
+  _GETVARGRIDRESPONSE._serialized_start=302
+  _GETVARGRIDRESPONSE._serialized_end=339
+  _GETVARTYPERESPONSE._serialized_start=341
+  _GETVARTYPERESPONSE._serialized_end=375
+  _GETVARITEMSIZERESPONSE._serialized_start=377
+  _GETVARITEMSIZERESPONSE._serialized_end=415
+  _GETVARUNITSRESPONSE._serialized_start=417
+  _GETVARUNITSRESPONSE._serialized_end=453
+  _GETVARNBYTESRESPONSE._serialized_start=455
+  _GETVARNBYTESRESPONSE._serialized_end=493
+  _GETVARLOCATIONRESPONSE._serialized_start=495
+  _GETVARLOCATIONRESPONSE._serialized_end=617
+  _GETVARLOCATIONRESPONSE_LOCATION._serialized_start=577
+  _GETVARLOCATIONRESPONSE_LOCATION._serialized_end=617
+  _INTARRAYMESSAGE._serialized_start=619
+  _INTARRAYMESSAGE._serialized_end=656
+  _FLOATARRAYMESSAGE._serialized_start=658
+  _FLOATARRAYMESSAGE._serialized_end=697
+  _DOUBLEARRAYMESSAGE._serialized_start=699
+  _DOUBLEARRAYMESSAGE._serialized_end=739
+  _GETVALUERESPONSE._serialized_start=742
+  _GETVALUERESPONSE._serialized_end=912
+  _GETVALUEATINDICESREQUEST._serialized_start=914
+  _GETVALUEATINDICESREQUEST._serialized_end=975
+  _GETVALUEATINDICESRESPONSE._serialized_start=978
+  _GETVALUEATINDICESRESPONSE._serialized_end=1157
+  _SETVALUEREQUEST._serialized_start=1160
+  _SETVALUEREQUEST._serialized_end=1343
+  _SETVALUEPTRREQUEST._serialized_start=1345
+  _SETVALUEPTRREQUEST._serialized_end=1392
+  _SETVALUEATINDICESREQUEST._serialized_start=1395
+  _SETVALUEATINDICESREQUEST._serialized_end=1608
+  _GRIDREQUEST._serialized_start=1610
+  _GRIDREQUEST._serialized_end=1640
+  _GETGRIDSIZERESPONSE._serialized_start=1642
+  _GETGRIDSIZERESPONSE._serialized_end=1677
+  _GETGRIDRANKRESPONSE._serialized_start=1679
+  _GETGRIDRANKRESPONSE._serialized_end=1714
+  _GETGRIDTYPERESPONSE._serialized_start=1716
+  _GETGRIDTYPERESPONSE._serialized_end=1751
+  _GETGRIDSHAPERESPONSE._serialized_start=1753
+  _GETGRIDSHAPERESPONSE._serialized_end=1794
+  _GETGRIDSPACINGRESPONSE._serialized_start=1796
+  _GETGRIDSPACINGRESPONSE._serialized_end=1841
+  _GETGRIDORIGINRESPONSE._serialized_start=1843
+  _GETGRIDORIGINRESPONSE._serialized_end=1886
+  _GETGRIDPOINTSRESPONSE._serialized_start=1888
+  _GETGRIDPOINTSRESPONSE._serialized_end=1936
+  _GETCOUNTRESPONSE._serialized_start=1938
+  _GETCOUNTRESPONSE._serialized_end=1971
+  _GETGRIDEDGENODESRESPONSE._serialized_start=1973
+  _GETGRIDEDGENODESRESPONSE._serialized_end=2023
+  _GETGRIDFACEEDGESRESPONSE._serialized_start=2025
+  _GETGRIDFACEEDGESRESPONSE._serialized_end=2075
+  _GETGRIDFACENODESRESPONSE._serialized_start=2077
+  _GETGRIDFACENODESRESPONSE._serialized_end=2127
+  _GETGRIDNODESPERFACERESPONSE._serialized_start=2129
+  _GETGRIDNODESPERFACERESPONSE._serialized_end=2186
+  _BMISERVICE._serialized_start=2189
+  _BMISERVICE._serialized_end=4631
 # @@protoc_insertion_point(module_scope)
diff --git a/grpc4bmi/bmi_pb2_grpc.py b/grpc4bmi/bmi_pb2_grpc.py
index 9db5fc7..d6e2ed4 100644
--- a/grpc4bmi/bmi_pb2_grpc.py
+++ b/grpc4bmi/bmi_pb2_grpc.py
@@ -1,709 +1,1353 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 from grpc4bmi import bmi_pb2 as grpc4bmi_dot_bmi__pb2
 
 
 class BmiServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.initialize = channel.unary_unary(
-        '/bmi.BmiService/initialize',
-        request_serializer=grpc4bmi_dot_bmi__pb2.InitializeRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-        )
-    self.update = channel.unary_unary(
-        '/bmi.BmiService/update',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-        )
-    self.updateUntil = channel.unary_unary(
-        '/bmi.BmiService/updateUntil',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-        )
-    self.finalize = channel.unary_unary(
-        '/bmi.BmiService/finalize',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-        )
-    self.getComponentName = channel.unary_unary(
-        '/bmi.BmiService/getComponentName',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetComponentNameResponse.FromString,
-        )
-    self.getInputItemCount = channel.unary_unary(
-        '/bmi.BmiService/getInputItemCount',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
-        )
-    self.getOutputItemCount = channel.unary_unary(
-        '/bmi.BmiService/getOutputItemCount',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
-        )
-    self.getInputVarNames = channel.unary_unary(
-        '/bmi.BmiService/getInputVarNames',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.FromString,
-        )
-    self.getOutputVarNames = channel.unary_unary(
-        '/bmi.BmiService/getOutputVarNames',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.FromString,
-        )
-    self.getTimeUnits = channel.unary_unary(
-        '/bmi.BmiService/getTimeUnits',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeUnitsResponse.FromString,
-        )
-    self.getTimeStep = channel.unary_unary(
-        '/bmi.BmiService/getTimeStep',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeStepResponse.FromString,
-        )
-    self.getCurrentTime = channel.unary_unary(
-        '/bmi.BmiService/getCurrentTime',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
-        )
-    self.getStartTime = channel.unary_unary(
-        '/bmi.BmiService/getStartTime',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
-        )
-    self.getEndTime = channel.unary_unary(
-        '/bmi.BmiService/getEndTime',
-        request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
-        )
-    self.getVarGrid = channel.unary_unary(
-        '/bmi.BmiService/getVarGrid',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarGridResponse.FromString,
-        )
-    self.getVarType = channel.unary_unary(
-        '/bmi.BmiService/getVarType',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarTypeResponse.FromString,
-        )
-    self.getVarItemSize = channel.unary_unary(
-        '/bmi.BmiService/getVarItemSize',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarItemSizeResponse.FromString,
-        )
-    self.getVarUnits = channel.unary_unary(
-        '/bmi.BmiService/getVarUnits',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarUnitsResponse.FromString,
-        )
-    self.getVarNBytes = channel.unary_unary(
-        '/bmi.BmiService/getVarNBytes',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarNBytesResponse.FromString,
-        )
-    self.getVarLocation = channel.unary_unary(
-        '/bmi.BmiService/getVarLocation',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarLocationResponse.FromString,
-        )
-    self.getValue = channel.unary_unary(
-        '/bmi.BmiService/getValue',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetValueResponse.FromString,
-        )
-    self.getValueAtIndices = channel.unary_unary(
-        '/bmi.BmiService/getValueAtIndices',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesResponse.FromString,
-        )
-    self.setValue = channel.unary_unary(
-        '/bmi.BmiService/setValue',
-        request_serializer=grpc4bmi_dot_bmi__pb2.SetValueRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-        )
-    self.setValueAtIndices = channel.unary_unary(
-        '/bmi.BmiService/setValueAtIndices',
-        request_serializer=grpc4bmi_dot_bmi__pb2.SetValueAtIndicesRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-        )
-    self.getGridSize = channel.unary_unary(
-        '/bmi.BmiService/getGridSize',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridSizeResponse.FromString,
-        )
-    self.getGridType = channel.unary_unary(
-        '/bmi.BmiService/getGridType',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridTypeResponse.FromString,
-        )
-    self.getGridRank = channel.unary_unary(
-        '/bmi.BmiService/getGridRank',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridRankResponse.FromString,
-        )
-    self.getGridShape = channel.unary_unary(
-        '/bmi.BmiService/getGridShape',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridShapeResponse.FromString,
-        )
-    self.getGridSpacing = channel.unary_unary(
-        '/bmi.BmiService/getGridSpacing',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridSpacingResponse.FromString,
-        )
-    self.getGridOrigin = channel.unary_unary(
-        '/bmi.BmiService/getGridOrigin',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridOriginResponse.FromString,
-        )
-    self.getGridX = channel.unary_unary(
-        '/bmi.BmiService/getGridX',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
-        )
-    self.getGridY = channel.unary_unary(
-        '/bmi.BmiService/getGridY',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
-        )
-    self.getGridZ = channel.unary_unary(
-        '/bmi.BmiService/getGridZ',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
-        )
-    self.getGridNodeCount = channel.unary_unary(
-        '/bmi.BmiService/getGridNodeCount',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
-        )
-    self.getGridEdgeCount = channel.unary_unary(
-        '/bmi.BmiService/getGridEdgeCount',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
-        )
-    self.getGridFaceCount = channel.unary_unary(
-        '/bmi.BmiService/getGridFaceCount',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
-        )
-    self.getGridEdgeNodes = channel.unary_unary(
-        '/bmi.BmiService/getGridEdgeNodes',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridEdgeNodesResponse.FromString,
-        )
-    self.getGridFaceNodes = channel.unary_unary(
-        '/bmi.BmiService/getGridFaceNodes',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridFaceNodesResponse.FromString,
-        )
-    self.getGridFaceEdges = channel.unary_unary(
-        '/bmi.BmiService/getGridFaceEdges',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridFaceEdgesResponse.FromString,
-        )
-    self.getGridNodesPerFace = channel.unary_unary(
-        '/bmi.BmiService/getGridNodesPerFace',
-        request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
-        response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridNodesPerFaceResponse.FromString,
-        )
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.initialize = channel.unary_unary(
+                '/bmi.BmiService/initialize',
+                request_serializer=grpc4bmi_dot_bmi__pb2.InitializeRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                )
+        self.update = channel.unary_unary(
+                '/bmi.BmiService/update',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                )
+        self.updateUntil = channel.unary_unary(
+                '/bmi.BmiService/updateUntil',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                )
+        self.finalize = channel.unary_unary(
+                '/bmi.BmiService/finalize',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                )
+        self.getComponentName = channel.unary_unary(
+                '/bmi.BmiService/getComponentName',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetComponentNameResponse.FromString,
+                )
+        self.getInputItemCount = channel.unary_unary(
+                '/bmi.BmiService/getInputItemCount',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+                )
+        self.getOutputItemCount = channel.unary_unary(
+                '/bmi.BmiService/getOutputItemCount',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+                )
+        self.getInputVarNames = channel.unary_unary(
+                '/bmi.BmiService/getInputVarNames',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.FromString,
+                )
+        self.getOutputVarNames = channel.unary_unary(
+                '/bmi.BmiService/getOutputVarNames',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.FromString,
+                )
+        self.getTimeUnits = channel.unary_unary(
+                '/bmi.BmiService/getTimeUnits',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeUnitsResponse.FromString,
+                )
+        self.getTimeStep = channel.unary_unary(
+                '/bmi.BmiService/getTimeStep',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeStepResponse.FromString,
+                )
+        self.getCurrentTime = channel.unary_unary(
+                '/bmi.BmiService/getCurrentTime',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+                )
+        self.getStartTime = channel.unary_unary(
+                '/bmi.BmiService/getStartTime',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+                )
+        self.getEndTime = channel.unary_unary(
+                '/bmi.BmiService/getEndTime',
+                request_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+                )
+        self.getVarGrid = channel.unary_unary(
+                '/bmi.BmiService/getVarGrid',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarGridResponse.FromString,
+                )
+        self.getVarType = channel.unary_unary(
+                '/bmi.BmiService/getVarType',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarTypeResponse.FromString,
+                )
+        self.getVarItemSize = channel.unary_unary(
+                '/bmi.BmiService/getVarItemSize',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarItemSizeResponse.FromString,
+                )
+        self.getVarUnits = channel.unary_unary(
+                '/bmi.BmiService/getVarUnits',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarUnitsResponse.FromString,
+                )
+        self.getVarNBytes = channel.unary_unary(
+                '/bmi.BmiService/getVarNBytes',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarNBytesResponse.FromString,
+                )
+        self.getVarLocation = channel.unary_unary(
+                '/bmi.BmiService/getVarLocation',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetVarLocationResponse.FromString,
+                )
+        self.getValue = channel.unary_unary(
+                '/bmi.BmiService/getValue',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetValueResponse.FromString,
+                )
+        self.getValueAtIndices = channel.unary_unary(
+                '/bmi.BmiService/getValueAtIndices',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesResponse.FromString,
+                )
+        self.setValue = channel.unary_unary(
+                '/bmi.BmiService/setValue',
+                request_serializer=grpc4bmi_dot_bmi__pb2.SetValueRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                )
+        self.setValueAtIndices = channel.unary_unary(
+                '/bmi.BmiService/setValueAtIndices',
+                request_serializer=grpc4bmi_dot_bmi__pb2.SetValueAtIndicesRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                )
+        self.getGridSize = channel.unary_unary(
+                '/bmi.BmiService/getGridSize',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridSizeResponse.FromString,
+                )
+        self.getGridType = channel.unary_unary(
+                '/bmi.BmiService/getGridType',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridTypeResponse.FromString,
+                )
+        self.getGridRank = channel.unary_unary(
+                '/bmi.BmiService/getGridRank',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridRankResponse.FromString,
+                )
+        self.getGridShape = channel.unary_unary(
+                '/bmi.BmiService/getGridShape',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridShapeResponse.FromString,
+                )
+        self.getGridSpacing = channel.unary_unary(
+                '/bmi.BmiService/getGridSpacing',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridSpacingResponse.FromString,
+                )
+        self.getGridOrigin = channel.unary_unary(
+                '/bmi.BmiService/getGridOrigin',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridOriginResponse.FromString,
+                )
+        self.getGridX = channel.unary_unary(
+                '/bmi.BmiService/getGridX',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
+                )
+        self.getGridY = channel.unary_unary(
+                '/bmi.BmiService/getGridY',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
+                )
+        self.getGridZ = channel.unary_unary(
+                '/bmi.BmiService/getGridZ',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
+                )
+        self.getGridNodeCount = channel.unary_unary(
+                '/bmi.BmiService/getGridNodeCount',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+                )
+        self.getGridEdgeCount = channel.unary_unary(
+                '/bmi.BmiService/getGridEdgeCount',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+                )
+        self.getGridFaceCount = channel.unary_unary(
+                '/bmi.BmiService/getGridFaceCount',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+                )
+        self.getGridEdgeNodes = channel.unary_unary(
+                '/bmi.BmiService/getGridEdgeNodes',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridEdgeNodesResponse.FromString,
+                )
+        self.getGridFaceNodes = channel.unary_unary(
+                '/bmi.BmiService/getGridFaceNodes',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridFaceNodesResponse.FromString,
+                )
+        self.getGridFaceEdges = channel.unary_unary(
+                '/bmi.BmiService/getGridFaceEdges',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridFaceEdgesResponse.FromString,
+                )
+        self.getGridNodesPerFace = channel.unary_unary(
+                '/bmi.BmiService/getGridNodesPerFace',
+                request_serializer=grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+                response_deserializer=grpc4bmi_dot_bmi__pb2.GetGridNodesPerFaceResponse.FromString,
+                )
 
 
 class BmiServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def initialize(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def update(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def updateUntil(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def finalize(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getComponentName(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getInputItemCount(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getOutputItemCount(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getInputVarNames(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getOutputVarNames(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getTimeUnits(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getTimeStep(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getCurrentTime(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getStartTime(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getEndTime(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getVarGrid(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getVarType(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getVarItemSize(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getVarUnits(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getVarNBytes(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getVarLocation(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getValue(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getValueAtIndices(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def setValue(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def setValueAtIndices(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridSize(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridType(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridRank(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridShape(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridSpacing(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridOrigin(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridX(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridY(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridZ(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridNodeCount(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridEdgeCount(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridFaceCount(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridEdgeNodes(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridFaceNodes(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridFaceEdges(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def getGridNodesPerFace(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    """Missing associated documentation comment in .proto file."""
+
+    def initialize(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def update(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def updateUntil(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def finalize(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getComponentName(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getInputItemCount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOutputItemCount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getInputVarNames(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getOutputVarNames(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTimeUnits(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getTimeStep(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getCurrentTime(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getStartTime(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getEndTime(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getVarGrid(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getVarType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getVarItemSize(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getVarUnits(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getVarNBytes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getVarLocation(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getValue(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getValueAtIndices(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setValue(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def setValueAtIndices(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridSize(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridType(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridRank(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridShape(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridSpacing(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridOrigin(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridX(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridY(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridZ(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridNodeCount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridEdgeCount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridFaceCount(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridEdgeNodes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridFaceNodes(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridFaceEdges(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def getGridNodesPerFace(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_BmiServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'initialize': grpc.unary_unary_rpc_method_handler(
-          servicer.initialize,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.InitializeRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-      ),
-      'update': grpc.unary_unary_rpc_method_handler(
-          servicer.update,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-      ),
-      'updateUntil': grpc.unary_unary_rpc_method_handler(
-          servicer.updateUntil,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-      ),
-      'finalize': grpc.unary_unary_rpc_method_handler(
-          servicer.finalize,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-      ),
-      'getComponentName': grpc.unary_unary_rpc_method_handler(
-          servicer.getComponentName,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetComponentNameResponse.SerializeToString,
-      ),
-      'getInputItemCount': grpc.unary_unary_rpc_method_handler(
-          servicer.getInputItemCount,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
-      ),
-      'getOutputItemCount': grpc.unary_unary_rpc_method_handler(
-          servicer.getOutputItemCount,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
-      ),
-      'getInputVarNames': grpc.unary_unary_rpc_method_handler(
-          servicer.getInputVarNames,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.SerializeToString,
-      ),
-      'getOutputVarNames': grpc.unary_unary_rpc_method_handler(
-          servicer.getOutputVarNames,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.SerializeToString,
-      ),
-      'getTimeUnits': grpc.unary_unary_rpc_method_handler(
-          servicer.getTimeUnits,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeUnitsResponse.SerializeToString,
-      ),
-      'getTimeStep': grpc.unary_unary_rpc_method_handler(
-          servicer.getTimeStep,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeStepResponse.SerializeToString,
-      ),
-      'getCurrentTime': grpc.unary_unary_rpc_method_handler(
-          servicer.getCurrentTime,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
-      ),
-      'getStartTime': grpc.unary_unary_rpc_method_handler(
-          servicer.getStartTime,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
-      ),
-      'getEndTime': grpc.unary_unary_rpc_method_handler(
-          servicer.getEndTime,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
-      ),
-      'getVarGrid': grpc.unary_unary_rpc_method_handler(
-          servicer.getVarGrid,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarGridResponse.SerializeToString,
-      ),
-      'getVarType': grpc.unary_unary_rpc_method_handler(
-          servicer.getVarType,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarTypeResponse.SerializeToString,
-      ),
-      'getVarItemSize': grpc.unary_unary_rpc_method_handler(
-          servicer.getVarItemSize,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarItemSizeResponse.SerializeToString,
-      ),
-      'getVarUnits': grpc.unary_unary_rpc_method_handler(
-          servicer.getVarUnits,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarUnitsResponse.SerializeToString,
-      ),
-      'getVarNBytes': grpc.unary_unary_rpc_method_handler(
-          servicer.getVarNBytes,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarNBytesResponse.SerializeToString,
-      ),
-      'getVarLocation': grpc.unary_unary_rpc_method_handler(
-          servicer.getVarLocation,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetVarLocationResponse.SerializeToString,
-      ),
-      'getValue': grpc.unary_unary_rpc_method_handler(
-          servicer.getValue,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetValueResponse.SerializeToString,
-      ),
-      'getValueAtIndices': grpc.unary_unary_rpc_method_handler(
-          servicer.getValueAtIndices,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesResponse.SerializeToString,
-      ),
-      'setValue': grpc.unary_unary_rpc_method_handler(
-          servicer.setValue,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.SetValueRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-      ),
-      'setValueAtIndices': grpc.unary_unary_rpc_method_handler(
-          servicer.setValueAtIndices,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.SetValueAtIndicesRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
-      ),
-      'getGridSize': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridSize,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridSizeResponse.SerializeToString,
-      ),
-      'getGridType': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridType,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridTypeResponse.SerializeToString,
-      ),
-      'getGridRank': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridRank,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridRankResponse.SerializeToString,
-      ),
-      'getGridShape': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridShape,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridShapeResponse.SerializeToString,
-      ),
-      'getGridSpacing': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridSpacing,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridSpacingResponse.SerializeToString,
-      ),
-      'getGridOrigin': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridOrigin,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridOriginResponse.SerializeToString,
-      ),
-      'getGridX': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridX,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.SerializeToString,
-      ),
-      'getGridY': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridY,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.SerializeToString,
-      ),
-      'getGridZ': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridZ,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.SerializeToString,
-      ),
-      'getGridNodeCount': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridNodeCount,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
-      ),
-      'getGridEdgeCount': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridEdgeCount,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
-      ),
-      'getGridFaceCount': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridFaceCount,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
-      ),
-      'getGridEdgeNodes': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridEdgeNodes,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridEdgeNodesResponse.SerializeToString,
-      ),
-      'getGridFaceNodes': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridFaceNodes,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridFaceNodesResponse.SerializeToString,
-      ),
-      'getGridFaceEdges': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridFaceEdges,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridFaceEdgesResponse.SerializeToString,
-      ),
-      'getGridNodesPerFace': grpc.unary_unary_rpc_method_handler(
-          servicer.getGridNodesPerFace,
-          request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
-          response_serializer=grpc4bmi_dot_bmi__pb2.GetGridNodesPerFaceResponse.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'bmi.BmiService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'initialize': grpc.unary_unary_rpc_method_handler(
+                    servicer.initialize,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.InitializeRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            ),
+            'update': grpc.unary_unary_rpc_method_handler(
+                    servicer.update,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            ),
+            'updateUntil': grpc.unary_unary_rpc_method_handler(
+                    servicer.updateUntil,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            ),
+            'finalize': grpc.unary_unary_rpc_method_handler(
+                    servicer.finalize,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            ),
+            'getComponentName': grpc.unary_unary_rpc_method_handler(
+                    servicer.getComponentName,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetComponentNameResponse.SerializeToString,
+            ),
+            'getInputItemCount': grpc.unary_unary_rpc_method_handler(
+                    servicer.getInputItemCount,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
+            ),
+            'getOutputItemCount': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOutputItemCount,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
+            ),
+            'getInputVarNames': grpc.unary_unary_rpc_method_handler(
+                    servicer.getInputVarNames,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.SerializeToString,
+            ),
+            'getOutputVarNames': grpc.unary_unary_rpc_method_handler(
+                    servicer.getOutputVarNames,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.SerializeToString,
+            ),
+            'getTimeUnits': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTimeUnits,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeUnitsResponse.SerializeToString,
+            ),
+            'getTimeStep': grpc.unary_unary_rpc_method_handler(
+                    servicer.getTimeStep,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeStepResponse.SerializeToString,
+            ),
+            'getCurrentTime': grpc.unary_unary_rpc_method_handler(
+                    servicer.getCurrentTime,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
+            ),
+            'getStartTime': grpc.unary_unary_rpc_method_handler(
+                    servicer.getStartTime,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
+            ),
+            'getEndTime': grpc.unary_unary_rpc_method_handler(
+                    servicer.getEndTime,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.Empty.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
+            ),
+            'getVarGrid': grpc.unary_unary_rpc_method_handler(
+                    servicer.getVarGrid,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarGridResponse.SerializeToString,
+            ),
+            'getVarType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getVarType,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarTypeResponse.SerializeToString,
+            ),
+            'getVarItemSize': grpc.unary_unary_rpc_method_handler(
+                    servicer.getVarItemSize,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarItemSizeResponse.SerializeToString,
+            ),
+            'getVarUnits': grpc.unary_unary_rpc_method_handler(
+                    servicer.getVarUnits,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarUnitsResponse.SerializeToString,
+            ),
+            'getVarNBytes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getVarNBytes,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarNBytesResponse.SerializeToString,
+            ),
+            'getVarLocation': grpc.unary_unary_rpc_method_handler(
+                    servicer.getVarLocation,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetVarLocationResponse.SerializeToString,
+            ),
+            'getValue': grpc.unary_unary_rpc_method_handler(
+                    servicer.getValue,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetVarRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetValueResponse.SerializeToString,
+            ),
+            'getValueAtIndices': grpc.unary_unary_rpc_method_handler(
+                    servicer.getValueAtIndices,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetValueAtIndicesResponse.SerializeToString,
+            ),
+            'setValue': grpc.unary_unary_rpc_method_handler(
+                    servicer.setValue,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.SetValueRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            ),
+            'setValueAtIndices': grpc.unary_unary_rpc_method_handler(
+                    servicer.setValueAtIndices,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.SetValueAtIndicesRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            ),
+            'getGridSize': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridSize,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridSizeResponse.SerializeToString,
+            ),
+            'getGridType': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridType,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridTypeResponse.SerializeToString,
+            ),
+            'getGridRank': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridRank,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridRankResponse.SerializeToString,
+            ),
+            'getGridShape': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridShape,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridShapeResponse.SerializeToString,
+            ),
+            'getGridSpacing': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridSpacing,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridSpacingResponse.SerializeToString,
+            ),
+            'getGridOrigin': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridOrigin,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridOriginResponse.SerializeToString,
+            ),
+            'getGridX': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridX,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.SerializeToString,
+            ),
+            'getGridY': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridY,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.SerializeToString,
+            ),
+            'getGridZ': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridZ,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.SerializeToString,
+            ),
+            'getGridNodeCount': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridNodeCount,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
+            ),
+            'getGridEdgeCount': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridEdgeCount,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
+            ),
+            'getGridFaceCount': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridFaceCount,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetCountResponse.SerializeToString,
+            ),
+            'getGridEdgeNodes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridEdgeNodes,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridEdgeNodesResponse.SerializeToString,
+            ),
+            'getGridFaceNodes': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridFaceNodes,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridFaceNodesResponse.SerializeToString,
+            ),
+            'getGridFaceEdges': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridFaceEdges,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridFaceEdgesResponse.SerializeToString,
+            ),
+            'getGridNodesPerFace': grpc.unary_unary_rpc_method_handler(
+                    servicer.getGridNodesPerFace,
+                    request_deserializer=grpc4bmi_dot_bmi__pb2.GridRequest.FromString,
+                    response_serializer=grpc4bmi_dot_bmi__pb2.GetGridNodesPerFaceResponse.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'bmi.BmiService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class BmiService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def initialize(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/initialize',
+            grpc4bmi_dot_bmi__pb2.InitializeRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def update(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/update',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def updateUntil(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/updateUntil',
+            grpc4bmi_dot_bmi__pb2.GetTimeResponse.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def finalize(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/finalize',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getComponentName(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getComponentName',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetComponentNameResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getInputItemCount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getInputItemCount',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOutputItemCount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getOutputItemCount',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getInputVarNames(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getInputVarNames',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getOutputVarNames(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getOutputVarNames',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarNamesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTimeUnits(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getTimeUnits',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetTimeUnitsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getTimeStep(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getTimeStep',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetTimeStepResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getCurrentTime(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getCurrentTime',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getStartTime(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getStartTime',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getEndTime(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getEndTime',
+            grpc4bmi_dot_bmi__pb2.Empty.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetTimeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getVarGrid(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getVarGrid',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarGridResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getVarType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getVarType',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarTypeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getVarItemSize(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getVarItemSize',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarItemSizeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getVarUnits(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getVarUnits',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarUnitsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getVarNBytes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getVarNBytes',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarNBytesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getVarLocation(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getVarLocation',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetVarLocationResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getValue(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getValue',
+            grpc4bmi_dot_bmi__pb2.GetVarRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetValueResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getValueAtIndices(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getValueAtIndices',
+            grpc4bmi_dot_bmi__pb2.GetValueAtIndicesRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetValueAtIndicesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setValue(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/setValue',
+            grpc4bmi_dot_bmi__pb2.SetValueRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def setValueAtIndices(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/setValueAtIndices',
+            grpc4bmi_dot_bmi__pb2.SetValueAtIndicesRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridSize(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridSize',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridSizeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridType(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridType',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridTypeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridRank(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridRank',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridRankResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridShape(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridShape',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridShapeResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridSpacing(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridSpacing',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridSpacingResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridOrigin(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridOrigin',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridOriginResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridX(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridX',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridY(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridY',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridZ(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridZ',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridPointsResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridNodeCount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridNodeCount',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridEdgeCount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridEdgeCount',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridFaceCount(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridFaceCount',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetCountResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridEdgeNodes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridEdgeNodes',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridEdgeNodesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridFaceNodes(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridFaceNodes',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridFaceNodesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridFaceEdges(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridFaceEdges',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridFaceEdgesResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def getGridNodesPerFace(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/bmi.BmiService/getGridNodesPerFace',
+            grpc4bmi_dot_bmi__pb2.GridRequest.SerializeToString,
+            grpc4bmi_dot_bmi__pb2.GetGridNodesPerFaceResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/pyproject.toml b/pyproject.toml
index 152f3c2..de9cf52 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -28,8 +28,7 @@ dependencies = [
     "grpcio-reflection",
     "grpcio-status",
     "googleapis-common-protos>=1.5.5",
-    # Pin protobuf, see https://github.com/eWaterCycle/grpc4bmi/issues/115
-    "protobuf>=3.18.3,<=3.20.3",
+    "protobuf>=4,<5",
     "numpy",
     "docker",
     "bmipy",


Test patch:
diff --git a/test/fake_models.py b/test/fake_models.py
index 1bd4296..e5ac6cb 100644
--- a/test/fake_models.py
+++ b/test/fake_models.py
@@ -412,3 +412,11 @@ def __init__(self):
         # Create value which is bigger than 4Mb
         dimension = (3 * GRPC_MAX_MESSAGE_LENGTH) // self.dtype.itemsize + 1000
         self.value = numpy.ones((dimension,), dtype=self.dtype)
+
+class WithItemSizeZeroAndVarTypeFloat32Model(Float32Model):
+    def get_var_itemsize(self, name):
+        return 0
+
+class WithItemSizeZeroAndUnknownVarType(WithItemSizeZeroAndVarTypeFloat32Model):
+    def get_var_type(self, name):
+        return 'real'
\ No newline at end of file
diff --git a/test/heat-images/README.md b/test/heat-images/README.md
new file mode 100644
index 0000000..b2d97b5
--- /dev/null
+++ b/test/heat-images/README.md
@@ -0,0 +1,34 @@
+# Heat container images
+
+Heat is a simple model that solves the diffusion equation on a uniform rectangular plate with Dirichlet boundary conditions.
+
+Heat is implemented in [different languages](https://github.com/csdms?q=bmi-example&type=all&language=&sort=).
+
+This directory has the heat model wrapped up in a Docker container image with different combinations of
+
+- language
+- bmi version
+- grpc4bmi version
+- Python Protobuf version
+
+| Directory           | Language | BMI version | grpc4bmi version     | Python protobuf version |
+| ------------------- | -------- | ----------- | -------------------- | ----------------------- |
+| c-bmi20             | C        | 2.0         | 0.3.x                |                         |
+| cxx-bmi20           | C++      | 2.0         | 0.3.x                |                         |
+| python-bmi02        | Python   | 0.2         | 0.2.x                | 3                       |
+| python-bmi02-legacy | Python   | 0.2         | 0.3.x in legacy mode | 3                       |
+| python-bmi20        | Python   | 2.0         | 0.3.x                | 3                       |
+| python-bmi20-pb4    | Python   | 2.0         | 0.3.x                | 4                       |
+
+The images can be build with
+
+```shell
+docker compose build
+```
+
+The images can be tested using [heat_tester.py](heat_tester.py).
+
+To test Python Protobuf version client/server communication, the heat_tester.py (aka client) should be run with grpc4bmi installed from branch:
+
+1. latest-protobuf, uses Python protobuf v4
+2. bmi2, uses Python protobuf v3
diff --git a/test/heat-images/c-bmi20/CMakeLists.txt b/test/heat-images/c-bmi20/CMakeLists.txt
new file mode 100644
index 0000000..d9bb030
--- /dev/null
+++ b/test/heat-images/c-bmi20/CMakeLists.txt
@@ -0,0 +1,20 @@
+cmake_minimum_required(VERSION 3.0)
+project(run_bmi_server C CXX)
+
+set(_cflags "-ansi -Wall -Wundef -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -O2")
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(BMIC REQUIRED IMPORTED_TARGET bmic)
+message("--   bmic include - ${BMIC_INCLUDE_DIRS}")
+include_directories(${BMIC_INCLUDE_DIRS})
+pkg_check_modules(GRPC4BMI REQUIRED grpc4bmi heatc)
+
+add_executable(run_bmi_server run_bmi_server.cc)
+
+target_include_directories(run_bmi_server PRIVATE)
+
+target_link_libraries(run_bmi_server
+                      ${GRPC4BMI_LINK_LIBRARIES}
+                      )
+
+install(TARGETS run_bmi_server
+        RUNTIME DESTINATION bin)
diff --git a/test/heat-images/c-bmi20/Dockerfile b/test/heat-images/c-bmi20/Dockerfile
new file mode 100644
index 0000000..2f7cc87
--- /dev/null
+++ b/test/heat-images/c-bmi20/Dockerfile
@@ -0,0 +1,78 @@
+# Build with
+#
+#  docker build -t heat:c-bmi20 -f test/heat-images/c-bmi20/Dockerfile .
+#
+# Run with
+#
+# ipython
+# from grpc4bmi.bmi_client_docker import BmiClientDocker
+# model = BmiClientDocker('heat:c-bmi20', work_dir='/tmp', delay=1)
+# model.get_component_name()
+# model.get_output_var_names()
+# from pathlib import Path
+# config = Path('/tmp/heat.config.txt')
+# config.write_text('1.5, 8.0, 7, 6')
+# model.initialize(str(config))
+# model.update()
+# import numpy as np
+# model.get_value('plate_surface__temperature', np.zeros(42))
+#
+FROM debian:buster AS builder
+
+# Install build deps
+RUN apt-get update && apt-get install -qy git build-essential cmake autoconf libtool pkg-config libssl-dev
+
+# Compile gRPC
+WORKDIR /opt/grpc
+ARG GRPC_VERSION=v1.51.1
+RUN echo ${GRPC_VERSION}
+RUN git clone -b ${GRPC_VERSION} --depth 1 https://github.com/grpc/grpc . && git submodule update --init
+WORKDIR /opt/grpc/cmake/build
+RUN cmake -DgRPC_INSTALL=ON  -DgRPC_SSL_PROVIDER=package -DgRPC_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON ../.. \
+    && make -j6 && make install && ldconfig
+
+# Install bmi-cxx
+ARG BMICXX_VERSION=v2.0
+RUN git clone -b ${BMICXX_VERSION} https://github.com/csdms/bmi-cxx.git /opt/bmi-cxx
+WORKDIR /opt/bmi-cxx/build
+RUN cmake .. && make install
+
+# Install bmi-c
+ARG BMIC_VERSION=v2.1
+RUN git clone -b ${BMIC_VERSION} https://github.com/csdms/bmi-c.git /opt/bmi-c
+WORKDIR /opt/bmi-c/build
+RUN cmake .. && make install
+
+# Install heat-c
+ARG HEAT_VERSION=v2.0.1
+RUN git clone -b ${HEAT_VERSION} https://github.com/csdms/bmi-example-c /opt/bmi-example-c
+WORKDIR /opt/bmi-example-c/build
+RUN cmake .. && make install && ldconfig
+
+# Install grpc4bmi, use branch
+ARG GRPC4BMI_VERSION=latest-protobuf
+RUN git clone --depth 1 -b ${GRPC4BMI_VERSION} https://github.com/eWaterCycle/grpc4bmi /opt/grpc4bmi
+WORKDIR /opt/grpc4bmi/cpp/build
+RUN cmake .. && make install
+
+# Compile main
+WORKDIR /opt/grpc4bmiheatc/build
+COPY test/heat-images/c-bmi20/run_bmi_server.cc /opt/grpc4bmiheatc
+COPY test/heat-images/c-bmi20/CMakeLists.txt /opt/grpc4bmiheatc
+RUN cmake .. && make install
+
+# run container
+FROM debian:buster
+
+# Install runtime deps
+RUN apt-get update && apt-get install -qy libssl1.1 && rm -rf /var/lib/apt/lists/*
+
+# Copy compiled and deps
+COPY --from=builder /usr/local/bin/run_bmi_server /usr/local/bin/run_bmi_server
+COPY --from=builder /usr/local/lib/ /usr/local/lib/
+
+RUN ldconfig
+
+ENV BMI_PORT=50051
+
+ENTRYPOINT ["/usr/local/bin/run_bmi_server"]
diff --git a/test/heat-images/c-bmi20/run_bmi_server.cc b/test/heat-images/c-bmi20/run_bmi_server.cc
new file mode 100644
index 0000000..03d12c6
--- /dev/null
+++ b/test/heat-images/c-bmi20/run_bmi_server.cc
@@ -0,0 +1,11 @@
+#include "bmi_grpc_server.h"
+#include <bmi.h>
+#include "bmi_heat.h"
+
+int main(int argc, char* argv[])
+{
+    Bmi *model = (Bmi *) malloc(sizeof(Bmi));
+    register_bmi_heat(model);
+    run_bmi_server(model, argc, argv);
+    return 0;
+}
\ No newline at end of file
diff --git a/test/heat-images/cxx-bmi20/CMakeLists.txt b/test/heat-images/cxx-bmi20/CMakeLists.txt
new file mode 100644
index 0000000..e42f697
--- /dev/null
+++ b/test/heat-images/cxx-bmi20/CMakeLists.txt
@@ -0,0 +1,19 @@
+cmake_minimum_required(VERSION 3.0)
+project(run_bmi_server CXX)
+
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(BMICXX REQUIRED IMPORTED_TARGET bmicxx)
+message("--   bmicxx include - ${BMICXX_INCLUDE_DIRS}")
+include_directories(${BMICXX_INCLUDE_DIRS})
+pkg_check_modules(GRPC4BMI REQUIRED grpc4bmi heatcxx)
+
+add_executable(run_bmi_server run_bmi_server.cc)
+
+target_include_directories(run_bmi_server PRIVATE)
+
+target_link_libraries(run_bmi_server
+                      ${GRPC4BMI_LINK_LIBRARIES}
+                      )
+
+install(TARGETS run_bmi_server
+        RUNTIME DESTINATION bin)
diff --git a/test/heat-images/cxx-bmi20/Dockerfile b/test/heat-images/cxx-bmi20/Dockerfile
new file mode 100644
index 0000000..f9cb15e
--- /dev/null
+++ b/test/heat-images/cxx-bmi20/Dockerfile
@@ -0,0 +1,78 @@
+# Build with
+#
+#  docker build -t heat:cxx-bmi20 -f test/heat-images/cxx-bmi20/Dockerfile .
+#
+# Run with
+#
+# ipython
+# from grpc4bmi.bmi_client_docker import BmiClientDocker
+# model = BmiClientDocker('heat:cxx-bmi20', work_dir='/tmp', delay=1)
+# model.get_component_name()
+# model.get_output_var_names()
+# from pathlib import Path
+# config = Path('/tmp/heat.config.txt')
+# config.write_text('1.5, 8.0, 7, 6')
+# model.initialize(str(config))
+# model.update()
+# import numpy as np
+# model.get_value('plate_surface__temperature', np.zeros(42))
+#
+FROM debian:buster AS builder
+
+# Install build deps
+RUN apt-get update && apt-get install -qy git build-essential cmake autoconf libtool pkg-config libssl-dev
+
+# Compile gRPC
+WORKDIR /opt/grpc
+ARG GRPC_VERSION=v1.51.1
+RUN echo ${GRPC_VERSION}
+RUN git clone -b ${GRPC_VERSION} --depth 1 https://github.com/grpc/grpc . && git submodule update --init
+WORKDIR /opt/grpc/cmake/build
+RUN cmake -DgRPC_INSTALL=ON  -DgRPC_SSL_PROVIDER=package -DgRPC_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON ../.. \
+    && make -j6 && make install && ldconfig
+
+# Install bmi-cxx
+ARG BMICXX_VERSION=v2.0
+RUN git clone -b ${BMICXX_VERSION} https://github.com/csdms/bmi-cxx.git /opt/bmi-cxx
+WORKDIR /opt/bmi-cxx/build
+RUN cmake .. && make install
+
+# Install bmi-c
+ARG BMIC_VERSION=v2.1
+RUN git clone -b ${BMIC_VERSION} https://github.com/csdms/bmi-c.git /opt/bmi-c
+WORKDIR /opt/bmi-c/build
+RUN cmake .. && make install
+
+# Install heat-cxx
+ARG HEAT_VERSION=v2.1
+RUN git clone -b ${HEAT_VERSION} https://github.com/csdms/bmi-example-cxx /opt/bmi-example-cxx
+WORKDIR /opt/bmi-example-cxx/build
+RUN cmake .. && make install && ldconfig
+
+# Install grpc4bmi, use branch
+ARG GRPC4BMI_VERSION=latest-protobuf
+RUN git clone -b ${GRPC4BMI_VERSION} https://github.com/eWaterCycle/grpc4bmi /opt/grpc4bmi
+WORKDIR /opt/grpc4bmi/cpp/build
+RUN cmake .. && make install
+
+# Compile main
+WORKDIR /opt/grpc4bmiheatcxx/build
+COPY test/heat-images/cxx-bmi20/run_bmi_server.cc /opt/grpc4bmiheatcxx
+COPY test/heat-images/cxx-bmi20/CMakeLists.txt /opt/grpc4bmiheatcxx
+RUN cmake .. && make install
+
+# run container
+FROM debian:buster
+
+# Install runtime deps
+RUN apt-get update && apt-get install -qy libssl1.1 && rm -rf /var/lib/apt/lists/*
+
+# Copy compiled and deps
+COPY --from=builder /usr/local/bin/run_bmi_server /usr/local/bin/run_bmi_server
+COPY --from=builder /usr/local/lib/ /usr/local/lib/
+
+RUN ldconfig
+
+ENV BMI_PORT=50051
+
+ENTRYPOINT ["/usr/local/bin/run_bmi_server"]
diff --git a/test/heat-images/cxx-bmi20/run_bmi_server.cc b/test/heat-images/cxx-bmi20/run_bmi_server.cc
new file mode 100644
index 0000000..03a2bd9
--- /dev/null
+++ b/test/heat-images/cxx-bmi20/run_bmi_server.cc
@@ -0,0 +1,10 @@
+#include "bmi_grpc_server.h"
+#include <bmi.hxx>
+#include "bmi_heat.hxx"
+
+int main(int argc, char* argv[])
+{
+    bmi::Bmi* model = new BmiHeat();
+    run_bmi_server(model, argc, argv);
+    return 0;
+}
\ No newline at end of file
diff --git a/test/heat-images/docker-compose.yaml b/test/heat-images/docker-compose.yaml
new file mode 100644
index 0000000..942c149
--- /dev/null
+++ b/test/heat-images/docker-compose.yaml
@@ -0,0 +1,32 @@
+version: "3.9"
+services:
+  c-bmi20:
+    image: heat:c-bmi20
+    build: 
+      context: ../..
+      dockerfile: test/heat-images/c-bmi20/Dockerfile
+  cxx-bmi20:
+    image: heat:cxx-bmi20
+    build: 
+      context: ../..
+      dockerfile: test/heat-images/cxx-bmi20/Dockerfile
+  python-bmi02:
+    image: heat:py-bmi02
+    build: 
+      context: ../..
+      dockerfile: test/heat-images/python-bmi02/Dockerfile
+  python-bmi02-legacy:
+    image: heat:py-0.2-legacy
+    build: 
+      context: ../..
+      dockerfile: test/heat-images/python-bmi02-legacy/Dockerfile
+  python-bmi20:
+    image: heat:py-2.0
+    build: 
+      context: ../..
+      dockerfile: test/heat-images/python-bmi20/Dockerfile
+  python-bmi20-pb4:
+    image: heat:py-2.0-pb4
+    build: 
+      context: ../..
+      dockerfile: test/heat-images/python-bmi20-pb4/Dockerfile
diff --git a/test/heat-images/heat_tester.py b/test/heat-images/heat_tester.py
new file mode 100644
index 0000000..e04e5f5
--- /dev/null
+++ b/test/heat-images/heat_tester.py
@@ -0,0 +1,60 @@
+from pathlib import Path
+from textwrap import dedent
+
+from grpc4bmi.bmi_client_docker import BmiClientDocker
+from grpc4bmi.bmi_optionaldest import OptionalDestBmi
+
+def test_heat(tmp_path: Path):
+    # Config file for Python based heat model
+    py_config = dedent("""\
+        shape:
+        - 6
+        - 8
+        spacing:
+        - 1.0
+        - 1.0
+        origin:
+        - 0.0
+        - 0.0
+        alpha: 1.0
+    """)
+    # Config file for C/C++ based heat model
+    c_config = '1.5, 8.0, 7, 6'
+
+
+    image, config_body = (
+        # Comment out line you want to run
+    'heat:py-0.2',py_config,
+    # 'heat:py-bmi02', py_config,
+    # 'heat:py-0.2-legacy',py_config
+    # 'heat:py-2.0',py_config
+    # 'heat:py-2.0-pb4',py_config
+    # 'heat:cxx-bmi20', c_config
+    # 'heat:c-bmi20', c_config
+    )
+
+    config = tmp_path / 'config.yaml'
+    config.write_text(config_body)
+
+    print(image)
+    dmodel = BmiClientDocker(image, work_dir=str(tmp_path), delay=1)
+    model = OptionalDestBmi(dmodel)
+
+    model.initialize(str(config))
+
+    print(model.get_component_name())
+    print(model.get_output_var_names())
+
+    model.update()
+
+    var_name = 'plate_surface__temperature'
+    grid_id = model.get_var_grid(var_name)
+    print(model.get_grid_shape(grid_id))
+
+    values = model.get_value(var_name)
+    print(values)
+
+    model.finalize()
+    # assert 1==0
+
+test_heat(tmp_path=Path('/tmp'))
diff --git a/test/heat-images/python-bmi02-legacy/Dockerfile b/test/heat-images/python-bmi02-legacy/Dockerfile
new file mode 100644
index 0000000..7cb9819
--- /dev/null
+++ b/test/heat-images/python-bmi02-legacy/Dockerfile
@@ -0,0 +1,22 @@
+# Python heat model with BMI v0.2, grpc4bmi==bmi2 and pb3
+#
+# Build with
+#
+#   docker build -t heat:py-0.2-legacy test/heat-images/python-bmi02-legacy
+#
+#
+# Run with
+#
+#   from grpc4bmi.bmi_client_docker import BmiClientDocker
+#   model = BmiClientDocker('heat:py-0.2-legacy', work_dir='/tmp', delay=1)
+#
+
+FROM python:3.10-buster
+
+RUN pip install numpy 'scipy==1.8.1' 'PyYAML<6'
+
+RUN pip install https://github.com/csdms/bmi-example-python/archive/refs/tags/v0.1.zip
+
+RUN pip install https://github.com/eWaterCycle/grpc4bmi/archive/refs/heads/bmi2.zip
+
+ENTRYPOINT ["run-bmi-server","--bmi-version", "0.2", "--name", "heat.BmiHeat", "--port", "50051"]
diff --git a/test/heat-images/python-bmi02/Dockerfile b/test/heat-images/python-bmi02/Dockerfile
new file mode 100644
index 0000000..7eeaa7a
--- /dev/null
+++ b/test/heat-images/python-bmi02/Dockerfile
@@ -0,0 +1,29 @@
+# Python heat model with BMI v0.2, grpc4bmi==0.2 and pb3
+#
+# Build with
+#
+#   docker build -t heat:py-0.2 test/heat-images/python-bmi02
+#
+#
+# Run with
+
+#   from grpc4bmi.bmi_client_docker import BmiClientDocker
+#   model = BmiClientDocker('heat:py-0.2', work_dir='/tmp', delay=1)
+#
+
+# docker run -ti --entrypoint pip heat:py-0.2 list |grep grpc
+# grpc4bmi                 0.2.16
+# grpcio                   1.51.1
+# grpcio-reflection        1.48.2
+# docker run -ti --entrypoint pip heat:py-0.2 list |grep proto
+# protobuf                 3.20.3
+
+FROM python:3.10-buster
+
+RUN pip install numpy 'scipy==1.8.1' 'PyYAML<6'
+
+RUN pip install https://github.com/csdms/bmi-example-python/archive/refs/tags/v0.1.zip
+
+RUN pip install grpc4bmi==0.2.16
+
+ENTRYPOINT ["run-bmi-server", "--name", "heat.BmiHeat", "--port", "50051"]
diff --git a/test/heat-images/python-bmi20-pb4/Dockerfile b/test/heat-images/python-bmi20-pb4/Dockerfile
new file mode 100644
index 0000000..1ae93de
--- /dev/null
+++ b/test/heat-images/python-bmi20-pb4/Dockerfile
@@ -0,0 +1,28 @@
+# Python heat model with BMI v2.0
+#
+# Build with
+#
+#   docker build -t heat:py-2.0-pb4 test/heat-images/python-bmi20-pb4
+#
+#
+# Run with
+
+#   from grpc4bmi.bmi_client_docker import BmiClientDocker
+#   model = BmiClientDocker('heat:py-2.0-pb4', work_dir='/tmp', delay=1)
+#
+# docker run -ti --entrypoint pip heat:py-2.0 list |grep grpc
+# grpc4bmi                 0.3.2
+# grpcio                   1.51.1
+# grpcio-reflection        1.48.2
+# grpcio-status            1.48.2
+# docker run -ti --entrypoint pip heat:py-2.0 list |grep proto
+# googleapis-common-protos 1.58.0
+# protobuf                 3.20.3
+
+FROM python:3.10-buster
+
+RUN pip install https://github.com/csdms/bmi-example-python/archive/44c7d4c54f7fa4c17f51f86a645ba3e2633a4dfb.zip
+
+RUN pip install https://github.com/eWaterCycle/grpc4bmi/archive/refs/heads/latest-protobuf.zip
+
+ENTRYPOINT ["run-bmi-server", "--name", "heat.BmiHeat", "--port", "50051"]
diff --git a/test/heat-images/python-bmi20/Dockerfile b/test/heat-images/python-bmi20/Dockerfile
new file mode 100644
index 0000000..ee81826
--- /dev/null
+++ b/test/heat-images/python-bmi20/Dockerfile
@@ -0,0 +1,28 @@
+# Python heat model with BMI v2.0 and pb3
+#
+# Build with
+#
+#   docker build -t heat:py-2.0 test/heat-images/python-bmi20
+#
+#
+# Run with
+
+#   from grpc4bmi.bmi_client_docker import BmiClientDocker
+#   model = BmiClientDocker('heat:py-2.0', work_dir='/tmp', delay=1)
+#
+# docker run -ti --entrypoint pip heat:py-2.0 list |grep grpc
+# grpc4bmi                 0.3.2
+# grpcio                   1.51.1
+# grpcio-reflection        1.48.2
+# grpcio-status            1.48.2
+# docker run -ti --entrypoint pip heat:py-2.0 list |grep proto
+# googleapis-common-protos 1.58.0
+# protobuf                 3.20.3
+
+FROM python:3.10-buster
+
+RUN pip install https://github.com/csdms/bmi-example-python/archive/44c7d4c54f7fa4c17f51f86a645ba3e2633a4dfb.zip
+
+RUN pip install https://github.com/eWaterCycle/grpc4bmi/archive/refs/heads/bmi2.zip
+
+ENTRYPOINT ["run-bmi-server", "--name", "heat.BmiHeat", "--port", "50051"]
diff --git a/test/test_apptainer.py b/test/test_apptainer.py
index 8dd570b..cd5ea5e 100644
--- a/test/test_apptainer.py
+++ b/test/test_apptainer.py
@@ -1,7 +1,8 @@
 import os
-from typing import Type, Union
+from typing import Type
 
 import pytest
+from typeguard import TypeCheckError
 
 from grpc4bmi.bmi_client_apptainer import SUPPORTED_APPTAINER_VERSIONS, BmiClientApptainer, check_apptainer_version_string
 from grpc4bmi.exceptions import ApptainerVersionException, DeadContainerException
@@ -64,17 +65,17 @@ def test_same_inputdir_and_workdir(self, tmp_path):
             BmiClientApptainer(image=IMAGE_NAME, input_dirs=(some_dir,), work_dir=some_dir)
 
     def test_workdir_as_number(self):
-        with pytest.raises(TypeError, match='must be str'):
+        with pytest.raises(TypeCheckError, match='is not an instance of str'):
             BmiClientApptainer(image=IMAGE_NAME, work_dir=42)
 
     def test_inputdirs_as_str(self, tmp_path):
         some_dir = str(tmp_path)
-        with pytest.raises(TypeError, match='must be collections.abc.Iterable; got str instead'):
+        with pytest.raises(TypeError, match=' must be collections.abc.Iterable'):
             BmiClientApptainer(image=IMAGE_NAME, input_dirs='old type', work_dir=some_dir)
 
     def test_inputdirs_as_number(self, tmp_path):
         some_dir = str(tmp_path)
-        with pytest.raises(TypeError, match='must be collections.abc.Iterable; got int instead'):
+        with pytest.raises(TypeCheckError, match='is not an instance of collections.abc.Iterable'):
             BmiClientApptainer(image=IMAGE_NAME, input_dirs=42, work_dir=some_dir)
 
 
diff --git a/test/test_client.py b/test/test_client.py
index c71bfe0..cf00c3b 100644
--- a/test/test_client.py
+++ b/test/test_client.py
@@ -9,13 +9,14 @@
 from google.rpc import error_details_pb2, status_pb2, code_pb2
 from grpc_status import rpc_status
 from heat import BmiHeat
+from typeguard import TypeCheckError
 
 from grpc4bmi.bmi_grpc_server import BmiServer
 from grpc4bmi.bmi_grpc_client import BmiClient, RemoteException, handle_error
 from grpc4bmi.reserve import reserve_values, reserve_grid_shape, reserve_grid_padding
 from test.fake_models import SomeException, FailingModel, Rect3DGridModel, UnstructuredGridBmiModel, UniRectGridModel, \
     Rect2DGridModel, Structured3DQuadrilateralsGridModel, Structured2DQuadrilateralsGridModel, Float32Model, Int32Model, \
-    BooleanModel
+    BooleanModel, WithItemSizeZeroAndUnknownVarType, WithItemSizeZeroAndVarTypeFloat32Model
 
 logging.basicConfig(level=logging.DEBUG)
 
@@ -108,7 +109,7 @@ def test_initialize():
 def test_initialize_with_nonstring():
     client, local = make_bmi_classes(False)
     assert client is not None
-    with pytest.raises(TypeError, match='got int instead'):
+    with pytest.raises(TypeCheckError, match='did not match any element in the union'):
         client.initialize(42)
     client.finalize()
     del client
@@ -831,3 +832,43 @@ def test_same_port_twice(self):
         with BmiClient.create_grpc_channel(port) as channel1, BmiClient.create_grpc_channel(port) as channel2:
             assert channel1._channel.target() == b'localhost:51235'
             assert channel2._channel.target() == b'localhost:51235'
+
+class TestModelWithItemSizeZeroAndVarTypeFloat32:
+    name = 'plate_surface__temperature'
+
+    @pytest.fixture
+    def bmimodel(self):
+        model = WithItemSizeZeroAndVarTypeFloat32Model()
+        yield model
+        del model
+
+    @pytest.fixture
+    def bmiclient(self, bmimodel):
+        client = BmiClient(stub=ServerWrapper(BmiServer(bmimodel)))
+        yield client
+        del client
+
+    def test_get_var_itemsize(self, bmiclient):
+        result = bmiclient.get_var_itemsize(self.name)
+
+        expected = 4
+        assert result == expected
+
+class TestModelWithItemSizeZeroAndUnknownVarType:
+    name = 'plate_surface__temperature'
+
+    @pytest.fixture
+    def bmimodel(self):
+        model = WithItemSizeZeroAndUnknownVarType()
+        yield model
+        del model
+
+    @pytest.fixture
+    def bmiclient(self, bmimodel):
+        client = BmiClient(stub=ServerWrapper(BmiServer(bmimodel)))
+        yield client
+        del client
+
+    def test_get_var_itemsize(self, bmiclient):
+        with pytest.raises(ValueError, match='get_var_itemsize returned 0, which is impossible'):
+            bmiclient.get_var_itemsize(self.name)
diff --git a/test/test_docker.py b/test/test_docker.py
index 7b8fc65..812ec21 100644
--- a/test/test_docker.py
+++ b/test/test_docker.py
@@ -3,6 +3,7 @@
 import docker
 import numpy as np
 import pytest
+from typeguard import TypeCheckError
 
 from grpc4bmi.bmi_client_docker import BmiClientDocker
 from grpc4bmi.exceptions import DeadContainerException
@@ -102,17 +103,17 @@ def test_same_inputdir_and_workdir(self, tmp_path):
             BmiClientDocker(image=walrus_docker_image, image_port=55555, input_dirs=(some_dir,), work_dir=some_dir)
 
     def test_workdir_as_number(self):
-        with pytest.raises(TypeError, match='must be str'):
+        with pytest.raises(TypeCheckError, match='is not an instance of str'):
             BmiClientDocker(image=walrus_docker_image, work_dir=42)
 
     def test_inputdirs_as_str(self, tmp_path):
         some_dir = str(tmp_path)
-        with pytest.raises(TypeError, match='must be collections.abc.Iterable; got str instead'):
+        with pytest.raises(TypeError, match='must be collections.abc.Iterable'):
             BmiClientDocker(image=walrus_docker_image, input_dirs='old type', work_dir=some_dir)
 
     def test_inputdirs_as_number(self, tmp_path):
         some_dir = str(tmp_path)
-        with pytest.raises(TypeError, match='must be collections.abc.Iterable; got int instead'):
+        with pytest.raises(TypeCheckError, match='is not an instance of collections.abc.Iterable'):
             BmiClientDocker(image=walrus_docker_image, input_dirs=42, work_dir=some_dir)
 
     def test_logs(self, walrus_model, capfd):
diff --git a/test/test_singularity.py b/test/test_singularity.py
index 41e4265..1f9d8b1 100644
--- a/test/test_singularity.py
+++ b/test/test_singularity.py
@@ -10,6 +10,7 @@
 from nbconvert.preprocessors import ExecutePreprocessor
 from nbformat.v4 import new_notebook, new_code_cell
 import numpy as np
+from typeguard import TypeCheckError
 
 from grpc4bmi.bmi_client_singularity import SUPPORTED_APPTAINER_VERSIONS, SUPPORTED_SINGULARITY_VERSIONS, BmiClientSingularity, check_singularity_version_string
 from grpc4bmi.exceptions import ApptainerVersionException, DeadContainerException, SingularityVersionException
@@ -167,17 +168,17 @@ def test_with_config_inside_image(self, walrus_model_with_config_inside_image):
         assert len(model.get_value('Q', np.zeros(1,))) == 1
 
     def test_workdir_as_number(self):
-        with pytest.raises(TypeError, match='must be str'):
+        with pytest.raises(TypeCheckError, match='is not an instance of str'):
             BmiClientSingularity(image=IMAGE_NAME, work_dir=42)
 
     def test_inputdirs_as_str(self, tmp_path):
         some_dir = str(tmp_path)
-        with pytest.raises(TypeError, match='must be collections.abc.Iterable; got str instead'):
+        with pytest.raises(TypeError, match='must be collections.abc.Iterable'):
             BmiClientSingularity(image=IMAGE_NAME, input_dirs='old type', work_dir=some_dir)
 
     def test_inputdirs_as_number(self, tmp_path):
         some_dir = str(tmp_path)
-        with pytest.raises(TypeError, match='must be collections.abc.Iterable; got int instead'):
+        with pytest.raises(TypeCheckError, match='is not an instance of collections.abc.Iterable'):
             BmiClientSingularity(image=IMAGE_NAME, input_dirs=42, work_dir=some_dir)